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)
       ...)]))