在问题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不会被评估。
我的问题是,在我尝试这样做时是否存在某种心理陷阱?
答案 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))