#
(sharpsign)은 표준 매크로 문자로 디스패치 매크로 문자입니다. 다른 캐릭터와 작곡하기로되어 있습니다. #'
(sharpsign single-quote) 조합 뒤에 함수 이름 또는 람다식이 필요하며 (function expression)
으로 확장됩니다.
따라서 #'foo
은 읽기 시간이 (function foo)
으로 확장됩니다. foo
이 함수 인 경우 function
이 계산됩니다. 어휘 범위에서는 foo
fbound가 flet
or labels
일 수 있습니다. 그러한 어휘 정의가 없다면 심볼 함수에서 전역 함수 정의를 가져 오려고합니다. bar
매크로를 나타내는 경우
지금, (function bar)
에러 신호, 그것을 어휘 macrolet
또는 글로벌 defmacro
에게 될. 그러나 bar
매크로의 매크로 함수를 가져 오는 데 (macro-function 'bar)
을 사용할 수 있습니다. 존재하는 경우, 두 가지 인수, 즉 양식과 환경의 함수입니다.
bar
의 매크로 기능을 양식에 적용하지 않는 한, 사용자가 원하는 것이 아닐 수 있습니다. and
의 매크로 함수를 적용하는 것에 대해 생각해 봅시다 : 논리 부울 연산을 수행하지 않고 주어진 양식을 if
으로 확장합니다.
그러나 이것이 원하는 경우 macro-function
에는 두 번째 선택적 매개 변수 인 환경이 있다는 것을 기억하십시오. defmacro
또는 define-setf-expander
에 환경을 인수로 가져올 수 있습니다. 후자의 경우에는 일반적으로 get-setf-expansion
이 하위 양식을 확장 할 때 어휘 환경을 고려해야합니다.
이 밖으로 시도 :
(funcall (macro-function 'and) '(and form1 form2 form3) nil)
운동을 : 당신의 자신의 macroexpand-1
and macroexpand
를 구현합니다.
연습 : Common Lisp의 특수 연산자를 인식하여 서브 폼으로 되풀이되는 macroexpand-all
, macroexpand
을 구현하십시오.
참고 : macroexpand-all
으로 너무 멀리 가지 마세요. 구현에 따라 코드 워커가 필요합니다.
질문에 대한 나의 원래 의도는 다음과 같이 수행 할 수 있습니다. (setf (매크로 함수 'sym1) (매크로 함수'막대)) – tjb