2017-05-22 5 views

답변

5

리더 매크로는 일반 매크로가 할 수없는 방식으로 언어 구문을 변경합니다 (예 : @foo(deref foo)으로 바뀝니다. 일반 매크로는 괄호를 제거 할 수 없으므로 (@ foo)과 같은 것을 할 수 있습니다. repl의 read 패스 (source 참조)에서 구현 되었기 때문에 독자 매크로라고합니다.

clojure 개발자는 매크로 인만을 만들지 만 명시 적으로 명시하지 않아도 많은 독자 매크로를 사용하게됩니다. https://clojure.org/reference/reader@'#{} 같은 일반적인 것들을 포함

리더 매크로의 전체 목록은 여기에있다.

Clojure의 사용자 정의 리더 매크로를 지원하지만, tagged literals (예 #inst 또는 #uuid)

3

TL를 통해 판독기에 내장 어떤 확장이 존재하지 않는 (다른 lisps 달리) DR *

매크로 [일반 매크로]는 평가 중에 확장되고 (REPL의 E), 심볼에 연결되고, Lisp 객체에 작용하며, 폼의 첫 번째 또는 "함수"부분에 나타납니다. Clojure와 모든 lisps는 새로운 매크로 정의를 허용합니다.

판독 전에 읽는 동안 실행되는 판독기 매크로는 단일 문자이며 판독기에서 방출되는 모든 lisp 객체보다 먼저 문자열에서 작동하며 첫 번째 또는 "function" , 양식의 일부. Clojure는 다른 LISP와 달리 Clojure 컴파일러 자체를 편집하는 것만으로는 새로운 독자 매크로를 정의 할 수 없다.

더 많은 단어 :

정상이 아닌 독자 매크로, 또는 그냥 "매크로", 혀짤배기 객체에서 작동합니다. 고려 :

(and 1 b :x)

and 매크로 한 값 1이고 다른 기호 b (안 B의 값)와 키워드 :x 이루어진리스트이며, 두 값이라고한다. and 매크로가 처리하고있는 모든 것은 이미 lisp (Clojure) 값입니다.

매크로 확장은 매크로가 목록의 시작 부분에있을 때만 발생합니다. (and 1 2)and 매크로를 확장합니다. (list and)은 "매크로의 값을 취할 수 없습니다"라는 오류를 반환합니다.

독자는 문자열을 Clojure로 변환 할 수있는 책임이 있습니다. 독자 매크로는 독자, 읽는 방법을 변경하는 단일 문자입니다. 텍스트 스트림을 림프 객체로 변환하여 작동합니다.Clojure의 lisp 판독기의 디스패치는 LispReader.java입니다. Alejandro C.에 명시된 바와 같이 Clojure는 독자 매크로 추가를 지원하지 않습니다.

독자 매크로는 한 글자입니다. (모든 lisps에 해당하는지는 모르겠지만 Clojure의 현재 구현은 단일 문자 판독기 매크로 만 지원합니다.)

리더 매크로는 양식의 어느 지점 에나 존재할 수 있습니다. ' 매크로가 정상이라면 틱은 lisp 객체가되어야합니다. 따라서 코드는 conj 심볼, 빈 벡터, 심볼 ' 그리고 마지막으로 심볼 a의리스트가 될 것입니다. 그러나 이제는 evaulation 규칙에 따라 '이 자체적으로 평가되어야합니다. 대신 판독기 대신에 'quote과 함께 오는 완전한 s-exp를 랩핑하여 평가자에게 반환되는 값이 conj의 목록이고 빈 벡터이며 quote 다음에 a이 오는 목록입니다. 이제 quote은 목록의 머리이며 따옴표에 대한 평가 규칙을 변경할 수 있습니다.

1

간단히 말하면 독자 매크로는 낮은 수준의 기능입니다. 그래서 그 중 몇 가지가 있습니다 (단지 @, quiting 및 좀 더). 많은 독자 규칙을 갖게되면 모든 언어가 엉망이됩니다.

일반 매크로는 Clojure에서 널리 사용되는 도구입니다. 개발자는 Clojure 핵심 개발자가 아닌 경우 독자적인 매크로를 작성할 수는 있지만 독자적인 매크로는 작성할 수 없습니다.

사용자는 항상 독자 규칙의 대체물로 자신의 태그가있는 리터럴을 사용할 수 있습니다. 예를 들어 #inst "2017"Date 인스턴스를 제공합니다.