Lisp函数如何记住此代码中的状态? [英] How does Lisp function remember state in this code?

查看:90
本文介绍了Lisp函数如何记住此代码中的状态?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从网站 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:

  • 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆