Scheme 将文本计算为表达式(方案)
我试图在Scheme中将文字作为表达式进行求值(目前使用Guile)。例如:Scheme 将文本计算为表达式(方案),scheme,expression,literals,evaluation,Scheme,Expression,Literals,Evaluation,我试图在Scheme中将文字作为表达式进行求值(目前使用Guile)。例如: (define x '(+ 6 6)) (define y (evaluate-literal x)) ; Expected result: y = 12 (这里,evaluate literal是我正在寻找的内容的占位符。)是否有一个lisp函数/习惯用法允许这样做?我之所以需要这样做,是因为表达式在定义时可能无效,但在以后求值时可能是有效的表达式 目前,我的解决方案是使用延迟和强制,但它不是很优雅:
(define x '(+ 6 6))
(define y (evaluate-literal x)) ; Expected result: y = 12
(这里,evaluate literal
是我正在寻找的内容的占位符。)是否有一个lisp函数/习惯用法允许这样做?我之所以需要这样做,是因为表达式在定义时可能无效,但在以后求值时可能是有效的表达式
目前,我的解决方案是使用
延迟
和强制
,但它不是很优雅:
(define x (delay (+ 6 6)))
(define y (force x))
最简单的方法是使用
eval
,尽管很难安全使用。看看这个,看看原因
(define x '(+ 6 6))
(define y (eval x))
使用内置的delay/force
程序是一个很好的解决方案:
(define x (delay (+ 6 6)))
(define y (force x))
或者,正如评论中所建议的,您可以使用lambda
来实现自己的delay/force
语法:
(define-syntax my-delay
(syntax-rules ()
((my-delay object)
(lambda () object))))
(define (my-force delayed-object)
(delayed-object))
(define x (my-delay (+ 6 6)))
(define y (my-force x))
上面是一个玩具式的实现,一个真实世界的实现会记住结果,以避免每次都需要调用
lambda
,但你知道了。我想你可以使用eval
。但是,我认为“<代码>延迟>代码>甚至是普通代码> lambda < /代码>是更可取的。在这个场景中,你将如何使用<代码> lambda < />代码?@ FYL I编辑了我的答案,说明如何使用<代码> lambda < /> >使用延迟/力或lambda的解决方案非常适用于使用EVE的解决方案。有关安全使用eval的更多困难,请参阅Matthew Flatt关于此主题的博客文章:Matthew Flatt的博客是ablour#lang Racket,但Scheme R5RS中的eval工作方式不同