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도 포함; 원자 f와 g에 대한 특수 코드; +/@: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"_도 포함; p와 q가 문자 목록일 때 특수 코드; J 6.02 릴리스 노트 참조 |
{/: |
dyad | {/:~도 포함; 스칼라 정수 좌 인자와 정수 또는 부동소수점 벡터 우 인자에 대한 특수 코드; J 6.03 릴리스 노트 참조 |
a=: c}x,y,:z |
- | 연결(catenation)과 적층(lamination)을 피함; c가 부울이고 a가 x 또는 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 | u가 u"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.중 하나.- 특수 코드는 부울, 정수, 부동소수점, 문자, 기호 인자에만 사용 가능.
f가e.가 아니면 특수 코드는 원자와 목록에만 사용됨.f가E.이면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"_도 포함; p와 q가 문자 목록일 때 특수 코드; J 6.02 릴리스 노트 참조 |
I.@:< |
dyad | 위의 f i.0: 항목 참조 |
+/%# — 다음에 대한 특수 코드:
| 표현 | 릴리스 |
|---|---|
(+/%#)/. |
J 6.02 |
(+/%#)\ |
J 5.03 |
(+/%#)"r |
J 6.02 |