【发布时间】:2013-04-13 23:28:11
【问题描述】:
我创建了这个:
(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 变量没有绑定,即使宏可以正常工作。
显然我的理解中遗漏了一些东西。
感谢任何见解。
谢谢。
【问题讨论】:
标签: macros scheme racket renaming transformer