2

関数型プログラミングの割り当てのために、私はスキームコードをコーヒースクリプトコードに変換するスキームマクロを書いています。Linux Mint 12でguileを使用していて、(use-syntax(ice-9 syncase))をアクティブにしています。

現在、let-syntaxをdefine-syntaxにネストしようとしていますが、予期しない「無効な構文」エラーが発生し続けます。私はスキームの初心者なので、プログラミングの習慣が悪い場合はご容赦ください。:)

私のコード:

(define-syntax coffee
  (syntax-rules (define lambda)
    ; translate define function
    ((_ (define arg1 arg2)) 
     (begin
       (let-syntax ((temp
                     (syntax-rules ()
                       ((_) (quote-replace-list 'arg1 'arg2))))))
       (if (list? 'arg1) 
           (string-append (coffee (car 'arg1)) " = " 
                          (comma-splice (cdr 'arg1)) " -> " 
                          (coffee temp))
           (string-append (coffee 'arg1) " = " 
                          (coffee arg2)))))))

と私の出力:

guile> (load "hw2-retry.scm")
guile> (coffee (define (x y) (+ x y)))
ERROR: invalid syntax (let-syntax ((temp (syntax-rules () ((_)
(quote-replace-list (quote #) (quote #)))))))
ABORT: (misc-error)

このエラーを何度か調べてみたところ、基本的なことを理解していないだけだと思い始めました。私はあなたがdefine-syntaxの中にlet-syntaxをネストできると確信していました。私は何が間違っているのですか?

4

1 に答える 1

1

スキームR5RS仕様から、let-syntax次の構文があります

 (let-syntax <bindings> <body>) 

構文:次の形式にする必要があります

((<keyword> <transformer spec>) ...)

コード内の問題let-syntax(または少なくとも問題の1つ)は、ifdyooが述べたように、本体部分で囲まれている必要があることです。つまり、をインデントしif、8行目の終わりから閉じ括弧を削除し、14行目の終わりにその閉じ括弧を追加する必要があります。

于 2012-03-14T18:14:34.107 に答える