2

当我发现这个时,我在 SLIME(连接了一个 Clozure REPL)中搞砸了:

看起来变量 +、* 和 / 都绑定到最近输入的某些变体,+ 是输入本身,* 是评估该输入的结果,而 / 是包含在列表中的结果。

这是正确的吗?谁对此负责,SLIME 还是 Clozure?我在 SLIME 手册中找不到任何内容。

谢谢!

; SLIME 2010-05-13
CL-USER> +
NIL
CL-USER> *
NIL
CL-USER> /
(NIL)
CL-USER> -
-
CL-USER> +
-
CL-USER> (list 1 2)
(1 2)
CL-USER> +
(LIST 1 2)
CL-USER> /
((LIST 1 2))
CL-USER> (+ 1 2)
3
CL-USER> /
(3)
CL-USER> *
(3)
CL-USER> (* 1 2)
2
CL-USER> *
2
CL-USER> 
4

2 回答 2

4

这些都是 Common Lisp 标准指定的,甚至更多。在环境字典中搜索“变量”。

于 2010-09-09T18:11:17.837 回答
1

+
++
+++

当顶层循环正在评估表单时,变量 + 绑定到循环读取的前一个表单。变量 ++ 保存 + 的先前值(即,在两次交互之前评估的表单),并且 +++ 保存 ++ 的先前值。

-

当顶层循环正在评估表单时,变量 - 绑定到表单本身;也就是说,一旦这个交互完成,它就是要赋予 + 的值。

*
**
***

当顶层循环正在评估表单时,变量 * 绑定到最后一次循环结束时打印的结果;也就是说,它是通过评估 + 中的形式产生的值。如果生成了多个值,* 仅包含第一个值;* 如果产生零值,则包含 nil。变量 ** 保存 * 的前一个值(即两次交互之前打印的结果),*保存 ** 的前一个值。

/
//
///

当顶层循环正在评估表单时,变量 / 被绑定到最后一次循环结束时打印的结果列表;也就是说,它是通过评估 + 中的形式产生的所有值的列表。* 的值应始终与 / 的值的 car 相同。变量 // 保存 / 的前一个值(即两次交互之前打印的结果), /// 保存 // 的前一个值。因此,** 的值应始终与 // 的汽车相同,*和 /// 也是如此。

来自Common Lisp 语言,第 2 版 20.2

于 2012-02-15T18:12:03.527 回答