Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
阶跃求值公共Lisp_Lisp_Common Lisp - Fatal编程技术网

阶跃求值公共Lisp

阶跃求值公共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) 它

我一直在试图找到一种方法来进行“步骤”评估。在这里,我调用了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)
它将找到嵌套最多的列表,
(-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))))