制作 "derived" 标识符的最简洁方法?
Cleanest way to make a "derived" identifier?
Scheme 宏创建 "derived" 标识符是很常见的,比如定义记录类型 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
.
相同句法环境中的标识符
这行得通,但看起来迂回和凌乱。有没有更简洁或更惯用的方法来做到这一点?
虽然它可能不是一个卫生的宏,但我想你可以像这样使用 define-syntax(在 chicken 方案中)。
对于鸡方案,宏的文档是 here. Also 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
上面的单个定义可以更改为定义 getters/setters 或其他与记录交互的方式的 (begin ... )。
Scheme 宏创建 "derived" 标识符是很常见的,比如定义记录类型 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
.
这行得通,但看起来迂回和凌乱。有没有更简洁或更惯用的方法来做到这一点?
虽然它可能不是一个卫生的宏,但我想你可以像这样使用 define-syntax(在 chicken 方案中)。 对于鸡方案,宏的文档是 here. Also 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
上面的单个定义可以更改为定义 getters/setters 或其他与记录交互的方式的 (begin ... )。