Scheme 将文本计算为表达式(方案)

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函数/习惯用法允许这样做?我之所以需要这样做,是因为表达式在定义时可能无效,但在以后求值时可能是有效的表达式 目前,我的解决方案是使用延迟和强制,但它不是很优雅:

我试图在Scheme中将文字作为表达式进行求值(目前使用Guile)。例如:

(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工作方式不同