重命名 DrRacket 中派生名称的支持
Rename support for derived names in DrRacket
当宏使用派生名称生成绑定时,这些不会被视为对原始名称的引用(这是预期的行为)。但是,重命名不适用于派生名称。
这是一个简单的宏示例:
(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
以提供重命名助手(可以生成原始/重命名列表)对)?
作为最后的手段,我可以使用一个固定的约定,并使用一个 reader 扩展来在早期实际扩展 get-foo
到 (get foo)
,尽管我不确定是否那甚至可以工作。
据我所知,标识符遵循可追溯到 1958 年的 Lisp 传统,其中符号是原子的,并且不被视为具有组成部分。所以 Racket 在 get-foo
中没有任何关于 foo
的信息。它只知道 get-foo
.
这是个很好的问题。
我从 DrRacket 的作者那里得到了提示。
'sub-range-binders 属性 应该可以解决问题:
当宏使用派生名称生成绑定时,这些不会被视为对原始名称的引用(这是预期的行为)。但是,重命名不适用于派生名称。
这是一个简单的宏示例:
(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
以提供重命名助手(可以生成原始/重命名列表)对)?
作为最后的手段,我可以使用一个固定的约定,并使用一个 reader 扩展来在早期实际扩展 get-foo
到 (get foo)
,尽管我不确定是否那甚至可以工作。
据我所知,标识符遵循可追溯到 1958 年的 Lisp 传统,其中符号是原子的,并且不被视为具有组成部分。所以 Racket 在 get-foo
中没有任何关于 foo
的信息。它只知道 get-foo
.
这是个很好的问题。
我从 DrRacket 的作者那里得到了提示。 'sub-range-binders 属性 应该可以解决问题: