重命名 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)

是否有某种语法 属性 可以附加到 fooget-foo 以提供重命名助手(可以生成原始/重命名列表)对)?

作为最后的手段,我可​​以使用一个固定的约定,并使用一个 reader 扩展来在早期实际扩展 get-foo(get foo),尽管我不确定是否那甚至可以工作。

据我所知,标识符遵循可追溯到 1958 年的 Lisp 传统,其中符号是原子的,并且不被视为具有组成部分。所以 Racket 在 get-foo 中没有任何关于 foo 的信息。它只知道 get-foo.

这是个很好的问题。

我从 DrRacket 的作者那里得到了提示。 'sub-range-binders 属性 应该可以解决问题:

http://docs.racket-lang.org/tools/Check_Syntax.html?q=sub-binder#%28idx._%28gentag.28.%28lib._scribblings%2Ftools%2Ftools..scrbl%29%29%29