syntax - 制作 "derived"标识符的最简洁方法?

标签 syntax macros scheme chez-scheme

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 处于相同语法环境中的标识符。

这可行,但看起来迂回且困惑。有没有更干净或更惯用的方法来做到这一点?

最佳答案

虽然它可能不是一个卫生的宏,但我想你可以使用像这样的定义语法(在鸡方案中)。 对于鸡计划,宏的文档是 here 。另外this 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

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

关于syntax - 制作 "derived"标识符的最简洁方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47965361/

相关文章:

c - 元循环解释器的确切定义是什么?

C代码在运行过程中挂起

PostgreSQL:获取输入参数作为行值

haskell - 帮助理解 Haskell 中的这些语句

objective-c - 以 (@) 符号为前缀的 Objective-C 宏的含义

recursion - 如何修复此代码,我猜是逻辑问题

ruby - 语法错误,意外的keyword_end结尾

macros - 如何命名一个宏,使其在 Elixir 中看起来像一个常量?

c++ - 宏和方法之间可能存在的冲突

lambda - 在 SICP 中使用 lambda 定义 cons/car/cdr