Cells in PicoLisp
Idea: @tankf33der
Review: @Regenaxer
Revision: 24
June 2020
CC0
1
Fundamental overview
CELL
2
+-----+-----+
| CAR | CDR |
+-----+-----+
The PicoLisp reference says:
1. A cell is a pair of machine words, which traditionally are called CAR and CDR in the Lisp terminology.
2. These words can represent either a numeric value (scalar) or the address of another cell (pointer).
3. All higher level data structures are built out of cells.
3
+-----+-----+
| CAR | CDR |
+-----+-----+
The PicoLisp reference says:
1. A cell is a pair of machine words, which traditionally are called CAR and CDR in the Lisp terminology.
2. These words can represent either a numeric value (scalar) or the address of another cell (pointer).
3. All higher level data structures are built out of cells.
// src/pico.h
typedef struct cell {
struct cell *car;
struct cell *cdr;
} cell, *any;
Yes, two identical types
4
+-----+-----+
| CAR | CDR |
+-----+-----+
The PicoLisp reference says:
1. A cell is a pair of machine words, which traditionally are called CAR and CDR in the Lisp terminology.
2. These words can represent either a numeric value (scalar) or the address of another cell (pointer).
3. All higher level data structures are built out of cells.
// src/pico.h
typedef struct cell {
struct cell *car;
struct cell *cdr;
} cell, *any;
Yes, two identical types
Yes, can store identical values
5
+-----+-----+
| CAR | CDR |
+-----+-----+
The PicoLisp reference says:
1. A cell is a pair of machine words, which traditionally are called CAR and CDR in the Lisp terminology.
2. These words can represent either a numeric value (scalar) or the address of another cell (pointer).
3. All higher level data structures are built out of cells.
// src/pico.h
typedef struct cell {
struct cell *car;
struct cell *cdr;
} cell, *any;
Yes, two identical types
Yes, can store identical values
Yes, cells are everywhere
6
+-----+-----+
| CAR | CDR |
+-----+-----+
The PicoLisp reference says:
1. A cell is a pair of machine words, which traditionally are called CAR and CDR in the Lisp terminology.
2. These words can represent either a numeric value (scalar) or the address of another cell (pointer).
3. All higher level data structures are built out of cells.
// src/pico.h
typedef struct cell {
struct cell *car;
struct cell *cdr;
} cell, *any;
Yes, two identical types
Yes, can store identical values
Yes, cells are everywhere
// src/pico.h
typedef struct heap {
cell cells[CELLS];
struct heap *next;
} heap;
7
+-----+-----+
| CAR | CDR |
+-----+-----+
The PicoLisp reference says:
1. A cell is a pair of machine words, which traditionally are called CAR and CDR in the Lisp terminology.
2. These words can represent either a numeric value (scalar) or the address of another cell (pointer).
3. All higher level data structures are built out of cells.
// src/pico.h
typedef struct cell {
struct cell *car;
struct cell *cdr;
} cell, *any; Cells in heap under
full control by GC
Yes, two identical types
Yes, can store identical values
cell
Yes, cells are everywhere |
+-----------+-----------+
| | |
Number Symbol Pair
// src/pico.h |
typedef struct heap { |
cell cells[CELLS]; +--------+-----------+-----------+
struct heap *next; | | | |
} heap; NIL Internal Transient External
8
Fundamental overview
LIST
9
cell A list is not part of data type hierarchy.
|
+-----------+-----------+
| | |
Number Symbol Pair
|
|
+--------+-----------+-----------+
| | | |
NIL Internal Transient External
10
cell The PicoLisp reference provides recursive definition:
|
+-----------+-----------+ A list is a sequence of one or more cells (cons pairs), holding
| | | numbers, symbols, or cons pairs.
Number Symbol Pair
|
|
+--------+-----------+-----------+
| | | |
NIL Internal Transient External
|
V
+-----+-----+
| any | | |
+-----+--+--+
|
V
+-----+-----+
| any | | |
+-----+--+--+
|
V
...
11
cell The PicoLisp reference provides recursive definition:
|
+-----------+-----------+ A list is a sequence of one or more cells (cons pairs), holding
| | | numbers, symbols, or cons pairs.
Number Symbol Pair
|
|
+--------+-----------+-----------+
| | | |
NIL Internal Transient External
CAR CDR
12
cell The PicoLisp reference provides recursive definition:
|
+-----------+-----------+ A list is a sequence of one or more cells (cons pairs), holding
| | | numbers, symbols, or cons pairs.
Number Symbol Pair
|
|
+--------+-----------+-----------+
| | | |
NIL Internal Transient External
List is like wagon train
13
cell The PicoLisp reference provides recursive definition:
|
+-----------+-----------+ A list is a sequence of one or more cells (cons pairs),
| | | holding numbers, symbols, or cons pairs.
Number Symbol Pair
|
|
+--------+-----------+-----------+
| | | |
NIL Internal Transient External
This is a list
if CDR of last cell
Remember! points to NIL
+---+---+ +---+---+
| 1 | --+--->| 2 |---+---> NIL
+---+---+ +---+---+
+---+---+
| 1 | 2 | If atom in CDR then this is a dotted pair
+---+---+
14
Construct and view
15
$ pil +
: (cons 1 2)
-> (1 . 2)
: (cons 1 2 3)
-> (1 2 . 3)
: (list 1 2 3)
-> (1 2 3)
:
16
$ pil + CONStruct a cell or sequence of cells are straightforward.
: (cons 1 2)
-> (1 . 2)
: (cons 1 2 3)
-> (1 2 . 3)
: (list 1 2 3)
-> (1 2 3)
:
17
$ pil + Construct a cell or sequence of cells are straightforward.
: (cons 1 2)
-> (1 . 2)
: (cons 1 2 3)
-> (1 2 . 3)
: (list 1 2 3)
-> (1 2 3)
:
Function view will help understand cell structure:
: (cons 1 2)
-> (1 . 2)
: (view @)
+-- 1
|
2
-> 2
:
18
$ pil + Construct a cell or sequence of cells are straightforward.
: (cons 1 2)
-> (1 . 2)
: (cons 1 2 3)
-> (1 2 . 3)
: (list 1 2 3)
-> (1 2 3)
:
Function view will help understand cell structure:
: (cons 1 2)
-> (1 . 2)
: (view @)
+-- 1 Legend:
| + is CELL
2 - is CAR
-> 2 | is CDR
: (cons 1 2 3)
-> (1 2 . 3)
: (view @)
+-- 1
|
+-- 2
|
3
-> 3
: (list 1 2 3)
-> (1 2 3)
: (view @)
+-- 1
|
+-- 2
|
+-- 3
-> NIL
19
$ pil + Construct a cell or sequence of cells are straightforward.
: (cons 1 2)
-> (1 . 2)
: (cons 1 2 3)
-> (1 2 . 3)
: (list 1 2 3)
-> (1 2 3)
:
Function view will help understand cell structure:
: (cons 1 2)
-> (1 . 2)
: (view @)
+-- 1 Legend:
| + is CELL
2 - is CAR
-> 2 | is CDR
: (cons 1 2 3)
-> (1 2 . 3)
: (view @)
+-- 1
|
+-- 2
|
3
-> 3
: (list 1 2 3)
-> (1 2 3)
: (view @)
+-- 1
|
+-- 2
| After practice you will manipulate and view structures in mind.
+-- 3
-> NIL Nothing special, right?
20
Modify CAR
21
The PicoLisp reference for function set says:
(set 'var 'any ..) -> any
Stores new values any in the var arguments.
See also setq, val, swap, con and def.
: (set 'L '(a b c) (cdr L) 999)
-> 999
: L
-> (a 999 c) Variable: Either a symbol
or a cons pair
22
The PicoLisp reference for function set says:
(set 'var 'any ..) -> any
Stores new values any in the var arguments.
See also setq, val, swap, con and def.
: (set 'L '(a b c) (cdr L) 999)
-> 999
: L
-> (a 999 c)
In case of cell it modify CAR:
$ pil +
: (set 'L (cons 1 2))
-> (1 . 2)
: (set L 3)
-> 3
: L
-> (3 . 2)
: (set L (cons 1 2))
-> (1 . 2)
: L
-> ((1 . 2) . 2)
23
Modify CDR
24
The PicoLisp reference for function con says:
(con 'lst 'any) -> any
Connects any to the first cell of lst, by (destructively) storing any in the CDR of lst.
See also set and conc.
: (setq C (1 . a))
-> (1 . a)
: (con C '(b c d))
-> (b c d)
: C
-> (1 b c d)
25
The PicoLisp reference for function con says:
(con 'lst 'any) -> any
Connects any to the first cell of lst, by (destructively) storing any in the CDR of lst.
See also set and conc.
: (setq C (1 . a))
-> (1 . a)
: (con C '(b c d))
-> (b c d)
: C
-> (1 b c d)
Remember:
o) modify CDR of dotted pair is just modification
o) modify CDR of list is DESTRUCTIVENESS of sequence
: (set 'L (cons 1 2))
-> (1 . 2)
: (con L 22)
-> 22
: L
-> (1 . 22)
26
The PicoLisp reference for function con says:
(con 'lst 'any) -> any
Connects any to the first cell of lst, by (destructively) storing any in the CDR of lst.
See also set and conc.
: (setq C (1 . a))
-> (1 . a)
: (con C '(b c d))
-> (b c d)
: C
-> (1 b c d)
Remember:
o) modify CDR of dotted pair is just modification
o) modify CDR of list is DESTRUCTIVENESS of sequence
: (set 'L (cons 1 2))
-> (1 . 2)
: (con L 22)
-> 22
: L
-> (1 . 22)
: (set 'L (list 1 2 3))
-> (1 2 3)
: (view @)
+-- 1
|
+-- 2
|
+-- 3
-> NIL
: (con L 22)
-> 22
: (view L)
+-- 1
|
22
-> 22
27
The PicoLisp reference for function con says:
(con 'lst 'any) -> any
Connects any to the first cell of lst, by (destructively) storing any in the CDR of lst.
See also set and conc.
: (setq C (1 . a))
-> (1 . a)
: (con C '(b c d))
-> (b c d)
: C
-> (1 b c d)
Remember:
o) modify CDR of dotted pair is just modification
o) modify CDR of list is DESTRUCTIVENESS of sequence
: (set 'L (cons 1 2))
-> (1 . 2)
: (con L 22)
-> 22
: L
-> (1 . 22)
: (set 'L (list 1 2 3)) Access path to two wagons is lost
-> (1 2 3) and they will be GC eventually
: (view @)
+-- 1
|
+-- 2
|
+-- 3
-> NIL
: (con L 22)
-> 22
: (view L)
+-- 1
|
22
-> 22
28
The PicoLisp reference for function con says:
(con 'lst 'any) -> any
Connects any to the first cell of lst, by (destructively) storing any in the CDR of lst.
See also set and conc.
: (setq C (1 . a))
-> (1 . a)
: (con C '(b c d))
-> (b c d)
: C
-> (1 b c d)
Remember:
o) modify CDR of dotted pair is just modification
o) modify CDR of list is DESTRUCTIVENESS of sequence
: (set 'L (cons 1 2))
-> (1 . 2)
: (con L 22)
-> 22
: L
-> (1 . 22)
: (set 'L (list 1 2 3))
-> (1 2 3)
: (view @)
+-- 1
|
+-- 2
| Any destructive functions behaves the same way.
+-- 3
-> NIL No dark corners anymore.
: (con L 22)
-> 22
: (view L)
+-- 1
|
22
-> 22
29
Now you have everything to understand listing of destructive function chain:
$ pil +
: (make (link 1 2) (view (made)) (chain 3) (view (made)))
+-- 1
|
+-- 2
+-- 1
|
+-- 2
|
3
-> (1 2 . 3)
: (make (link 1 2) (view (made)) (chain (cons 3)) (view (made)))
+-- 1
|
+-- 2
+-- 1
|
+-- 2
|
+-- 3
-> (1 2 3)
30
Happy coding!
31