저는 Clojure 매크로를 배우고 있으며 왜 메타 프로그래밍을위한 함수를 사용할 수 없는지 궁금합니다.Clojure, 매크로로 함수로 할 수없는 것을 할 수 있습니까?
지금까지 내가 반환 값 반면 매크로가 호출되는 곳에서 (평가, 그들은이 같은 매크로 기능의 차이는 매크로의 인수를 평가하지만, 데이터 구조 및 기호로 전달되지 않는 것입니다 알고). 매크로는 독자와 평가자 간의 프록시로 작동하여 평가가 수행되기 전에 임의의 방식으로 양식을 변형합니다. 내부적으로 함수, 특수 형식, 리터럴, 재귀, 기타 매크로 등 모든 언어 기능을 사용할 수 있습니다.
기능이 반대입니다. 인수는 호출 전에 평가되고 리턴 값은 리턴 후에 나오지 않습니다. 그러나 매크로와 함수의 미러링 특성 때문에 저의 궁금증을 유발할 수 있습니다. 매크로를 매크로로 사용하여 인수 (폼)를 인용하고 폼을 변환하고 함수 내에서 평가 한 다음 최종적으로 값을 반환합니다. 이것은 논리적으로 같은 결과를 가져 오지 않을까요? 물론 이것은 불편할 것이지만 이론적으로는 이 모든 가능한 매크로에 대해 동등한 기능을 가지고 있습니다? 여기
이 여기(defmacro infix
"translate infix notation to clojure form"
[form]
(list (second form) (first form) (last form)))
(infix (6 + 6)) ;-> 12
이 같은 논리는
(defn infix-fn
"infix using a function"
[form]
((eval (second form)) (eval (first form)) (eval (last form))))
(infix-fn '(6 + 6)) ;-> 12
이제 함수를 사용하는 매크로 간단한 중위이며, '모든 상황에 일반화 이러한 인식은, 또는 일부 코너의 경우 매크로 나오지 않았어가있다 능가 할 수 없습니까? 결국 매크로는 함수 호출에 대한 통사론적인 설탕입니까?
매크로는 런타임이 아닌 매크로 확장 (일반적으로 컴파일하기 전에) 중에 재귀 적으로 확장됩니다. 컴파일 된 코드는 확장을 직접 작성한 것처럼 보이므로 성능상의 불이익은 없습니다. 또한'eval'은 null 어휘 환경에서 폼을 평가한다는 것을 기억하십시오. 컴파일러 ... 심볼을 해석 할 수 없습니다 : x ' – jkiiski
이것들은 제가 생각하지 못한 좋은 점입니다 –