1

私はマクロ let-- (ラムダを使用する let* のようなもの) を Guile に持っています:

(define (let-make-lambdas pairs body)
    (if (null? pairs)
        `((lambda () ,@body))
        `((lambda (,(caar pairs))
            ,(let-make-lambdas (cdr pairs) body))
          ,(cadar pairs))))

(define-macro (let-- pairs . body)
    (let-make-lambdas pairs body))

外部関数を使用してコード生成を行うと正常に動作しますが、以下のコード ( with は単なるマクロ) は動作しません:

(define-macro (let-- pairs . body)
    (if (null? pairs)
        `((lambda () ,@body))
        `((lambda (,(caar pairs))
            ,(let-- (cdr pairs) body))
          ,(cadar pairs))))

なぜ?

4

3 に答える 3

2

ジョシュアはあなたの問題に対する答えを釘付けにしたと思います. そのScheme標準的な使用法syntax-rulessyntax-case. 次のようなものになる可能性がありますsyntax-rules

;; make let* with lambdas
(define-syntax let--
  (syntax-rules ()
    ;; base case, last pair
    ((let-- ((key1 value1)) . body) 
     ((lambda (key1) . body ) value1))

    ;; default case, several
    ((let-- ((key1 value1) . kv-pairs) . body) 
     ((lambda (key1) (let-- kv-pairs . body)) value1))))

(let-- ((a 'a) (b a) (c b)) (list a b c)) ; ==> (a a a)
于 2013-10-23T19:55:14.417 に答える