저는 J에서 초보자이기 때문에이 언어를 사용하는 간단한 작업, 특히 bubblesort 알고리즘을 구현하기로 결정했습니다. 선언적 언어로 수정 된 목록을 작성하는 대신 C와 같은 명령형 언어로 배열 요소를 사용하여 자연스럽게 해결되기 때문에 함수형 언어에서 이러한 종류의 문제를 해결하는 것은 관용적이지 않습니다. 여기J : 버블 정렬 암묵적 구현에서의 자체 참조
(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
문장의 구조있어 :
(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: # 5 3 8 7 2
2 3 5 7 8
것은 나를 혼란 :
┌────────────────────────────────────────────────────────────────────────────┬──┬─┐
│┌───────────────────────────────────────────────────────────────┬──┬───────┐│^:│#│
││┌───────────────────┬─┬───────────────────────────────────────┐│^:│┌─┬─┬─┐││ │ │
│││┌──────┬─┬────────┐│,│┌──┬─┬────────────────────────────────┐││ ││1│<│#│││ │ │
││││┌──┬─┐│@│┌─┬─┬──┐││ ││$:│@│┌───────────────────┬─┬────────┐│││ │└─┴─┴─┘││ │ │
│││││<.│/││ ││2│&│{.│││ ││ │ ││┌──────┬─┬────────┐│,│┌─┬─┬──┐││││ │ ││ │ │
││││└──┴─┘│ │└─┴─┴──┘││ ││ │ │││┌──┬─┐│@│┌─┬─┬──┐││ ││2│&│}.│││││ │ ││ │ │
│││└──────┴─┴────────┘│ ││ │ ││││>.│/││ ││2│&│{.│││ │└─┴─┴──┘││││ │ ││ │ │
│││ │ ││ │ │││└──┴─┘│ │└─┴─┴──┘││ │ ││││ │ ││ │ │
│││ │ ││ │ ││└──────┴─┴────────┘│ │ ││││ │ ││ │ │
│││ │ ││ │ │└───────────────────┴─┴────────┘│││ │ ││ │ │
│││ │ │└──┴─┴────────────────────────────────┘││ │ ││ │ │
││└───────────────────┴─┴───────────────────────────────────────┘│ │ ││ │ │
│└───────────────────────────────────────────────────────────────┴──┴───────┘│ │ │
└────────────────────────────────────────────────────────────────────────────┴──┴─┘
하는의 배열에 적용 할 수 그러나 이것은 내가 작성한 코드는 바깥 쪽 괄호 안의 문을 참조하는 $:
입니다.
$:
이 이 들어있는 긴 동사를 나타냅니다 : Help는 말한다.
The other book (~ 300 킬로바이트)는 말한다 :
3+4
7
5*20
100
+와 같은 기호 및 * 위의 문구에서 플러스 및 시간에 대한 동사에 전화 기능을 나타냅니다 있습니다. 당신은 그것이 잘 왼쪽에서 을 읽어 간단한 영어 문장과 같이 구성되어 경우에 J 문구 하나 개 이상의 동사가있을 수 있습니다, 그
4+6%2
는4
즉, 다음과 무엇에6
을 추가 의미입니다 을 (를)2
으로 나눈 값입니다.
의이 바깥 쪽 ()
의를 생략 내 코드를 다시 보자 :
((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: # 5 3 8 7 2
2 3 5 7 8
Reuslts은 동일합니다. 나는 왜 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
이 $:
에 대한 가장 긴 동사로 처리되지만 전체 표현식이 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: #
이 아니라 단지 (<./@(2&{.)), $:@((>./@(2&{.)),2&}.)
이 아니라 왜 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
만 처리되는지 나 자신을 설명 할 수 없었습니다. 왜냐하면 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
이 동사이면 #
과 결합하여 다른 동사도 형성해야하기 때문에, 나는. 이자형. 하나는 전체 문장 (첫 번째 발췌 문장)을 동사로 취급 할 수 있습니다. 아마 동사의 길이가 한 결합으로 제한되는 것에 대한 약간의 제한이있을 것입니다. 다음 코드 (from here)에서
보면 : 식에서
factorial =: (* [email protected]<:) ^: (1&<)
factorial 4
24
factorial
나는 전체 기능을 말한다. 이자형. (* [email protected]<:) ^: (1&<)
.내가 $:
대신 함수 이름을 사용했습니다이 예에 따라
:
bubblesort =: (((<./@(2&{.)), [email protected]((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
bubblesort 5 3 8 7 2
2 3 5 7 8
나는 전체 기능을 참조 bubblesort
을 예상하지만 결과가 정확하기 때문에 나를 위해 진실하지 않는 것 같습니다.
또한 약간의 리팩터링을 사용하는 경우 다른 구현을보고 싶습니다.
감사합니다.
을 : 여기 –
그래서 정렬 방법이 지정되지 않았습니까? 그것은 좋은 소식입니다. - J sort operators/:와 \ : 꽤 정교한 백엔드를 가지고 있으며 주어진 입력 데이터에 대한 인터프리터의 최적 성능 추정에 따라 삽입 정렬, 퀵 정렬 및 선형 정렬 알고리즘 중에서 선택하십시오. 동사 (/ : ~) 동사 열차를 사용하면 최소한의 노력으로 전문적인 수준의 정렬 속도를 얻을 수 있습니다. 그러면 언어 능력으로 교사에게 좋은 인상을 줄 수 있습니다. – estanford
물론, J에 포함 된 함수를 정렬하는 방법을 알고 있지만 학습 초기 단계에서 수동으로 구현하는 것은 재미 있습니다. 또한 J 프로그래머 (IRC, 포럼 등)가 어울리는 곳이 있는지 알고 싶습니다. C, Haskell, Python 프로그래머를위한 수백 개의 프로그램이 있습니다. –