我正在尝试将文字作为 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))
最佳答案
最简单的方法是使用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
的需要,但你明白了。
关于scheme - 将文字作为表达式求值(方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12326484/