0

衛生マクロを書き直そうとしlet*ています。通常のマクロとして持っていますが、可能であれば衛生マクロとして使用したいと考えています。私はこのマクロ型についてあまり経験がありません。だから私は本当に助けていただければ幸いです。また、動作中のlet*マクロの別の表現が機能せず、衛生マクロと同じエラーが発生します。

働くlet*

(define-macro let*1
(lambda (assgn . body)
(let ((loop (gensym))
      (lst (gensym)))
  (let loop ((lst assgn))
     (if (null? lst)
         `(begin ,@body)
         `((lambda (,(caar lst))
             ,(loop (cdr lst)))
           ,(cadar lst)))))))

衛生状態が機能していませんlet*->エラー: ラムダ: 識別子ではありません: (caar lst)

(define-syntax let*2
(syntax-rules ()
((let*2 (set ...) body ...)
 (let loop ((lst '(set ...)))
   (if (null? lst)
       body ...
       ((lambda ((caar lst))
          (loop (cdr lst)))
        (cadar lst) 1))))))

動作していませんlet*が、2 つ目と同じエラーが発生しています。

(define-macro let*3
(lambda (assgn . body)
(let ((loop (gensym))
      (lst (gensym)))
  `(let ,loop ((,lst assgn))
     (if (null? ,lst)
         (begin ,@body)
         ((lambda ((caar ,lst))
             (,loop (cdr ,lst)))
           (cadar ,lst)))))))

ちょっと紛らわしい質問で申し訳ありませんが、私はすでにこの問題にしばらく悩まされており、カフェインはもう役に立ちません.

いくつかのテスト (私はシンボルキャプチャをテストするためにシンボル名を選びました (私はそうする必要がなかったことを知っています)):

(let*1 ((body 10)
   (lst (+ body 1)))
  (list body lst))

(let*2 ((body 10)
    (lst (+ body 1)))
  (list body lst))

(let*3 ((body 10)
    (lst (+ body 1)))
  (list body lst))

編集:Lief Andersenコードを編集して、letを使用せずに解決策を追加しました。

(define-syntax let*
  (syntax-rules ()
    ((let*2 ([x1 e1][x2 e2] ...)body ...)
     ((lambda  (x1)
        (let* ([x2 e2] ...)
           body ...))
         e1))))
4

3 に答える 3