Rugalmas lista szerkesztés Lispben

Sean tanulmányán értettem meg a dotted pair fogalmát, habár utólag visszaolvasva az Emacs kézikönyv idevágó fejezete is világosan fogalmaz. A cons cell kifejezés a Lisp belső listaábrázolásában nyer értelmet, amely a lista egy elemét jelöli: car-ból és cdr-ből áll. A car a hordozott adatra, a cdr pedig a lista következő elemére vagy nilre mutat – violá egyszeresen láncolt lista. Funkcionális szinten tehát a car a lista első, cdr pedig a maradék elemét jelöli; lévén nem más, mint egy pointer arra a listára, aminek első eleme a következő node. Common Lispben egyébként ezeket a beszédesebb first és rest függvény szolgálja.

A cons művelet tehát gyakorlati viselkedésétől eltekintve valójában az argumentumként kapott car és cdr párost adja vissza cons cellként. Tehát a (cons 'a nil) olyan listát formál, amely első eleme az a atomot hordozza, és láthatóan cdre-je nil, tehát következő elem nincs. A dotted pair akkor lép színre, amikor a cons cell cdr-je nem listára mutat, hanem szintén egy atomra. Lispben ez olyan annyira bevált módszer lett, hogy az eddigi (cons 'a 'b) konstrukció helyett bevezették a tisztább (a . b) jelölést. Ha egy cons cell utolsó eleme lehet pointer atomra, a kapcsolt pár (dotted pair) segítségével könnyen körkörösen láncolt listát képezhetünk a lineárisan láncolt listánkból.

(setf list '(a b c))
(setf (cdddr list) list)
=> (a b c a b . #2)

Beleírtam a Lispet az “A1” mezőbe.