Scheme 是否可以生成(quote(quote var))或'';动态var?
在这个问题上,我提出了一个解决方案,在PLT方案372中将“and”应用于原子列表(即s-exp,它既不是空的,也不是成对的)Scheme 是否可以生成(quote(quote var))或'';动态var?,scheme,quote,Scheme,Quote,在这个问题上,我提出了一个解决方案,在PLT方案372中将“and”应用于原子列表(即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 但就在那之后,
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))
由于(车辆lst)
将不会首先进行评估;即使我(let((var(car list)))(quote-var))
,它也不会工作,因为var不会被评估
我的问题是,在我尝试这样做的过程中是否存在某种思维陷阱?这就是你想要的吗
(define (my-quote lst)
(map (lambda (x) `',x) lst))
然后
如果需要更多引号,只需在以下过程中添加它们:
(define (my-quote lst)
(map (lambda (x) `'',x) lst))
(cons 'and (my-quote (list 'a 'b 'c)))
=> '(and ''a ''b ''c)
这其实很简单:
(list 'quote (list 'quote var))
这正是我想要的。。。我承认我没有仔细阅读任何scheme手册来学习各种“quote”语法,但是您的示例代码让我现在重点关注“`”的用法!非常感谢,var与(list'quote(list'quote-var))是一样的。。。简短一点。我真的很喜欢你的答案,它帮助我发现新的“被忽视的知识资产”,但对于这个问题,我想切换较长的答案,因为它看起来更直观,让同行开发人员更容易阅读代码没有任何问题;-)我访问了你的个人信息页面,太棒了,很高兴认识你!:)直觉上,它确实更吸引我。我应该等几分钟,看看现在是否有更简单的答案。。。但是让我等到明天再决定切换哪个答案。抱歉,使用
eval
以这种方式运行程序生成的代码不是一个好主意。动态生成代码(在编译时)的标准方法是使用宏,在可行的情况下,编写宏肯定比使用eval
更可取。
(list 'quote (list 'quote var))