使用宏创建新标识符

时间:2011-01-28 12:17:15

标签: macros scheme r5rs

我想要一个创建新标识符的宏,如

(new-name first second) => first-second

可用于定义新的顶级绑定

(define-syntax define-generic 
  (syntax-rules ()
    ((define-generic (name a b ...))
     (begin
       (define (new-name name data) 15)      ; <= create a new binding
       (define name (lambda (a b ...)
         (add (new-name name-data) 7))))))   ; <= use new identifier

如果我定了! “new-name”绑定的值,那么它应该影响新创建的过程。

2 个答案:

答案 0 :(得分:2)

几天前就有关Reddit的讨论了。可能值得研究发布的实施更多细节 - http://www.reddit.com/r/scheme/comments/f54dk/i_wrote_an_hygienic_definemacro_that_can_capture/

答案 1 :(得分:0)

你不能在纯粹的R5RS中做到这一点。幸运的是,除了有限的R5RS卫生之外,大多数流行的Scheme实现提供了一个合适的宏系统:

(define-macro (new-name a b) (string->symbol (string-append (symbol->string a) "-" (symbol->string b))))