阶跃求值公共Lisp
我一直在试图找到一种方法来进行“步骤”评估。在这里,我调用了a函数,它为CommonLisp计算最嵌套的列表 例如:阶跃求值公共Lisp,lisp,common-lisp,Lisp,Common Lisp,我一直在试图找到一种方法来进行“步骤”评估。在这里,我调用了a函数,它为CommonLisp计算最嵌套的列表 例如: '(+ 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) 它
'(+ 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
ing整个列表?我遇到的问题是,我不知道如何计算嵌套最多的列表,然后将其重新组合在一起。我不知道该怎么做。请告诉我lisper大师是如何做到这一点的。我们使用:
它并不能完全满足你的需求,但它离你很近。原因是需要Common Lisp按照stepper执行的顺序精确计算表达式 求值顺序是从左到右的,因此如果要模拟Common Lisp的行为,求值最深的嵌套列表并不完全正确 您必须首先计算第一个嵌套表单。假设格式良好的输入:
(defun step-eval (form)
(let ((sub-index (position-if #'listp form)))
(if sub-index
;; there is a deeper list to step first
(append (subseq form 0 sub-index)
(list (step-eval (nth sub-index form)))
(subseq form (1+ sub-index)))
;; no deeper list, eval this
(eval form))))
表达式是一个嵌套列表。只需遍历这个嵌套列表,如果它是终端列表,则调用eval。您首先需要学习如何使用函数遍历嵌套列表。我已经设法编写了一个可以访问嵌套最多部分的函数,但我不知道如何将其重新组合起来。也许我只是想象这是错的或是什么。
(defun step-eval (form)
(let ((sub-index (position-if #'listp form)))
(if sub-index
;; there is a deeper list to step first
(append (subseq form 0 sub-index)
(list (step-eval (nth sub-index form)))
(subseq form (1+ sub-index)))
;; no deeper list, eval this
(eval form))))