3

我正在尝试将文字评估为 Scheme 中的表达式(目前使用 Guile)。例子:

(define x '(+ 6 6))
(define y (evaluate-literal x))     ; Expected result:  y = 12

(在这里,evaluate-literal是我正在寻找的占位符。)是否有一个 lisp 函数/习语可以做到这一点?我需要这样做的原因是因为表达式在定义时可能是无效的,但稍后在评估时会是一个有效的表达式。


目前我的解决方案是使用delayforce但它不是很优雅:

(define x (delay (+ 6 6)))
(define y (force x))
4

1 回答 1

2

最简单的方法是使用eval,尽管很难安全使用。请参阅此帖子以了解原因。

(define x '(+ 6 6))
(define y (eval x))

使用内置delay/force程序是一个很好的解决方案:

(define x (delay (+ 6 6)))
(define y (force x))

或者,正如评论中所建议的,您可以使用 alambda来实现您自己的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每次调用的需要,但你明白了。

于 2012-09-08T00:06:35.983 回答