私はこれを作成しました:
(define-syntax (with-hash stx)
(syntax-parse stx
[(_ obj:id ((~or key:id [new-key:id hash-key:id]) ...) body:expr ...+)
#'(let ([key (hash-ref obj 'key)] ...
[new-key (hash-ref obj 'hash-key)] ...)
(begin body ...))]))
私がこれを行うことができるように:
(require rackunit)
(define h (hash 'id 1 'name "scott"))
(with-hash h (id [new-name name])
(check-equal? id 1)
(check-equal? new-name "scott"))
クライアントが呼び出しでハッシュ キーを指定せずに、すべてのハッシュ キーをローカルで自動的にバインドする代替パターンを追加するにはどうすればよいですか?
すなわち:
(define h (hash 'id 1 'name "scott"))
(with-hash h
(check-equal? id 1)
(check-equal? name "scott"))
トランスフォーマーの名前を変更する必要があると思われますが、ランタイム ハッシュに基づいて、構文パラメーターを宣言し、それらの名前を動的に変更できますか?
また、次のようなことが正しい軌道に乗っているのではないかと思いました。
(define-syntax (with-hash stx)
(syntax-parse stx
[(_ obj:id (key:id ...) body:expr ...+)
#'(let ([key (hash-ref obj 'key)] ...)
(begin body ...))]
[(_ obj:id body:expr ...+)
#'(with-hash obj (id title) body ...)]))
ここで、マクロを思い出して、バインドするデータムを解析しますが、その場合、マクロが別の方法で機能しても、id 変数と title 変数はバインドされません。
明らかに、私の理解には何かが欠けています。
どんな洞察も高く評価されます。
ありがとう。