의 가정하자 :Common Lisp : 조건부 접합을 사용하여 매크로에서 목록을 작성하는 방법은 무엇입니까?
(defmacro testing (&optional var)
`(list 'this 'is
,@(when (consp var) `('a 'list))))
전화했을 때 : 내가 원하는 무엇
>(testing 2)
(THIS IS)
>(testing (list 1 2))
(THIS IS A LIST)
. 그러나 지금, 나는 목록입니다 매개 변수 통과 할 때 : 매크로 대신 목록으로, 즐이 기호는 (consp bla)
을 확인 때문에 내 생각
>(defparameter bla (list 1 2 3))
BLA
>(testing bla)
(THIS IS)
이를? 어떻게 이것을 막을 수 있습니까?
덕분에 여기
이것은 (매우 단순화 된)이 경우에 효과가 있지만 '(이것은) 조건부 스 플라이 싱으로 입력하지 않아도됩니다. – mck
@mck, 그 요구 사항을 충족하는 코드를 게시했습니다. –
고맙습니다. 우아한 해결책입니다. if를 when로 대체하고 nil을 삭제하면 더 짧아 질 수 있습니다 (false 일 때 nil을 반환). "실행시 자연스럽게 평가되는"것에 대한 질문이 하나 더 있습니다. 이 코드를 일부 코드에서 사용하면 목록을 멋지게 반환하지만 코드를 평가하지 못합니다. – mck