Scheme 在Racket中将符号定义为引用的对应符号
我试图在引用中为自己定义符号。我可以通过定义如下来定义:Scheme 在Racket中将符号定义为引用的对应符号,scheme,racket,Scheme,Racket,我试图在引用中为自己定义符号。我可以通过定义如下来定义: #lang racket (define a 'a) (define b 'b) 但是,如果我想为很多价值观这样做,我会怎么做呢?我知道有定义值,但如何从列表中提取变量名 (define vs '(a b)) (define-values ??? (apply values vs)) 编辑:效果很好。作为后续,您将如何对定义语法规则(或使用其他宏定义函数的等效项)执行相同的操作,即在语法级别将a替换为'a?下面的宏将打开 (defi
#lang racket
(define a 'a)
(define b 'b)
但是,如果我想为很多价值观这样做,我会怎么做呢?我知道有定义值
,但如何从列表中提取变量名
(define vs '(a b))
(define-values ??? (apply values vs))
编辑:效果很好。作为后续,您将如何对
定义语法规则
(或使用其他宏定义函数的等效项)执行相同的操作,即在语法级别将a
替换为'a
?下面的宏将打开
(define-symbols a b 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)
但是请注意,此版本不会检查id是否为标识符
例如,
(定义符号3)
将导致错误消息。语法规则版本中的语法错误案例无法访问,即使可以访问,也会导致。stx:unbound标识符位于:stx中的模块中,即使这不是真的,它也会在运行时而不是编译时引发错误。所以最好不要在语法规则
版本中使用它?我隐约记得存在一个语法规则扭曲,它可以检查某个东西是否是标识符,但它非常模糊。对于语法大小写
来说,如果你只写两个“body”表达式,这就是你所想的吗?经过一番挖掘:奥列格和阿尔·彼得罗夫斯基以制定语法规则而闻名,他们做的事情似乎是不可能的。更多信息:对于文本框、哈希表、字符串、字节字符串、regexp和预制结构,这不是失败了吗?哦,等等。。。不,没有。
#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)
...)]))