매크로 렛을 사용하여 어휘 클로저와 같은 작업을 수행 할 수 있습니까?매크로 렛 (macrolet)을 통한 사전 닫음?
CL-USER> (combinations nil '(1 2 3) '(4 5 6))
((1 4) (1 5) (1 6) (2 4) (2 5) (2 6) (3 4) (3 5) (3 6))
것은 내가 좋아하는 것이 무엇 : 내가 뭘 원하는 각 조합에 함수를 호출 다음 매크로 로컬 재귀 도우미를 만드는 대신에 지금의 REPL 결과에 매크로를 호출 않는 목록을 생성하는 것입니다 함수와 각 조합에서 함수를 호출하는 중첩 루프의 목록 및 결과를 원하는 수만큼 사용하는 매크로입니다. 나는 굉장히 새로운 것 같아요. 이것은 nif 클론 등을 넘어서 작성한 첫 번째 매크로이므로 어떤 제안도 환영합니다.
함수를 사용하는 매크로에서 매크로를 매크로 렛으로 바꾸려고 시도했습니다. '(nreverse (list, item, @vars))'가 '(func (nreverse (list, item , @ vars))) '하지만 func가 정의되지 않은 변수 또는 함수라는 오류가 발생합니다.
(defmacro combinations (vars &rest lsts)
(with-gensyms (item)
`(loop for ,item in ,(car lsts) ,(if (null (cdr lsts)) 'collecting 'nconcing)
,(if (null (cdr lsts))
`(nreverse (list ,item ,@vars))
`(combinations (,item ,@vars) ,@(cdr lsts))))))
이 내가 macrolet으로 노력하고 정의되지 않은 함수 'FUNC'에러가 발생 한 것입니다 :
이 원래의 기능입니다.
(defmacro for-all-combonations (func &rest lst)
(macrolet ((for-all (vars &rest lsts)
(with-gensyms (item)
`(loop for ,item in ,(car lsts) ,(if (null (cdr lsts))
'collecting 'nconcing)
,(if (null (cdr lsts))
`(func (nreverse (list ,item ,@vars)))
`(for-all (,item ,@vars) ,@(cdr lsts)))))))
(for-all nil lst)))
매크로를 사용하려는 이유를 설명 할 수 있습니까? (let a ((1 2 3) (4 5 6)))) (조합 nil a))해야합니까? –
'(((1 2 3)) ((4 5 6)))는 조합 당 각 입력 목록에서 요소를 취하는 모든 조합의 목록입니다. 나는 매크로로 이것을하고 있는데, 그것이 내가 지금 탐구하고있는 것이기 때문이다. 나는 매크로없이 그것을 할 수 있었지만, nif보다 복잡한 매크로를 작성하려고했다. 이것은 내가 할 수있는 일과 할 수없는 것을 발견 할 수있는 기회를 주며, 그렇지 않으면 매크로 렛이 다른 방법으로 사용될 수 있는지 궁금하지 않을 것이다. 바라기를 마치면 매크로를 훨씬 잘 이해할 것입니다. – asm
매크로와 관련이 없다고 생각합니다. 매크로는 데이터가 아닌 소스 코드를 계산합니다. 데이터를 계산하려면 매크로 확장 시간에 데이터가 있어야합니다. 일반적으로 그렇지 않습니다. –