J: 특수 코드

J: 특수 코드

J 언어에서 특정 인자에 대해 시간·공간을 절약하는 특수 코드(special code, Appendix B)를 설명해요. 인식되는 구(phrase)들과 통합 계급 지원을 다뤄요.

출처: 문서

본문

많은 원시형(primitives)은 일반 인자에는 없는 시간 및/또는 공간 절약을 위해 특정 인자에 대한 특수 코드를 포함해요. 게다가 일부 구는 "인식되어" 특수 코드로 지원돼요. 예를 들어, 훅 ($,)의 이항은 정확히 APL의 리셰이프(ρ로 표기)이며, 그 구현은 실제로 오른쪽 인자를 ravel하지 않아서 시간과 공간을 모두 절약해요:


   ts=: 6!:2 , 7!:2@]
   x=: 11 13 17 19 23
   y=: 29 7 23 11 19$'sesquipedalian'

   (x ($,) y) -: x $, y
1

   ts 'x ($,) y'
0.00773981 2.09818e6
   ts 'x $, y'
0.0170125 3.14662e6

이러한 특수 코드의 사례는 아래에 나열돼요:

경우 설명
= dyad 다음 동사들에 대한 부울 인자의 단어-병렬 연산: = < <. <: > >. >: +. +: * *. *: ^ ~: | !
<.@f both >.@f도 포함; 확장 정밀 정수에서 비-정수 중간 결과를 피함
<.@% dyad <.@:% >.@% >.@:%도 포함; 정수 인자에 대한 특수 코드; J6.02 릴리스 노트 참조
i.<./ monad i.>./i:<./i:>./도 포함; 정수·부동소수점 목록에 대한 특수 코드; J 5.04 릴리스 노트 참조
+ dyad *-도 포함; Windows에서 정수 인자에 대한 벡터-벡터, 벡터-스칼라, 스칼라-벡터 경우의 어셈블리 코드
^ dyad x가 실수이고 y가 정수이면 x^y는 반복 곱셈으로 동작
m&|@^ dyad 정수 인자에 대해 지수 연산을 피함
m&|@(n&^) monad 정수 인자에 대해 지수 연산을 피함
{&x^:a: monad 정수 목록 x에 대한 특수 코드; J 5.04 릴리스 노트 참조
{~^:a: dyad 특수 코드; J 5.04 릴리스 노트 참조
f@]^:g dyad 각 반복에서 x&(f@]) 대신 f를 적용; J 6.01 릴리스 노트 참조
| dyad 왼쪽 인자가 2의 양의 거듭제곱일 때 특수 코드; J 6.02 릴리스 노트 참조
+/ .* dyad +./ .*~:/ .*.도 포함; 일반 특수 코드; 부울 좌·우 인자 및 벡터 우 인자에 대한 특수 코드; J 5.04 및 J 6.01 릴리스 노트 참조
-/ .* monad 일반 특수 코드; 정사각 행렬에 대한 특수 코드; 2-by-2 행렬 배열에 대한 특수 코드; J 4.05 릴리스 노트 참조
$, dyad ($,)"r도 포함; {, {., }., e.,도 포함; ravel을 피함; J 4.06 릴리스 노트 참조
x=.x,y - =:도 포함; 제자리(in place); J 5.03 릴리스 노트 참조
;@:(<@u;.n) dyad 특수 코드; J 5.03 릴리스 노트 참조
;@:{ dyad 특수 코드; J 5.03 릴리스 노트 참조
[;.0 both ]도 포함; 벡터 또는 행렬 우 인자에 대한 특수 코드; J 5.01 릴리스 노트 참조
f;.1 both f;._1 f;.2 f;._2도 포함; 여러 동사에 대해 인자 셀 생성을 피함: < $ , # [ ] {. {: <@}. <@}:; <&}. <@:}. 등도 포함; J 4.05 릴리스 노트 참조
f;.1 both f;._1 f;.2 f;._2도 포함; 희소 부울 좌 인자에 대한 특수 코드; J 4.06 릴리스 노트 참조
f;.1 both f;._1 f;.2 f;._2도 포함; 각 잘라낸 부분에서 f의 결과가 박스되고 원자일 때 특수 코드; J 5.03 릴리스 노트 참조
f/;.1 both f;._1 f;.2 f;._2도 포함; 원자 동사 = < + +. * 등에 대한 특수 코드; J 5.03 릴리스 노트 참조
f;.3 both f;._3도 포함; 행렬 우 인자에 대한 특수 코드
;@:(<@u;.n) dyad 특수 코드; J 5.03 릴리스 노트 참조
# dyad 부울 좌 인자에 대한 특수 코드
#: dyad (0,d)#:y에 대한 특수 코드(여기서 d는 2의 양의 거듭제곱이고 y는 정수); J 6.02 릴리스 노트 참조
#: i.@(*/) monad (#: i.&(*/)) 등도 포함; 음이 아닌 정수 벡터에 대한 특수 코드; J 4.05 릴리스 노트 참조
x&(128!:3) monad 각 바이트에 대한 CRC 값 조회표를 미리 계산하는 특수 코드
=/"r monad < <: > >: +. +: * *. *: ~:도 포함; 부울 인자에 대한 단어-병렬 연산; 길이 2 축에 대한 삽입의 특수 코드도 포함; J 5.03 릴리스 노트 참조
+/ monad *-도 포함; Windows에서 정수 인자에 대한 어셈블리 코드
,/ monad ,.도 포함; ,&.> ,.&.>도 포함; 선형 시간; J 4.05 및 J 7.01 릴리스 노트 참조
m b./ both 비트별 부울 함수에 대한 특수 코드; J 5.01 릴리스 노트 참조
f/@, monad f/@:, f/&, f/&:도 포함; ravel을 피함; J 4.05 릴리스 노트 참조
f/@:g dyad [: f/ g도 포함; 원자 fg에 대한 특수 코드; +/@:g에 대한 추가 최적화; J 6.01 릴리스 노트 참조
#/. dyad 인자 셀 생성을 피함; J 5.03 릴리스 노트 참조
+//. monad +. *. = ~: <. <: >. >: 17 b. 22 b. 23 b.도 포함; 인자 셀 생성을 피함; J 6.01 릴리스 노트 참조
+//. dyad +. *. <. >. = ~: n b.를 다양한 벡터 우 인자에 대해 포함; 인자 셀 생성을 피함; J 5.03 및 J 6.02 릴리스 노트 참조
</. i.@# monad x</.i.#x도 포함; 특수 코드; J 5.03 릴리스 노트 참조
({.,#)/. dyad (#,{.)/.도 포함; 특수 코드; J 5.04 릴리스 노트 참조
(+/%#)/. dyad 인자 셀 생성을 피함; J 6.02 릴리스 노트 참조
+//.@(*/) dyad ~://.@(*./) ~://.@(+./) +//.@(*./) +//.@(+./) (22 b.)//.@(17 b./)도 포함; 인자 셀 생성을 피함; J 6.01 릴리스 노트 참조
/: both \:도 포함; 여러 데이터 타입에 대한 특수 코드; 항목이 5개 이하인 인자에 대한 특수 코드; J 4.05 릴리스 노트 참조
/: dyad 좌·우 인자가 같은 부울, 문자, 정수, 또는 부동소수점 벡터일 때 특수 코드; 좌·우 인자가 같은 부울, 문자, 정수, 또는 부동소수점 배열일 때 /\:"1에 대해서도; \:에도; J 5.01 릴리스 노트 참조
/:~ monad 부울, 문자, 정수, 또는 부동소수점 벡터에 대한 특수 코드; /:~"1/:~"1에 대해서도; \:에도; J 5.01 릴리스 노트 참조
/:@/: monad /@:/:/:&/: 등도 포함; 특수 코드; J 5.04 릴리스 노트 참조
{/: dyad {/:~도 포함; 스칼라 정수 좌 인자와 정수 또는 부동소수점 벡터 우 인자에 대한 특수 코드; J 6.03 릴리스 노트 참조
#\ monad 특수 코드; J 7.01 릴리스 노트 참조
=/\ monad +. *. ~:도 포함; 부울 인자에 대한 단어-병렬 연산
+/\ monad *-도 포함; Windows에서 정수 인자에 대한 어셈블리 코드
+/\ dyad <. >. +. *. = ~: m b.를 원자 m e. 17 22 23 25에 대해 포함; 양의 좌 인자와 부울·정수·부동소수점 우 인자에 대한 특수 코드; J 5.03 및 J 6.02 릴리스 노트 참조
[\ dyad ],도 포함; J 5.01 릴리스 노트 참조
2 f/\y dyad 특수 코드; J 4.06 및 J 6.01 릴리스 노트 참조
m b./\ monad 비트별 부울 함수에 대한 특수 코드; J 5.01 릴리스 노트 참조
(+/%#)\ dyad 양의 좌 인자와 정수·부동소수점 우 인자에 대한 특수 코드; J 5.03 릴리스 노트 참조
#\. monad 특수 코드; J 7.01 릴리스 노트 참조
u/\. monad 특수 코드
=/\. monad < <: > >: +. +: * *. *: ~:도 포함; 부울 인자에 대한 단어-병렬 연산
+/\. monad *-도 포함; Windows에서 정수 인자에 대한 어셈블리 코드
m b./\. monad 비트별 부울 함수에 대한 특수 코드; J 5.01 릴리스 노트 참조
f/\. dyad 원자 결합적(associative) f에 대한 특수 코드; J 6.02 릴리스 노트 참조
{ dyad 여러 데이터 타입의 우 인자에 대한 특수 코드; 정수 좌 인자에 대한 특수 코드; 처음 두 축 인덱싱에 대한 특수 코드
<"1@[ { ] dyad 좌 인자가 정수 배열이면 (backtick)<"1`을 피함
p{~q i.] monad (q i.]) { p"_q&i.{p"_도 포함; pq가 문자 목록일 때 특수 코드; J 6.02 릴리스 노트 참조
{/: dyad {/:~도 포함; 스칼라 정수 좌 인자와 정수 또는 부동소수점 벡터 우 인자에 대한 특수 코드; J 6.03 릴리스 노트 참조
a=: c}x,y,:z - 연결(catenation)과 적층(lamination)을 피함; c가 부울이고 ax 또는 y이면 제자리; J 4.05 릴리스 노트 참조
y=: x i}y - 제자리
y=: y i}~ x - 제자리; J 6.03 릴리스 노트 참조
f"r both 많은 동사가 통합 계급(rank) 지원을 가짐

통합 계급 지원이 있는 동사들:

경우 동사
monad 및 dyad <. <: < >. >: + +. +: * *. *: - -: % ^ ~: | |. |: , ,: ! /: \: [ ] {. }. o.
monad only -. %: ^. #. ,. / \ \\. {: }: @. ? A. H. j. p. p: q: r. t. x: /:@/: +/%#
dyad only = > $ # { e. i. i: $, m b. -.@-:

(+/%#)"r에 대해서는 J 6.02 릴리스 노트를 참조하세요.

경우 설명
^@o. monad 특수 코드; J 7.01 릴리스 노트 참조
".\"0@": monad @ 대신 @: 또는 & 또는 &:도 포함; 특수 코드; J 6.01 릴리스 노트 참조
f0\...`[email protected]"0` monad f0, ..., fn이 원자이면 특수 코드; J 5.02 릴리스 노트 참조
x&(128!:3) monad 각 바이트에 대한 CRC 값 조회표를 미리 계산하는 특수 코드
m&i. monad m&i: -.&m e.&m도 포함; J 5.04 릴리스 노트 참조
u&.(a.&i.) monad uu"0와 같으면 특수 코드; J 6.02 릴리스 노트 참조
m b./&.(a.&i.) monad 정수로의 변환과 그 역을 피함; J 6.02 릴리스 노트 참조
m b.&.(a.&i.) dyad 정수로의 변환과 그 역을 피함; J 6.02 릴리스 노트 참조
? monad ?.도 포함; 인자가 정확히 2이면 특수 코드
?@$ dyad ?.도 포함; ?@#도 포함; [: ? $도 포함; 특수 코드; J 5.03 릴리스 노트 참조
e.i.0: dyad 아래의 f i.0: 항목 참조
E. monad 부울·문자 벡터 인자에 대한 특수 코드
E.i.1: dyad 아래의 f i.0: 항목 참조
i. monad i:도 포함; 길이-1 인자에 대한 특수 경우
i. dyad e.i:도 포함; 여러 데이터 타입에 대한 특수 코드; i.!.0에 대한 특수 코드; 단항 i.~ 또는 x i. x에 대한 특수 코드; 동일한 열이 많은 인자에 대한 특수 코드; J 4.05 릴리스 노트 참조

f i.0: — 다음 함수들에 대한 특수 코드(J 5.01, J 5.03, J 5.04 릴리스 노트 참조):

표현 동등 표현 의미
f i. 0: i.&0@:f x f y가 거짓인 첫 번째 위치
f i. 1: i.&1@:f x f y가 참인 첫 번째 위치
f i: 0: i:&0@:f x f y가 거짓인 마지막 위치
f i: 1: i:&1@:f x f y가 참인 마지막 위치
[: + / f + /@:f x f y가 참인 위치의 수
[: +./ f +./@:f x f y가 어디선가 참?
[: *./ f *./@:f x f y가 모든 곳에서 참?
[: I. f I. @:f x f y가 참인 인덱스들

참고:

  • f는 동사 = ~: < <: > >: E. e. 중 하나.
  • 특수 코드는 부울, 정수, 부동소수점, 문자, 기호 인자에만 사용 가능.
  • fe.가 아니면 특수 코드는 원자와 목록에만 사용됨.
  • fE.이면 E.i.1: +/@:E. +./@:E. I.@:E.에 대해서만 특수 코드.
경우 설명
i.<./ monad i.>./i:<./i:>./도 포함; 정수·부동소수점 목록에 대한 특수 코드; J 5.04 릴리스 노트 참조
m&i. monad m&i: -.&m e.&m도 포함; J 5.04 릴리스 노트 참조
p {~ q i. ] monad (q i. ]) { p"_q&i. { p"_도 포함; pq가 문자 목록일 때 특수 코드; J 6.02 릴리스 노트 참조
I.@:< dyad 위의 f i.0: 항목 참조

+/%# — 다음에 대한 특수 코드:

표현 릴리스
(+/%#)/. J 6.02
(+/%#)\ J 5.03
(+/%#)"r J 6.02

더 알아보기 (Learn more)

출처: Appendix B. Special Code