当宏使用派生名称生成绑定时,这些不被视为对原始名称的引用(这是预期的行为)。但是,重命名不会对派生名称起作用。
这是一个简单的宏示例:
(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)))]))
在下面的代码中,将第一行的foo
重命名为bar
并right-click → Rename foo
正确重命名第二行的foo,但无法在第三行重命名get-foo
线。
(my-syntax foo)
foo
(get-foo)
是否有某种语法属性可以附加到foo
和get-foo
以提供重命名帮助程序(可以生成原始/重命名对的列表)?
作为最后的手段,我可以使用固定的约定,并使用读者扩展程序尽早将get-foo
扩展为(get foo)
,尽管我不确定这是否可行
答案 0 :(得分:3)
这是一个非常好的问题。
我从DrRacket的作者那里得到了一个提示。 'sub-range-binders属性应该可以解决问题:
答案 1 :(得分:0)
据我所知,标识符遵循Lisp传统,该传统一直追溯到1958年,其中符号是原子的,并且不被视为具有组成部分。因此,Racket在foo
内没有关于get-foo
的任何信息。它只知道get-foo
。