이 기사 에 따르면 다음 라인의 Lisp 코드는 "Hello world"를 표준 출력으로 인쇄합니다.
(format t "hello, world")
호모 닉 언어 인 Lisp는 다음 과 같이 코드를 데이터로 처리 할 수 있습니다.
이제 다음 매크로를 작성했다고 상상해보십시오.
(defmacro backwards (expr) (reverse expr))
뒤로는 매크로의 이름으로, 표현식 (목록으로 표시)을 가져 와서 반대로합니다. 다음은 "Hello, world"입니다. 이번에는 매크로를 사용합니다.
(backwards ("hello, world" t format))
Lisp 컴파일러는 해당 코드 줄을 볼 때 목록의 첫 번째 아톰 (
backwards
)을보고 매크로 이름을 알 수 있습니다. 평가되지 않은 목록("hello, world" t format)
을 매크로로 전달하여 매크로를 목록으로 재정렬합니다(format t "hello, world")
. 결과 목록은 매크로 표현식을 대체하며 런타임시 평가됩니다. Lisp 환경은 첫 번째 원자 (format
)가 함수 임을 확인 하고 평가하여 나머지 인수를 전달합니다.
Lisp에서는 코드가 목록 ( s-expressions ?)으로 구현 되므로이 작업을 쉽게 수행 할 수 있습니다 (잘못된 경우 수정하십시오 ).
이제이 OCaml (동성 어가 아닌) 스 니펫을 살펴보십시오.
let print () =
let message = "Hello world" in
print_endline message
;;
Lisp에 비해 훨씬 더 복잡한 구문을 사용하는 OCaml에 동종 성을 추가한다고 가정합니다. 어떻게 하시겠습니까? 동 음성을 달성하기 위해 언어에 특히 쉬운 구문이 있어야합니까?
편집 : 이 주제 에서 Lisp와는 다른 호모 닉을 달성 하는 또 다른 방법을 찾았습니다 .io 언어로 구현 된 방법 . 이 질문에 부분적으로 대답 할 수 있습니다.
간단한 블록부터 시작해 봅시다 :
Io> plus := block(a, b, a + b) ==> method(a, b, a + b ) Io> plus call(2, 3) ==> 5
좋아요, 블록이 작동합니다. 더하기 블록에는 두 개의 숫자가 추가되었습니다.
이제이 작은 친구에 대해 약간의 성찰을 해 봅시다.
Io> plus argumentNames ==> list("a", "b") Io> plus code ==> block(a, b, a +(b)) Io> plus message name ==> a Io> plus message next ==> +(b) Io> plus message next name ==> +
뜨거운 거룩한 차가운 금형. 블록 매개 변수의 이름을 얻을 수있을뿐만 아니라 그리고 블록의 완전한 소스 코드의 문자열을 얻을 수있을뿐만 아니라 코드에 몰래 들어가서 메시지를 탐색 할 수 있습니다. 그리고 가장 놀라운 것은 : 그것은 매우 쉽고 자연 스럽습니다. 이오의 탐구에 충실하다. 루비의 거울은 그 어떤 것도 볼 수 없습니다.
그러나 우와 우와 지금은 그 다이얼을 만지지 마십시오.
Io> plus message next setName("-") ==> -(b) Io> plus ==> method(a, b, a - b ) Io> plus call(2, 3) ==> -1