我试图在引用中为自己定义符号。我可以通过如下定义来定义:
#lang racket
(define a 'a)
(define b 'b)
但如果我想为很多价值观做这件事,我该如何解决呢?我知道有define-values
但是如何从列表中提取变量名?
(define vs '(a b))
(define-values ??? (apply values vs))
编辑:soegaard's answer效果很好。作为后续内容,您将如何对define-syntax-rule
(或使用其他宏定义函数的等效函数)执行相同的操作,即在语法级别将a
替换为'a
?
答案 0 :(得分:3)
下面的宏将转为
(define-symbols a b c)
到
(begin
(define a 'a)
(define b 'b)
(define c 'c))
宏:
#lang racket
(require (for-syntax syntax/parse))
(define-syntax (define-symbols stx)
(syntax-parse stx
[(_define-symbols id:id ...)
(syntax/loc stx
(begin
(define id 'id)
...))]
[_ (raise-syntax-error 'define-symbols
"Expected (define-symbols <identifier> ...)"
stx)]))
(define-symbols a b c)
(list a b c a b c)
修改
这是一个语法规则版本:
(define-syntax define-symbols
(syntax-rules ()
[(_define-symbols id ...)
(begin
(define id 'id)
...)]))
但请注意,此版本不会检查ID是否为标识符。
例如(define-symbols 3)
会导致误导性错误消息。