我创建了这个:
(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"))
如何添加一个替代模式,在本地自动绑定所有哈希键,而无需客户端在调用中指定它们?
IE:
(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 变量也不会绑定。
显然我在我的理解中遗漏了一些东西。
任何见解都值得赞赏。
谢谢。