将文字作为表达式进行评估(Scheme)

时间:2012-09-07 23:04:33

标签: scheme expression literals evaluation

我试图将一个文字作为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))

1 个答案:

答案 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,但你明白了。