0% found this document useful (0 votes)
54 views31 pages

PicoLisp Cells: Overview & Manipulation

A cell is the fundamental data structure in PicoLisp, consisting of two machine words called CAR and CDR. The CAR and CDR can each store either a numeric value or a pointer to another cell. All higher-level data structures, including lists, are built from these basic cells. A list is recursively defined as a sequence of one or more cells, with each cell holding either a number, symbol, or pointer to another cell in the list.

Uploaded by

Andras Pahi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
54 views31 pages

PicoLisp Cells: Overview & Manipulation

A cell is the fundamental data structure in PicoLisp, consisting of two machine words called CAR and CDR. The CAR and CDR can each store either a numeric value or a pointer to another cell. All higher-level data structures, including lists, are built from these basic cells. A list is recursively defined as a sequence of one or more cells, with each cell holding either a number, symbol, or pointer to another cell in the list.

Uploaded by

Andras Pahi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 31

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

You might also like