직접함수
Direct function직접 함수(dfn, "dee fun"으로 발음)는 프로그래밍 언어 APL에서 함수 및 연산자(고차 함수)를 정의하는 대안이다.직접 연산자는 도프(dee op)라고도 할 수 있다.그것들은 1996년에 존 스콜스에 의해 발명되었다.[1]그것들은 배열 프로그래밍, 고차 함수, 기능 프로그래밍의 독특한 조합으로, 이전 버전에 비해 21세기 초 APL의 주요한 발전이다.
dfn은 그 사이에 있을 법한 경계표현(또는 그저 경계표현)의 연속이다.{
그리고}
,에 의해 분리됨⋄
또는 새로운 라인, 여기서⍺
왼쪽의 주장을 나타내며⍵
오른쪽, 그리고∇
재귀(기능 자체 참조)를 나타낸다.예를 들어, 함수PT
의 각 행을 테스트한다.⍵
피타고라스 세 쌍둥이다(제곱의 합이 최대 제곱의 두 배가 되는지 시험함).
PT← {(+/⍵*2)=2×(⌈/⍵)*2} PT 3 4 5 1 x 4 5 3 3 11 6 5 13 12 17 16 8 11 12 4 17 15 8 PT x 1 0 1 0 0 1
dfn으로서의 요인 함수:
사실의← {0=⍵:1 ⋄ ⍵×∇ ⍵-1} 사실의 5 120 사실의¨ ⍳10 ③ 0~9의 각 요소에 적용되는 사실 1 1 2 6 24 120 720 5040 40320 362880
설명
dfns 규칙은 다음과 같은 "참조 카드"[2]로 요약된다.
{⍺ function ⍵} | {⍺⍺ operator ⍵⍵} | : 보초를 서다 |
⍺ 좌변론 | ⍺⍺ 레프트 피연산자 | :: 오류 방지 |
⍵ 올바른 주장 | ⍵⍵ 우측 피연산자 | ⍺← 디폴트 좌변론 |
∇ 자기참조 | ∇∇ 자기참조 | s← 수줍은 결과 |
dfn은 그 사이에 있을 법한 경계표현(또는 그저 경계표현)의 연속이다.{
그리고}
,에 의해 분리됨⋄
또는 새로운 라인.
표현 보초를 서다: 표현 보초를 서다:
표현식 및/또는 가드를 순서대로 평가한다.가드는 0 또는 1까지 평가해야 하며, 관련 표현은 값이 1이면 평가된다. dfn은 할당되지 않은 첫 번째 보호되지 않은 표현 또는 가드가 1로 평가한 첫 번째 보호되지 않은 표현 이후 또는 더 이상 표현이 없을 경우 종료된다.dfn의 결과는 마지막 평가된 식이다.마지막으로 평가된 식이 할당으로 끝나면 세션에 자동으로 표시되지 않는 "shy" 결과가 된다.
dfn에 할당된 이름은 기본적으로 어휘 범위와 함께 로컬이다.
⍺
왼쪽 함수 인수를 나타내며⍵
권리;⍺⍺
왼쪽 피연산자를 나타내며⍵⍵
오른쪽의만약⍵⍵
정의에서 발생하며, dfn은 dyadi 연산자(만일 경우)이다.⍺⍺
발생하지만 발생하지는 않다⍵⍵
, 그리고 그것은 단조로운 연산자 입니다; 만약 둘 다 아니라면.⍺⍺
또는⍵⍵
dfn은 함수다.
특수 구문⍺←expression
dfn을 단수적으로, 즉 왼쪽 인수 없이 호출할 경우 왼쪽 인수에 기본값을 부여하는 데 사용된다.그⍺←expression
달리 평가되지 않는다.
∇
함수에 의한 재귀 또는 자가 참조를 나타냄∇∇
운영자에 의한 자기 참조를 나타낸다.그러한 폄훼는 익명의 재발을 허용한다.
오류 방지 장치를 통해 오류 트래핑이 제공되며,errnums::expression
. 에러가 발생하면 시스템은 호출 기능을 통해 동적으로 에러와 일치하는 에러 가드를 검색한다.1개가 발견되면 오류지킴이 실행 직전 실행환경이 그 상태로 풀리고, 오류지킴이의 관련 표현은 dfn의 결과로 평가된다.
dfns에 대한 추가 설명, 설명 및 자습서는 인용 기사에서 확인할 수 있다.[3][4][5][6][7]
예
여기서의 예는 dfns의 다른 측면을 예시한다.인용된 글에서 추가적인 예를 찾아볼 수 있다.[8][9][10]
기본 왼쪽 인수
함수{⍺+0j1×⍵}
덧붙이다⍺
로0j1
(i 또는 √-1)번⍵
.
3 {⍺+0j1×⍵} 4 3J4 ∘.{⍺+0j1×⍵}⍨ ¯2+⍳5 2J'2 2J"1 ¯2 2J1 2J2 1J2 1J1 ¯1 1J1 1J2 0J'2 0J'1 0 0J1 0J2 1J'2 1J'1 1 1J1 1J2 2J'2 2J'1 2 2J1 2J2
이 기능의 중요성은 다음과 같이 볼 수 있다.
복잡한 숫자는 순서가 지정된 실수 쌍으로 구성될 수 있으며, 순서가 지정된 정수 쌍으로 순서가 지정된 자연수 쌍과 합리적인 정수 쌍으로 정수를 구성할 수 있는 방법과 유사하다.복잡한 숫자의 경우,
{⍺+0j1×⍵}
와 같은 역할을 하다-
그리고÷
합리적으로[11]: §8
게다가, 그 모나디치와 유사하게-⍵
⇔0-⍵
(negate)와 단음이의÷⍵
⇔1÷⍵
(iii), 함수의 단일 정의는 유용하며, 기본값 0을 지정함으로써 영향을 받는다.⍺
: ifj←{⍺←0 ⋄ ⍺+0j1×⍵}
, 그러면.j ⍵
⇔0 j ⍵
⇔0+0j1×⍵
.
j←{⍺←0 ⋄ ⍺+0j1×⍵} 3 j 4 ¯5.6 7.89 3J4 3J'5.6 3J7.89 j 4 ¯5.6 7.89 0J4 0J'5.6 0J7.89 죄를 짓다← 1∘○ cas← 2∘○ 오일러← {(*j ⍵) = (cas ⍵) j (죄를 짓다 ⍵)} 오일러 (¯0.5+?10⍴0) j (¯0.5+?10⍴0) 1 1 1 1 1 1 1 1 1 1
마지막 표현식은 오일러의 공식을 실제와 가상의 부분이 있는 의 - 0.5 0.5 의 구간에서 보여준다
단일 재귀
칸토어 세트의 3차 시공은 [0,1] 간격으로 시작되며, 각 단계에서 나머지 각 하위 절에서 중간 1/3을 제거한다.
캔터 오더 세트⍵
dfn으로 정의됨:[11]: §2.5
칸토어← {0=⍵:,1 ⋄ ,1 0 1 ∘.∧ ∇ ⍵-1} 칸토어 0 1 칸토어 1 1 0 1 칸토어 2 1 0 1 0 0 0 1 0 1 칸토어 3 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1
검은색 막대로 표시된 칸토어 0 ~ 칸토어 6:
함수sieve ⍵
길이의 비트 벡터를 계산하다.⍵
그까짓 것i
(용)0≤i
그리고i<⍵
)은 if와 if에만 1이다.i
전성기다.[10]: §46
체에 밭다←{ 4≥⍵:⍵⍴0 0 1 1 r←⌊0.5*⍨n←⍵ p←2 3 5 7 11 13 17 19 23 29 31 37 41 43 p←(1+(n≤×⍀p)⍳1)↑p b← 0@1 ⊃ {(m⍴⍵)>m⍴⍺↑1 ⊣ m←n⌊⍺×≢⍵}⌿ ⊖1,p {r<q←b⍳1:b⊣b[⍵]←1 ⋄ b[q,q×⍸b↑⍨⌈n÷q]←0 ⋄ ∇ ⍵,q}p } 10 10 ⍴ 체에 밭다 100 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 b←체에 밭다 1e9 ≢b 1000000000 (10*⍳10) (+⌿↑)⍤0 1 ⊢b 0 4 25 168 1229 9592 78498 664579 5761455 50847534
마지막 순서, 즉 10보다 적은 primimes의 수는 OEIS: A006880의 초기 부분이다.마지막 수인 50847534는 9 보다 작은 소수점 에서 "( (9) = {\의 잘못된 값이 잘못 주어진 잘못된 이름이라고 외울 정도로 베르텔센의 번호로 불린다.[12]
sieve
두 가지 다른 방법을 사용하여 합성물을 0초로 표시하며, 둘 다 로컬 익명 dfns를 사용하여 영향을 받는다.첫 번째 방법은 삽입 연산자를 사용하여 초기 마스크 1과 프리임의 접두사 2 3...43에 에라토스테네스의 체를 사용한다.⌿
(오른쪽 접기).(접두사의 길이는 원시 함수와 비교하여 얻음 ×⍀p
.) 두번째는 가장 작은 새로운 전성기를 찾는다.q
에 남아 있는.b
(q←b⍳1
)) 및 0비트로 설정q
그 자체와 에 대한 비난.q
초기 세그먼트에서 남은 1비트의 숫자에 곱하기b
(⍸b↑⍨⌈n÷q
이 두 번째 dfn은 꼬리 재귀법을 사용한다.
꼬리재순환
일반적으로 요인 함수는 (위와 같이) 반복적으로 정의되지만, 축전지 왼쪽 인수를 사용하여 꼬리 재귀를 이용하도록 코드화할 수 있다.[13]
면←{⍺←1 ⋄ ⍵=0:⍺ ⋄ (⍺×⍵) ∇ ⍵-1}
마찬가지로 가우스 제거를 사용한 사각형 복합 행렬의 결정 인수는 꼬리 재귀로 계산할 수 있다.[14]
퇴장시키다←{ ∘제곱형 복합행렬 결정요인 ⍺←1 ∘그동안의 공동계산계수 산출물 0=≢⍵:⍺ ⍝ 0 by 0에 대한 결과 (i j)←(⍴⍵)⊤⊃⍒ ,⍵ ③ 최대요소의 행 및 열지수 k←⍳≢⍵ (⍺×⍵[i;j]ׯ1*i+j) ∇ ⍵[k~i;k~j] - ⍵[k~i;j] ∘.× ⍵[i;k~j]÷⍵[i;j] }
다중 재귀
음수가 아닌 정수 의 파티션은 다음과 같은 양의 정수의 v v이다.n = +⌿v
의 순서가 유의하지 않은 경우.예를 들어,2 2
그리고2 1 1
4의 칸막이가 있고2 1 1
그리고1 2 1
그리고1 1 2
동일한 파티션으로 간주된다.
파티션 함수 ) 이(가) 파티션 수를 카운트한다.이 함수는 오일러, 하디, 라마누잔, 에르드스 등이 연구한 수 이론에 관심이 있다.재발관계
오일러의 오각형 숫자 정리로부터 파생되었다.[15]dfn으로 작성됨:[10]: §16
pn ← {1≥⍵:0≤⍵ ⋄ -⌿+⌿∇¨읊다 ⍵} 읊다 ← {⍵ - (÷∘2 (×⍤1) ¯1 1 ∘.+ 3∘×) 1+⍳⌈0.5*⍨⍵×2÷3} pn 10 42 pn¨ ⍳13 ⍝ OEIS A000041 1 1 2 3 5 7 11 15 22 30 42 56 77
기본 단계1≥⍵:0≤⍵
라고 진술하다.1≥⍵
, 함수의 결과는0≤⍵
, 1 만약 0이 0 또는 1 그리고 그렇지 않으면 0이다.재귀 단계는 고도로 곱하기 재귀적이다.예를 들어,pn 200
함수가 의 각 요소에 적용되는 결과를 초래할 것이다.rec 200
, 즉:
읊다 200 199 195 188 178 165 149 130 108 83 55 24 ¯10 198 193 185 174 160 143 123 100 74 45 13 ¯22
그리고pn 200
계산하는 데 우주의 나이보다 더 긴 시간이 필요하다.× 47 함수 호출).[10]: §16 여기서 다이렉트 오퍼레이터(고차 함수)로 구현되는 메모화를 통해 컴퓨팅 시간을 줄일 수 있다.M
:
M←{ f←⍺⍺ i←2+'⋄'⍳⍨t←2↓,⎕cr 'f' ⍎'{T←(1+2)⍵'1',(i↑t),''1≢T[⍵]:⊃T[⍵] ⋄T[⍵]←'',(i↓t),'⍵}⍵' } pn M 200 3.973E12 0 ⍕ pn M 200 ⍝ 소수점 0자리 형식 3972999029388
이 값pn M 200
1918년에 하디와 라마누잔이 계산한 것에 동의한다.[16]
메모 연산자M
그 피연산자 함수의 변형을 규정하다.⍺⍺
캐시를 사용하다 T
그리고 나서 평가한다.피연산자와 함께pn
변종:
{T←(1+⍵)⍴¯1 ⋄ {1≥⍵:0≤⍵ ⋄ ¯1≢T[⍵]:⊃T[⍵] ⋄ ⊃T[⍵]←⊂-⌿+⌿∇¨읊다 ⍵}⍵}
직접 연산자(dop)
배열 퀵소트⍵
주요 셀 중에서 임의로 "pivot"을 선택한 다음, 피벗 앞에 엄밀하게 정렬된 주요 셀, 피벗과 동등한 주요 셀, 피벗을 엄격히 따르는 정렬된 주요 셀을 비교 함수에 의해 결정되는 대로 포인터화하여 작업한다.⍺⍺
. 직접 연산자로 정의됨(dop)Q
:
Q←{1≥≢⍵:⍵ ⋄ (∇ ⍵⌿⍨0>s)⍪(⍵⌿⍨0=s)⍪∇ ⍵⌿⍨0<s←⍵ ⍺⍺ ⍵⌷⍨?≢⍵} ⍝ 선행 ⍝ 후 ⍝ 동등 follows 2 (×-) 8 8 (×-) 2 8 (×-) 8 ¯1 1 0 x← 2 19 3 8 3 6 9 4 19 7 0 10 15 14 (×-) Q x 0 2 3 3 4 6 7 8 9 10 14 15 19 19
Q3
함수에 둘러싸인 세 부분을 포획하는 변종이다.⊂
부품대신각 재귀 단계에서 생성되는 세 개의 부품은 최종 결과의 구조에서 명백하다.에서 파생된 함수를 적용Q3
피벗이 무작위로 선택되기 때문에 동일한 인수에 여러 번 다른 결과를 제공한다.결과의 순서 내 통과는 동일한 정렬된 배열을 산출한다.
3분기←{1≥≢⍵:⍵ ⋄ (⊂∇ ⍵⌿⍨0>s)⍪(⊂⍵⌿⍨0=s)⍪⊂∇ ⍵⌿⍨0<s←⍵ ⍺⍺ ⍵⌷⍨?≢⍵} (×-) 3분기 x ┌────────────────────────────────────────────┬─────┬┐ │┌──────────────┬─┬─────────────────────────┐│19 19││ ││┌──────┬───┬─┐│6│┌──────┬─┬──────────────┐││ ││ │││┌┬─┬─┐│3 3│4││ ││┌┬─┬─┐│9│┌┬──┬────────┐│││ ││ │││││0│2││ │ ││ ││││7│8││ │││10│┌──┬──┬┐││││ ││ │││└┴─┴─┘│ │ ││ ││└┴─┴─┘│ │││ ││14│15││││││ ││ ││└──────┴───┴─┘│ ││ │ │││ │└──┴──┴┘││││ ││ ││ │ ││ │ │└┴──┴────────┘│││ ││ ││ │ │└──────┴─┴──────────────┘││ ││ │└──────────────┴─┴─────────────────────────┘│ ││ └────────────────────────────────────────────┴─────┴┘ (×-) 3분기 x ┌───────────────────────────┬─┬─────────────────────────────┐ │┌┬─┬──────────────────────┐│7│┌────────────────────┬─────┬┐│ │││0│┌┬─┬─────────────────┐││ ││┌──────┬──┬────────┐│19 19│││ │││ │││2│┌────────────┬─┬┐│││ │││┌┬─┬─┐│10│┌──┬──┬┐││ │││ │││ │││ ││┌───────┬─┬┐│6│││││ │││││8│9││ ││14│15││││ │││ │││ │││ │││┌┬───┬┐│4│││ │││││ │││└┴─┴─┘│ │└──┴──┴┘││ │││ │││ │││ │││││3 3│││ │││ │││││ ││└──────┴──┴────────┘│ │││ │││ │││ │││└┴───┴┘│ │││ │││││ │└────────────────────┴─────┴┘│ │││ │││ ││└───────┴─┴┘│ │││││ │ │ │││ │││ │└────────────┴─┴┘│││ │ │ │││ │└┴─┴─────────────────┘││ │ │ │└┴─┴──────────────────────┘│ │ │ └───────────────────────────┴─┴─────────────────────────────┘
위의 공식은 새로운 것이 아니다. 예를 들어 고전적인 "컴퓨터 알고리즘의 설계 및 분석"의 그림 3.7을 참조하라.[17]그러나, 그림 3.7의 pidginALGOL 프로그램과 달리,Q
실행가능하며, 정렬에 사용되는 부분 순서는 피연산자,(×-)
상기의 [9]예
운영자 및 열차를 포함한 Dfns
Dfns, 특히 익명의 dfns는 운영자 및 열차와 잘 통한다.다음 조각은 "Programming Pearl" 퍼즐을 푼다:[18] 영어 단어의 사전이 주어지며, 여기서 문자 매트릭스로 표현된다.a
모든 아나그램 세트를 찾아라.
a {⍵[⍋⍵]}⍤1 ⊢a ({⍵[⍋⍵]}⍤1 {⊂⍵}⌸ ⊢) a 쓰다듬다 apst ┌────┬────┬────┐ 침을 뱉다 apst │쓰다듬다│차│별을 뜨다│ 차 미적 │침을 뱉다│씨를 뿌리다│ │ 씨를 뿌리다 미적 │톡톡 두드리다│에타스│ │ 톡톡 두드리다 apst │과거의│좌석에 앉다│ │ 에타스 미적 │ │먹다│ │ 과거의 apst │ │타이스│ │ 좌석에 앉다 미적 │ │동쪽의│ │ 먹다 미적 │ │세타│ │ 타이스 미적 └────┴────┴────┘ 별을 뜨다 arst 동쪽의 미적 세타 미적
알고리즘은 행을 개별적으로 정렬하여 작동한다.{⍵[⍋⍵]}⍤1 ⊢a
)) 및 이러한 정렬된 행은 키 오퍼레이터에게 키("프로그래밍 진주 설명에 서명")로 사용된다.⌸
행렬의 행을 그룹화하십시오.[9]: §3.3 오른쪽의 표현은 열차, 즉 APL이 암묵적 프로그래밍을 달성하기 위해 채용한 통사적 형식이다.여기서는 다음과 같은 세 가지 기능의 고립된 순서다.(f g h) ⍵
⇔(f ⍵) g (h ⍵)
, 오른쪽의 표현이 다음과 같을 때({⍵[⍋⍵]}⍤1 ⊢a) {⊂⍵}⌸ a
.
어휘 범위
내부(내부) dfn이 이름을 지칭할 경우, 콜 스택 아래가 아니라 동봉된 dfns를 통해 바깥쪽을 보는 방식으로 추구한다.이 정권은 APL의 통상적인 동적 범위 대신 어휘적 범위를 채택한다고 한다.그 구별은 외부 수준에서 정의된 함수에 대한 호출을 하는 경우에만 명백해진다.통상적인 내부 요구로 볼 때 두 정권은 분간할 수 없다.[19]: p.137
예를 들어, 다음 기능에서which
, 변수ty
양쪽에 모두 정의됨which
그 자체와 내적 기능에 있어서.f1
. 언제f1
에게 외향적인 전화.f2
그리고f2
에 언급하다ty
, 그것은 외부를 찾는다 (가치있는)'lexical'
에서 정의한 것이 아닌f1
(가치 있는)'dynamic'
):
어떤 것←{ ty←'속어적' f1←{ty←'dynamic' ⋄ f2 ⍵} f2←{ty,⍵} f1 ⍵ } 어떤 것 '범위' 어휘상의 범위
에러 가드
다음 기능은 오류 가드의 사용을 예시한다.[19]: p.139
더하기←{ tx←'모두 표시' ⋄ 0::tx tx←'도메인' ⋄ 11::tx tx←'길이' ⋄ 5::tx ⍺+⍵ } 2 더하기 3 오류 없음 5 2 3 4 5 더하기 '3' ⍝ 논쟁 길이가 일치하지 않음 길이 2 3 4 5 더하기 '4' ⍝ 문자를 추가할 수 없음 도메인 2 3 더하기 3 4⍴5 ⍝ 행렬에 벡터를 추가할 수 없음 잡히다 전부
APL에서 오류 번호 5는 "길이 오류"이고, 오류 번호 11은 "도메인 오류"이며, 오류 번호 0은 오류 번호 1에서 999까지의 "catch all"이다.
이 예는 오류 보호자의 식을 평가하기 전에 로컬 환경을 해제한 경우를 보여준다.로컬 이름tx
다음과 같은 오류 보호의 청사진에 대해 설명하도록 설정된다.오류가 발생하면 환경이 노출되지 않음tx
의 정전기적 올바른 값
Dfns 대 Tradfns
직접 함수는 dfns이므로 전통적인 방식으로 정의한 APL 함수를 tradfns라고 하며, "전통적인 재미"라고 발음한다.여기서 dfns와 tradfns는 함수를 고려하여 비교한다.sieve
: 왼쪽은 dfn(위에서 정의한 바와 같이)이고, 중간은 제어구조를 이용한 tradfn이며, 오른쪽은 gotos를 이용한 tradfn이다.→
) 및 선 레이블.
체에 밭다←{ 4≥⍵:⍵⍴0 0 1 1 r←⌊0.5*⍨n←⍵ p←2 3 5 7 11 13 17 19 23 29 31 37 41 43 p←(1+(n≤×⍀p)⍳1)↑p b← 0@1 ⊃ {(m⍴⍵)>m⍴⍺↑1 ⊣ m←n⌊⍺×≢⍵}⌿ ⊖1,p {r<q←b⍳1:b⊣b[⍵]←1 ⋄ b[q,q×⍸b↑⍨⌈n÷q]←0 ⋄ ∇ ⍵,q}p } | ∇ b←체1 n;i;m;p;q;r :만약 4≥n ⋄ b←n⍴0 0 1 1 ⋄ :반품 ⋄ :EndIf r←⌊0.5*⍨n p←2 3 5 7 11 13 17 19 23 29 31 37 41 43 p←(1+(n≤×⍀p)⍳1)↑p b←1 :을 위해 q :인 p ⋄ b←(m⍴b)>m⍴q↑1 ⊣ m←n⌊q×≢b ⋄ :EndFor b[1]←0 :동안 r≥q←b⍳1 ⋄ b[q,q×⍸b↑⍨⌈n÷q]←0 ⋄ p⍪←q ⋄ :EndWhile b[p]←1 ∇ | ∇ b←체2 n;i;m;p;q;r →L10 ⍴⍨ 4<n ⋄ b←n⍴0 0 1 1 ⋄ →0 L10: r←⌊0.5*⍨n p←2 3 5 7 11 13 17 19 23 29 31 37 41 43 p←(1+(n≤×\p)⍳1)↑p i←0 ⋄ b←1 L20: b←(m⍴b)>m⍴p[i]↑1 ⊣ m←n⌊p[i]×≢b →L20 ⍴⍨ (≢p)>i←1+i b[1]←0 L30: →L40 ⍴⍨ r<q←b⍳1 ⋄ b[q,q×⍸b↑⍨⌈n÷q]←0 ⋄ p⍪←q ⋄ →L30 L40: b[p]←1 ∇ |
- dfn은 익명일 수 있고, tradfn은 이름을 붙여야 한다.
- dfn은 할당에 의해 이름 지어진다.
←
); tradfn은 함수의 표현에 이름을 내장하고 적용함으로써 명명된다.⎕fx
(시스템 기능)을 해당 표현에 적용. - dfn은 피연산자로서 tradfn보다 더 다루기 쉽다(앞의 항목 참조: tradfn은 반드시 명명되어야 한다; tradfn은 내장된 ...로 명명되어야 한다).
- dfn에 할당된 이름은 기본적으로 로컬이며, tradfn에 할당된 이름은 로컬 목록에 지정되지 않는 한 전역적이다.
- dfn에 있는 현지인들은 어휘 범위를 가지고 있다; tradfn에 있는 현지인들은 그들의 현지인 목록에 의해 그림자처럼 보이지 않는 한 호출된 기능으로 보이는 동적 범위를 가지고 있다.
- dfn의 인수는 명명된다.
⍺
그리고⍵
그리고 도프의 피연산자는 이름이 지어졌다.⍺⍺
그리고⍵⍵
; tradfn의 인수와 피연산자는 그 선행선에 지정된 어떤 이름이라도 가질 수 있다. - dfn의 결과(있는 경우)는 이름이 없으며, tradfn의 결과(있는 경우)는 머리글에 이름이 지정된다.
- ⍺의 기본값은 tradfn의 왼쪽 인수보다 더 깔끔하게 지정된다.
- dfn에서의 재귀는 호출에 의해 영향을 받는다.
∇
또는∇∇
또는 그 이름; tradfn의 재귀는 그 이름을 호출하여 영향을 받는다. - dfn의 흐름 제어는 가드 및 함수 호출에 의해 영향을 받는다. tradfn의 흐름 제어는 제어 구조에 의해 영향을 받는다.
→
(goto) 및 라인 라벨. - 할당으로 끝나지 않는 dfn에서 식을 평가하면 dfn에서 반환이 발생하며, 할당으로 끝나지 않는 tradfn 또는 goto에서 행을 평가하면 선의 결과가 표시된다.
- dfn은 할당으로 끝나지 않는 표현식 평가, 보호되는 표현식 평가 또는 마지막 표현식 후에 반환된다. tradfn은 다음에 반환된다.
→
(goto) 0 또는 존재하지 않는 라인 또는 평가 시:Return
제어 구조 또는 마지막 줄 이후 - dfn의 흐름 제어는 tradfn보다 꼬리 재귀 탐지와 구현이 용이하다.
- dfn은 tradfn을 호출할 수 있으며, 그 반대의 경우도 tradfn에 정의될 수 있다.
역사
케네스 E. APL의 창시자인 아이버슨은 사용자 기능(전통)이 정의되는 방식에 불만족스러워했다.1974년에 그는 박람회에 사용하기 위해 "공식 함수 정의" 또는 "직접 정의"를 고안했다.[20]직접 정의는 콜론으로 구분되는 두 개 또는 네 개의 부분을 가진다.
이름을 붙이다 : 표현 이름을 붙이다 : 표현0 : 명제 : 표현1
직접적인 정의로 볼 때론⍺
왼쪽의 주장을 나타내며⍵
옳은 주장첫째로, 그 결과는expression
함수의 결과로서, 두 번째 경우에는 함수의 결과가expression0
만일proposition
0으로 평가하거나expression1
1로 평가되면.직접 정의 내의 할당은 동적으로 로컬이다.직접 정의를 사용하는 예는 1979년 튜링 어워드 강연회와[21] 도서 및 신청서 등에서 찾아볼 수 있다.[22][23][24][25][9]
직접 정의는 대형 시스템에서 사용하기에는 너무 제한적이었다.그 아이디어들은 여러 작품에서[26]: §8 [27][28]: §4.17 [29][30][31][32] 여러 저자들에 의해 더욱 발전되었지만 그 결과는 다루기 힘들었다.이 중 1987년[31] 분다의 "대체 APL 함수 정의"는 현재 설비에 가장 근접했지만, 기존 기호와의 충돌과 오류 처리에서 결함이 있어 실제적인 어려움을 야기했을 것이며, 실행되지 않았다.다른 제안에서 주요 증류된 내용은 ⑴ 정의되는 함수는 익명으로, (필요한 경우) 배정에 의해 후속 명명(필요한 경우)이 발효된다. ⑵ 함수는 기호로 표시되므로 익명 재귀가 가능하다.[9]
1996년 다이알로그 리미티드사의 존 스콜스는 직접 기능(dfns)을 발명했다.[1][6][7]아이디어는 1989년 그가 기능 프로그래밍에 관한 컴퓨터 저널의 특별호를 읽었을 때 시작되었다.[33]그리고 나서 그는 기능성 프로그래밍을 공부하기 시작했고 이러한 아이디어를 APL에 가져오도록 강한 동기부여("욕망에 찌든")가 되었다.[6][7]그는 처음에는 그 변화가 너무 급진적이고 언어의 불필요한 복잡성으로 판단될 수 있다는 우려 때문에 스텔스 방식으로 운영했다; 다른 관측통들은 그가 Dynalog 동료들이 그렇게 흥분하지 않았고 시간을 낭비하고 있다고 생각했기 때문에 그가 스텔스 방식으로 운영했다고 말한다.Dfns는 APL '96 컨퍼런스에서 디알로그 벤더 포럼에서 처음 발표되었으며 1997년 초 디알로그 APL에서 발표되었다.[1]인정과 인정은 오는 것이 더디었다.2008년 늦었지만, 디알로그 리미티드 25주년을 기념하는 출판물인 [34]디알로그에서는 dfns가 거의 언급되지 않았다(두 번이나 "동적 기능"으로 언급되고, 자세한 내용은 언급하지 않았다).2019년 현재, dfns는 Dynalog APL,[19] NARS2000,[35] ngn/apl에 구현되어 있다.[36]그들은 또한 그래픽 처리 장치(GPU)의 컴퓨팅 능력을 이용하기 위한 노력에서 핵심적인 역할을 한다.[37][9]
참조
- ^ a b c Scholes, John (October 1996). "Direct Functions in Dyalog APL" (PDF). Vector. 13 (2). Retrieved 16 September 2019.
- ^ Scholes, John (1998–2019), Direct Functions Reference Card, retrieved 26 September 2019
- ^ Scholes, John (April 2001). "D: A Functional Subset of Dyalog APL". Vector. 17 (4). Retrieved 21 September 2019.
- ^ Scholes, John (13 September 2009). Introduction to D-functions: 1 of 2 (video). Dyalog '09 User Conference. Retrieved 21 September 2019.
- ^ Scholes, John (13 September 2009). Introduction to D-functions: 2 of 2 (video). Dyalog '09 User Conference. Retrieved 21 September 2019.
- ^ a b c Scholes, John (31 October 2018). Dfns—Past, Present and Future (video). Dyalog '18 User Meeting. Retrieved 21 September 2019.
- ^ a b c Scholes, John (31 October 2018), Dfns—Past, Present and Future (text) (PDF), Dyalog '18 User Meeting, retrieved 21 September 2019
- ^ Scholes, John (1998–2019), Direct Functions Workspace, retrieved 2019-09-15
- ^ a b c d e f Hui, Roger; Kromberg, Morten (June 2020). "APL Since 1978". Proceedings of the ACM on Programming Languages. 4 (HOPL): 1–108. doi:10.1145/3386319. S2CID 218517570.
- ^ a b c d Hui, Roger (27 November 2016), A History of APL in 50 Functions, retrieved 17 September 2019
- ^ a b Hui, Roger (18 July 2016), APL Exercises, retrieved 24 September 2019
- ^ Weisstein, Eric W., Bertelsen's Number, MathWorld, A Wolfram Web Resource, retrieved 26 September 2019
- ^ Scholes, John (1998–2019), "Factorial", DFNS Workspace, retrieved 20 September 2019
- ^ Scholes, John (1998–2019), "Determinant", DFNS Workspace, retrieved 20 September 2019
- ^ Weisstein, Eric W., Partition Function P, equation 11, MathWorld, A Wolfram Web Resource, retrieved 3 October 2019
- ^ Hardy, G.H.; Ramanujan, S. (1918), "Asymptotic Formulæ in Combinatory Analysis" (PDF), Proceedings of the London Mathematical Society, 17 (2), retrieved 24 December 2019
- ^ Aho, A.V.; Hopcroft, J.E.; Ullman, J.D. (1974), The Design and Analysis of Computer Algorithms, Addison-Wesley
- ^ Bentley, Jon (August 1983). "Programming Pearls". Communications of the ACM. 26 (8 and 9).
- ^ a b c Dyalog (15 August 2019). Dyalog Programming Reference Guide, version 17.1, Dfns & Dops, pp. 133-147 (PDF). Dyalog Ltd. Retrieved 30 September 2019.
- ^ Iverson, Kenneth E. (1974), "Chapter 10, Formal Function Definition", Elementary Functions, IBM Corporation, retrieved 18 September 2019
- ^ Iverson, Kenneth E. (August 1980). "Notation as a Tool of Thought". Communications of the ACM. 23 (8): 444–465. doi:10.1145/358896.358899. Retrieved 8 April 2016.
- ^ Iverson, Kenneth E. (1976). Elementary Analysis. APL Press.
- ^ Orth, D.L. (1976). Calculus in a New Key. APL Press.
- ^ Hui, Roger (May 1987). "Some Uses of { and }". APL 87 Conference Proceedings. Retrieved 15 April 2016.
- ^ McDonnell, E.E. (May 1987), "Life: Nasty, Brutish, and Short", APL 87 Conference Proceedings, retrieved 6 October 2019
- ^ Iverson, Kenneth E. (26 April 1978), "Operators and Functions", Research Report Number #RC7091, IBM Corporation, retrieved 2019-09-19
- ^ Iverson, Kenneth E.; Wooster, Peter (September 1981). "A Function Definition Operator". APL81 Conference Proceedings, APL Quote Quad. 12 (1).
- ^ Cheney, Carl M. (March 1981), APL*Plus Nested Array System Reference Manual (PDF), STSC, Inc., retrieved 18 September 2019
- ^ Iverson, Kenneth E. (6 January 1983), Rationalized APL, I. P. Sharp Associates, retrieved 2019-09-19
- ^ Iverson, Kenneth E. (September 1987). "A Dictionary of APL". APL Quote Quad. 18 (1): 5–40. doi:10.1145/36983.36984. S2CID 18301178. Retrieved 19 September 2019.
- ^ a b Bunda, John (May 1987). "APL Function Definition Notation". APL87 Conference Proceedings, APL Quote Quad. 17 (4).
- ^ Hui, Roger; et al. (July 1990). "APL\?". APL90 Conference Proceedings, APL Quote Quad. 20 (4): 192–200. doi:10.1145/97808.97845. ISBN 089791371X. Retrieved 2019-09-10.
- ^ Wadler, Philip L.; et al. (1 January 1989). "Special Issue on Functional Programming". The Computer Journal. 32 (2).
- ^ Dyalog (September 2008). "Dyalog at 25" (PDF). Vector. Retrieved 2019-09-20.
- ^ Smith, Bob (2006–2019), NARS2000, retrieved 18 September 2019
- ^ Nickolov, Nick (September 2013). "Compiling APL to JavaScript". Vector. 26 (1). Retrieved 19 September 2019.
- ^ Hsu, Aaron (2019). A Data Parallel Compiler Hosted on a GPU (PDF) (Ph.D. thesis). Indiana University. Retrieved 25 December 2019.