Syntax 最干净的方式制作一个;“派生”;标识符?

Syntax 最干净的方式制作一个;“派生”;标识符?,syntax,macros,scheme,chez-scheme,Syntax,Macros,Scheme,Chez Scheme,Scheme宏生成“派生”标识符是很常见的,例如定义记录类型foo(使用R6RS语法记录API)将默认定义名为make foo的构造函数。我想在自己的宏中做类似的事情,但在标准库中找不到任何干净的方法。我最后写了这样一篇文章: (define (identifier-add-prefix identifier prefix) (datum->syntax identifier (string->symbol (string-append pref

Scheme宏生成“派生”标识符是很常见的,例如定义记录类型
foo
(使用R6RS语法记录API)将默认定义名为
make foo
的构造函数。我想在自己的宏中做类似的事情,但在标准库中找不到任何干净的方法。我最后写了这样一篇文章:

(define (identifier-add-prefix identifier prefix)
  (datum->syntax identifier
                 (string->symbol (string-append prefix
                                                (symbol->string (syntax->datum identifier)))))
我将一个语法对象(假定为标识符)转换为一个数据,将该符号转换为一个字符串,创建一个前缀为前缀的新字符串,将该字符串转换为一个符号,然后最终在与
identifier
相同的语法环境中将该符号转换为标识符


这是可行的,但似乎迂回而混乱。有没有更干净或更惯用的方法来实现这一点?

尽管它可能不是一个卫生的宏,但我认为您可以使用类似这样的定义语法(在chicken scheme中)。 对于chicken scheme,宏的文档是。也揭示了一些鸡计划宏。最后,我不知道这是否是解决问题的惯用方法

(use format)
(use srfi-13)

(define-syntax recgen
  (lambda (expr inject compare)
    `(define (,(string->symbol (string-append "make-" (cadr expr))) ) (format #t "called"))))

#> (recgen "bar")
#> (make-bar)
called
上面的单个define可以更改为(begin…),它定义getter/setter或其他与记录交互的方式