scheme - 将文字作为表达式求值(方案)

标签 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))

最佳答案

最简单的方法是使用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/

相关文章:

python Pandas : How to filter a dataframe with more than one expression stored in different variables?

javascript - angularjs 2 rc4 变化检测 : expression changed after it was checked

C# 浮点表达式 : strange behavior when casting the result float to int

c++ - 为什么 "0xe+1"无法编译?

macros - DrRacket 中的 While 循环宏

clojure - Scheme中引用的符号

scheme - DrRacket EOPL 方案输出

c# - @前缀对C#中的字符串文字有什么作用

JavaScript 函数调用。转义字符串中的引号

recursion - 没有 + 或 * 的乘法