lisp - 步骤 Eval Common Lisp

标签 lisp common-lisp

我一直在尝试寻找一种方法来进行“步骤”评估。我在其中调用 a 函数,它评估 common lisp 的最嵌套列表。

例如:

'(+ 2 (+ 3 4))
; would eval to:
'(+ 2 7)

在该示例中,它仅计算 3 + 4 并停在那里。它没有像 lisp 通常那样继续评估 2 + 7。

所以我希望代码找到最嵌套的列表并评估最嵌套的列表,而不评估整个列表。

例如:

'(+ 2 3 4 5 (+ 4 5 (- 5 6) 1 (+ 10 8 5 (- 10 11))) 10 7)

它将找到最嵌套的列表,(- 10 11),并对其进行评估:

'(+ 2 3 4 5 (+ 4 5 (- 5 6) 1 (+ 10 8 5 -1)) 10 7)

同样,它只评估一次,并且不会立即评估整个列表。

有人知道如何对最嵌套列表进行步骤评估吗?要使用 eval 或其他东西来执行列表中最嵌套的部分,而不需要一次 eval 整个列表?我遇到的问题是我不知道如何评估最嵌套的列表,然后将其重新组合在一起。我不知道如何处理这个问题。请告诉我 Lisper 大师会如何做到这一点。

最佳答案

我们使用step :

(step (+ 2 (+ 3 4)))
step 1 --> (+ 2 (+ 3 4))
Step 1 [4]> step
step 2 --> 2
Step 2 [5]> step
step 2 ==> value: 2
step 2 --> (+ 3 4)
Step 2 [6]> step
step 3 --> 3
Step 3 [7]> step
step 3 ==> value: 3
step 3 --> 4
Step 3 [8]> step
step 3 ==> value: 4
step 2 ==> value: 7
step 1 ==> value: 9
9

它并不完全符合您的要求,但已经非常接近了。原因是 Common Lisp 需要严格按照步进器执行的顺序来计算表达式。

关于lisp - 步骤 Eval Common Lisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43270232/

相关文章:

multithreading - 在 SBCL 中进行多线程计算的正确方法

lisp - 实习生制作的符号

lambda - 为什么我的 lisp 代码给我...应该是一个 lambda 表达式?

lisp - 值 0 不是 STRING 类型 lisp 错误

garbage-collection - 如何完成 lisp :struct containing a pointer?

lisp - 获取列表中 elt 的 cdr

lisp - 我可以将Common Lisp用于SICP还是Scheme是唯一的选择?

sqlite - 如何创建sqlite3数据库

lisp - 如何避免在 Common Lisp 中完成脚本?

clojure - 如何在 ClojureScript 中使用 clojure.tools.macro/name-with-attributes?