Lisp函数如何在此代码中记住状态?

RNA*_*RNA 3 lisp static state

我在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
Run Code Online (Sandbox Code Playgroud)

我不明白该功能如何记住状态.state每次函数运行时都没有重新定义到整个列表?为什么两层let(这是必要的)?如果有人能够解释这个功能是如何工作的,那将不胜感激.

Jos*_*lor 7

statein 的值(let ((state '(() . (list of elements to be generated)))) ...)是带引号的文字,并且它正在被修改(正如本答案中所解释的那样是未定义的行为).此行为已经讨论过其他问题,例如: