Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does Lisp function remember state in this code?

Tags:

static

state

lisp

I saw a piece of code from the website 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

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.

like image 848
RNA Avatar asked Sep 16 '25 13:09

RNA


1 Answers

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
like image 139
Joshua Taylor Avatar answered Sep 19 '25 08:09

Joshua Taylor