Lisp函数如何记住此代码中的状态? [英] How does Lisp function remember state in this code?
问题描述
我从网站 http://www.ccs上看到了一段代码.neu.edu/home/shivers/newstyle.html :
> (defun element-generator ()
(let ((state '(() . (list of elements to be generated)))) ;() sentinel.
(let ((ans (cadr state))) ;pick off the first element
(rplacd state (cddr state)) ;smash the cons
ans)))
ELEMENT-GENERATOR
> (element-generator)
LIST
> (element-generator)
OF
> (element-generator)
ELEMENTS
> (element-generator)
TO
> (element-generator)
BE
> (element-generator)
GENERATED
我不明白该功能如何记住状态.每次函数运行时,不是state
重新定义为整个列表吗?以及为什么需要两层let
(这是必需的)?如果有人能够解释此功能的工作原理,将不胜感激.
I don't understand how the function remembers the state. Isn't state
redefined to the whole list each time the function runs? And why the two layers of let
(which is necessary)? It'd be appreciated if someone is able to explain how this function works.
推荐答案
(let ((state '(() . (list of elements to be generated)))) ...)
中state
的值是带引号的文字,并且正在被修改(如
The value of state
in (let ((state '(() . (list of elements to be generated)))) ...)
is a quoted literal, and it is being modified (which, as explained in this answer is undefined behavior). This behavior has been discussed other questions, such as:
- 奇怪的Lisp报价方案-Graham的On Lisp,第37页
- 为什么此函数返回不同的值每次都有价值吗?
- 修改作为参数传递的列表在SBCL和CLISP中给出不同的结果
- Lisp,cons和(number.number)差异
- Strange Lisp Quoting scenario - Graham's On Lisp, page 37
- Why does this function return a different value every time?
- Modifying a list passed as a parameter gives different results in SBCL and CLISP
- Lisp, cons and (number . number) difference
这篇关于Lisp函数如何记住此代码中的状态?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!