2010-02-20 2 views
5

매크로 렛을 사용하여 어휘 클로저와 같은 작업을 수행 할 수 있습니까?매크로 렛 (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))) 
+2

매크로를 사용하려는 이유를 설명 할 수 있습니까? (let a ((1 2 3) (4 5 6)))) (조합 nil a))해야합니까? –

+0

'(((1 2 3)) ((4 5 6)))는 조합 당 각 입력 목록에서 요소를 취하는 모든 조합의 목록입니다. 나는 매크로로 이것을하고 있는데, 그것이 내가 지금 탐구하고있는 것이기 때문이다. 나는 매크로없이 그것을 할 수 있었지만, nif보다 복잡한 매크로를 작성하려고했다. 이것은 내가 할 수있는 일과 할 수없는 것을 발견 할 수있는 기회를 주며, 그렇지 않으면 매크로 렛이 다른 방법으로 사용될 수 있는지 궁금하지 않을 것이다. 바라기를 마치면 매크로를 훨씬 잘 이해할 것입니다. – asm

+2

매크로와 관련이 없다고 생각합니다. 매크로는 데이터가 아닌 소스 코드를 계산합니다. 데이터를 계산하려면 매크로 확장 시간에 데이터가 있어야합니다. 일반적으로 그렇지 않습니다. –

답변

5

매크로는 Common Lisp의 최상위 객체가 아니므로 매크로처럼 어휘 닫음을 수행 할 수 없습니다. 당신은 유효한 Lisp 프로그램 인리스트를 생성하는 함수를 생성하고 비슷한 결과를 얻을 수있다.

아마도이 문제는 아주 좋은 해결책이 아닙니다. Rainer Joswig에 따르면, 매크로는 소스 코드를 조작하기위한 것입니다. 언어에 내장되어 있지 않은 새로운 구문 양식을 원할 때 사용하십시오. 평범한 기능으로 원하는 것을 쓸 수있는 곳에서는 사용하지 마십시오.

+0

좋아, 너는 나를 확신했다. 나는 이것이이 탐사선의 끝이라고 생각한다. – asm

+0

@Andrew Myers - 일류 매크로에 대한 아이디어가 몇 가지 있습니다. 가장 최근에 읽은 것은 Paul Graham이 Arc에 대한 아이디어를 생각한 것입니다. 필자는 그가 컴파일러를 불확실한 이익을 위해 훨씬 더 복잡하게 만들었 기 때문에 그가 쉘빙을 끝내 었다고 생각한다. – Zak