作者:zhiting999977 | 来源:互联网 | 2023-01-31 18:47
请考虑以下代码段:
[1]> (symbol-value '+)
NIL
[2]> +
(SYMBOL-VALUE '+)
[3]> (symbol-value '/)
((SYMBOL-VALUE '+))
[4]> (symbol-value '+)
(SYMBOL-VALUE '/)
[5]> *
(SYMBOL-VALUE '/)
所以,根据我的观察,
symbol-value +
是REPL的最后一个输入.
symbol-value /
是括号中REPL的最后一个输出.
symbol-value *
是REPL的最后一个输出.
这是什么原因?
似乎没有理由检查你的最后一个输入,最后一个输出是什么,因为它已经在REPL上了.
那么,这些运营商的这种行为是否有任何具体原因?这些运营商的历史意义是symbol-value
什么?
任何帮助赞赏.
1> Renzo..:
根据HyperSpec:
变量*,**和***由Lisp read-eval-print循环维护,以保存每次循环打印的结果值.
*的值是打印的最新主值,**的值是*的前一个值,***的值是**的前一个值.
对于/和朋友:
变量/,//和///由Lisp read-eval-print循环维护,以保存在循环结束时打印的结果值.
/的值是打印的最新值的列表,//的值是/的先前值,///的值是//的先前值.
最后为+和朋友们:
变量+,++和+++由Lisp read-eval-print循环维护,以保存最近评估的表单.
+的值是已评估的最后一个表单,++的值是前一个值+,+++的值是++的前一个值.
你在问:
这是什么原因?
REPL是一个交互式文本环境:在许多这样的系统中,比如unix shell,总有一些方便的方法可以重复最后一个命令,或者使用最后一个值,而不必显式复制这些值或重新输入它们(考虑到实例旧文本终端,其中没有可用的复制/粘贴操作).所以这些变量是这个时代的遗物(但是,尽管如此,对于像我这样的懒人仍然有用,首先尝试获得某个值,然后,例如,通过简单的方式将全局变量分配给这样的值按键*
,而不是必须复制和粘贴打印的值).