2012-10-28 5 views
1

여기 내 작은 프로그램입니다. 그러나 mit-scheme은 다음을 출력합니다 :구문 바인딩 값은 키워드 여야합니다. alpha. 무슨 뜻이에요?</p> <pre><code>(let-syntax ((alpha (lambda (x) (list (syntax quote) (list))))) (alpha)) </code></pre> <p>그리고 교활 그것을 실행하고 반환() :

;Syntactic binding value must be a keyword: alpha 
;To continue, call RESTART with an option number: 
; (RESTART 1) => Return to read-eval-print level 1. 

왜?

(내 버전입니다 : 9.1 || 마이크로 15.3 || 런타임 15.7 || SF 4.41 || 거짓말 쟁이/I386에게 4.118 || 에드윈 3.116 해제) 당신이 절대적으로 사용해야한다는 명시 적으로 보여줍니다 당신이 링크 된 문서를

+0

여기서 무엇을하려고합니까? ** 구문 규칙 ** 키워드가없는 이유는 무엇입니까? ** let-syntax **를 사용하고 정말로 ** ** ** 버전을 사용하지 않겠습니까? – itsbruce

+0

예. 의도적으로 수행됩니다. 저수준 스키마 매크로 확장 메커니즘을 연구 중입니다. 사실이 페이지를 읽었습니다 : http://www.cs.indiana.edu/scheme-repository/R4RS/r4rs_12.html – Necto

+0

그러나 당신은 그 메커니즘을 오용하고 있습니다; 변압기 사양은 없습니다. 달성하고자하는 것이 무엇입니까? – itsbruce

답변

1

MIT Scheme은 구문 변압기를 정의 할 때 , 구문 클로저 및 명시 적 이름 바꾸기 만 제공합니다. 후자의 두 가지 경우에는 sc-macro-transformer 또는 er-macro-transformer 양식이 필요합니다. 구문 개체를 사용하려면 Racket 또는 Guile과 같은 구문 개체 (일반적으로 syntax-case과 함께 제공됨)를 지원하는 구현을 사용해야합니다.

그런데 구문 개체가있는 언어에서도 구문 대신 변압기에서 목록을 반환하기 때문에 매크로 정의가 작동하지 않을 수 있습니다. 또한 링크 된 웹 페이지는 꽤 오래된 표준입니다. TSPL4과 같이 매크로에 대한 최신 소스를 읽을 수도 있습니다.

1

을 let-syntax를 사용한 구문 규칙. 다음은 정확한 구문 계약입니다.

<macro block> ==> 
      (let-syntax (<syntax spec>*) <body>) 
     | (letrec-syntax (<syntax spec>*) <body>) 
    <syntax spec> ==> (<keyword> <transformer spec>) 
    <transformer spec> ==> 
      (syntax-rules (<identifier>*) <syntax rule>*) 

사양에 따라 구문 규칙 이외의 다른 것을 사용하면 오류없이 실행될 수 없습니다. 이것은 Guile에서가 아니라 MIT Scheme에서 오류를 생성하는 유일한 이유는 MIT Scheme의 예외 적용이 더 많아 졌기 때문입니다 (즉, MIT Scheme의 let-syntax는 구문 규칙을 확실히 제공합니다). 그것은 단순히 유효한 R4RS 코드가 아니며 R4RS와 호환되는 Scheme 구현에서는 작동하지 않아야합니다.