制作“派生”标识符的最简洁方法?

问题描述 投票:3回答:1

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相同的句法环境。

这是有效的,但似乎迂回而凌乱。是否有更清洁或更惯用的方式来做到这一点?

syntax macros scheme chez-scheme
1个回答
1
投票

虽然它可能不是一个卫生的宏,但我想你可以像这样使用define-syntax(在鸡计划中)。对于鸡计划,宏的文档是herethis 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 ...)。

© www.soinside.com 2019 - 2024. All rights reserved.