是否可以动态生成(quote(quote var))或'var?

时间:2013-12-27 08:41:32

标签: scheme quote

在问题Using AND with the apply function in Scheme中,我提出了一个解决方案,将“和”应用到PLT-Scheme 372中的原子列表(即s-exp既不为空,也不是对。)。

Welcome to DrScheme, version 372 [3m].
Language: Textual (MzScheme, includes R5RS).
> (eval (cons 'and (list ''#f ''#f ''#t)))
#f
> (eval (cons 'and (list ''a ''b ''c)))
c

但在此之后我意识到:动态生成(quote (quote var))''var并不容易。具体而言,以下代码不起作用:

(define (my-quote lst)
  (cond
    ((null? lst) '())
    (else
     (cons (quote (car lst))
           (my-quote (cdr lst)))
     )))

Welcome to DrScheme, version 372 [3m].
Language: Textual (MzScheme, includes R5RS).
> (my-quote (list 'a 'b 'c))
((car lst) (car lst) (car lst))

因为(car lst)首先不会被评估;即使我(let ((var (car list))) (quote var)),它也不会起作用,因为var不会被评估。

我的问题是,在我尝试这样做时是否存在某种心理陷阱?

2 个答案:

答案 0 :(得分:1)

这是你想要的吗?

(define (my-quote lst)
  (map (lambda (x) `',x) lst))

然后

(cons 'and (my-quote (list 'a 'b 'c)))
=> '(and 'a 'b 'c)

如果您想要更多报价,只需在过程中添加:

(define (my-quote lst)
  (map (lambda (x) `'',x) lst))

(cons 'and (my-quote (list 'a 'b 'c)))
=> '(and ''a ''b ''c)

答案 1 :(得分:1)

实际上它很容易:

(list 'quote (list 'quote var))