在Racket

时间:2016-05-21 11:35:03

标签: scheme racket

我试图在引用中为自己定义符号。我可以通过如下定义来定义:

#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

1 个答案:

答案 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)会导致误导性错误消息。