当宏使用派生名称生成绑定(bind)时,这些不会被视为对原始名称的引用(这是预期的行为)。但是,重命名不适用于派生名称。
这是一个简单的宏示例:
(define-syntax (my-syntax stx)
(syntax-case stx ()
[(_ name)
(with-syntax ([get-name (format-id #'name "get-~a" #'name)])
#'(begin
(define name 42)
(define (get-name) name)))]))
在下面的代码中,通过 右键单击 → Rename foo
将第一行的 foo
重命名为 bar
正确地重命名了第二行的 foo行,但未能在第三行重命名 get-foo
。
(my-syntax foo)
foo
(get-foo)
例如,是否有某种语法属性可以附加到 foo
和 get-foo
以提供重命名助手(可以生成原始列表/重命名对)?
作为最后的手段,我可以使用一个固定的约定,并使用阅读器扩展在早期将 get-foo
实际扩展为 (get foo)
,尽管我我不确定这是否可行。
最佳答案
这是一个很好的问题。
我从 DrRacket 的作者那里得到了提示。 'sub-range-binders 属性应该可以解决问题:
关于racket - 重命名 DrRacket 中派生名称的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29844741/