2

このページを読んだ後。define-syntaxの代わりに使い方を覚えるのが難しいので、mit-schemeに実装(または少なくとも同等のものを見つけて)しdefine-macroたいと思います。define-macro

これが私の(問題のある)実装です:

(define-syntax define-macro
  (rsc-macro-transformer
    (let ((xfmr (lambda (macro-name macro-body)
      (list 'define-syntax macro-name
        (list 'rsc-macro-transformer
          (let ((m-xfmr macro-body))
            (lambda (e r)
              (apply m-xfmr (cdr e)))))))))
      (lambda (e r)
        (apply xfmr (cdr e))))))

(define-macro my-when
  (lambda (test . branch)
    (list 'if test (cons 'begin branch))))

(my-when #t
  (begin
    (display "True")
    (newline)))

そしてREPLは不平を言った:

;The object (lambda (test . branch) (list (quote if) test (cons (quote begin) branch))) is not applicable.

私はスキームに不慣れで、何が悪いのかわかりません。誰かが私を助けてくれますか?

4

2 に答える 2

7

まず、マクロを読みやすくするために、準引用の使用法を学ぶ必要があります。このような:

(define-macro (my-when test . branch)
  `(if ,test
     (begin ,@branch)))

しかし、もっと真剣に、これはを使用して書くのは非常に簡単syntax-rulesであり、あなたは本当にそれよりもはるかにそれを好むべきdefine-macroです。

(define-syntax-rule (my-when test branch ...)
  (if test
    (begin branch ...)))

ああ、あなたはdefine-syntax-rule前に見たことがありませんか?これは、1節のマクロを作成するために使用できる単純なマクロdefine-syntaxであり、次のように定義されています。

(define-syntax define-syntax-rule
  (syntax-rules ()
    ((define-syntax-rule (name . pattern) template)
     (define-syntax name
       (syntax-rules ()
         ((name . pattern) template))))))

を使用するdefine-syntax-ruleと、単純なマクロが非常に簡単に記述できるようになることに注目してください。別の例を次に示します。

(define-syntax-rule (let ((name value) ...)
                      expr ...)
  ((lambda (name ...)
     expr ...)
   value ...))
于 2013-03-21T15:55:04.027 に答える
3

本当にdefine-macroセマンティクスが必要な場合は、次のようにmit-schemeで妥当な近似値を取得できます。

(define-syntax define-macro
  (syntax-rules ()
    ((define-macro (name . args) body ...)
     (define-syntax name
       (rsc-macro-transformer
         (let ((transformer (lambda args body ...)))
           (lambda (exp env)
              (apply transformer (cdr exp)))))))))

次に、my-whenを次のように定義できます。

(define-macro (my-when test . branch)
  `(if ,test (begin ,@branch)))
于 2014-06-21T00:22:33.683 に答える