0

私は、Scheme のマクロ システムがどのように機能するかを学んでおり、自分のコードをより JavaScript らしく見せようとしています。functionというわけでマクロから始めようと思います。これは、関数定義を次のように表示する方法です。

(function id (x) x)

次のように展開する必要があります。

(define (id x) x)

そこで、次のようにマクロを書きます。

(define-syntax function
    (lambda (name args . body)
        `(define (,name ,@args) ,@body)))

ただし、それを使用すると、次のエラーが発生します(チキンスキームで):

Error: during expansion of (define ...) - in `define' - lambda-list expected: (define ((function id (x) x) . #<procedure (rename sym1348)>) #<procedure (compare s11400 s21401)>)

    Call history:

    <syntax>      (function id (x) x)
    <eval>    (##sys#cons (##core#quote define) (##sys#cons (##sys#cons name args) body))
    <eval>    (##sys#cons (##sys#cons name args) body)
    <eval>    (##sys#cons name args)    <--

どこが間違っていますか?さらに、プログラムを自分でデバッグできるようにするには、このようなエラー メッセージをどのように読むのですか?

4

2 に答える 2

2

チキンのドキュメントによると、マクロを定義した方法は正しくありません。あなたのコードは、Common Lisp マクロの影響を受けているようです。トランスフォーマー機能については、こちらのドキュメントをご覧ください。define-syntax

マクロは次のように定義する必要があります。

(define-syntax function
    (lambda (expr inject compare)
        `(define (,(cadr expr) ,@(caddr expr)) ,(cadddr expr))))

expr はマクロ式全体です。つまり(function id (x) x)、inject と compare は、マクロ展開の実行中にマクロに渡される特別なユーティリティ関数です。

于 2013-04-14T11:27:47.760 に答える