3

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

这行得通,但它似乎迂回和凌乱。有没有更干净或更惯用的方法来做到这一点?

4

1 回答 1

1

虽然它可能不是一个卫生的宏,但我想你可以像这样使用定义语法(在鸡方案中)。对于鸡计划,宏的文档在这里这个 SO question也揭示了鸡计划宏。最后,我不知道这是否是解决问题的惯用方法。

(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

上面的单个定义可以更改为 (begin ... ),它定义了 getter/setter 或其他与记录交互的方式。

于 2017-12-29T21:26:52.100 回答