在DrRacket中重命名对派生名称的支持

时间:2015-04-24 10:10:22

标签: racket rename automated-refactoring

当宏使用派生名称生成绑定时,这些不被视为对原始名称的引用(这是预期的行为)。但是,重命名不会对派生名称起作用。

这是一个简单的宏示例:

(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重命名为barright-click → Rename foo正确重命名第二行的foo,但无法在第三行重命名get-foo线。

(my-syntax foo)
foo
(get-foo)

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

作为最后的手段,我可​​以使用固定的约定,并使用读者扩展程序尽早将get-foo扩展为(get foo),尽管我不确定这是否可行

2 个答案:

答案 0 :(得分:3)

这是一个非常好的问题。

我从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

答案 1 :(得分:0)

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