2011-02-27 3 views
0

필자는 match-lambda를 사용하는 annotate라는 함수를 작성하는데, 종종 annotate에 대한 재귀 호출을 사용한다. 다음은 패턴 일치 중 하나입니다.match-lambda와의 패턴 매칭

(`(lambda (,<param1> . ,<params>) ,<stmts>) 
     `(CLOSURE ENV (,<param1> . ,<params>) `(lambda (ENV) ,(map annotate ,(list-append `(,<param1> . ,<params>) `(,<stmts>)))))) 

list-append는 두 개의 인수 중에서 새로운 목록을 만듭니다. 문제는이 패턴이 일치 할 때이 같은 것을 반환하는 것입니다 : 평가되는 것이 아니라 문자 그대로 "(맵 주석을"

'(CLOSURE 
    ENV 
    (x) 
    `(lambda (ENV) 
    ,(map 
     annotate 
     (<results of list-append>)))) 

특히 인쇄 - 그것은 인용 부호가있는 경우에도 함수 내 다른 패턴으로 나타납니다. 이 문제없이 동일한 구문을 사용 또한, 인용 부호로 둘러싸이지 않은 기능 목록 - APPEND가 아무런 문제없이 실행

을 어떤 조언은 감사

답변

1

을 당신은 역 인용 부호를 중첩 한 :... 당신이 다음 CLOSURE와 앞에 하나가 두 번째 앞에 두 번째 lambda 쉼표없이 n : 출력 중간에 리터럴 역 인용 부호를 사용합니다. 두 번째 lambda 앞에 backquote를 제거하면 문제가 해결 될 것입니다.

+0

나는 그것을 시험해 보았다. "(list-append"가 준 인용문에없는 것) – Schemer

+0

쉼표를 제거해야한다; map annotate는 quasiquote 외부에있을 것이다. –

+0

아, list-append는 애프터 콜 해제 할 필요가 없습니다. 다시 한번 감사드립니다. – Schemer