我试图将一个文字作为Scheme中的表达式进行评估(目前使用Guile)。例如:
(define x '(+ 6 6))
(define y (evaluate-literal x)) ; Expected result: y = 12
(这里,evaluate-literal
是我正在寻找的占位符。)是否有一个lisp函数/习惯用法允许这样做?我需要这样做的原因是因为表达式在定义时可能是无效的,但是在评估时它将是一个有效的表达式。
目前我的解决方法是使用delay
和force
,但它不是很优雅:
(define x (delay (+ 6 6)))
(define y (force x))
答案 0 :(得分:1)
最简单的方法是使用eval
,虽然难以安全使用。请参阅此post以查看原因。
(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
,但你明白了。