mirror of
https://github.com/urbit/shrub.git
synced 2024-12-23 19:05:48 +03:00
71 lines
1.4 KiB
Plaintext
71 lines
1.4 KiB
Plaintext
|
Author: Mencius Moldbug [moldbug@gmail.com]
|
||
|
Date: 9/15/2008
|
||
|
Version: 10K
|
||
|
|
||
|
1. Introduction
|
||
|
|
||
|
This file defines one function, "nock."
|
||
|
|
||
|
nock is in the public domain.
|
||
|
|
||
|
2. Data
|
||
|
|
||
|
A "noun" is either an "atom" or a "cell." An "atom" is an unsigned
|
||
|
integer of any size. A "cell" is an ordered pair of any two nouns,
|
||
|
the "head" and "tail."
|
||
|
|
||
|
3. Semantics
|
||
|
|
||
|
nock maps one noun to another. It doesn't always terminate.
|
||
|
|
||
|
4. Pseudocode
|
||
|
|
||
|
nock is defined in a pattern-matching pseudocode, below.
|
||
|
|
||
|
Brackets enclose cells. [a b c] is [a [b c]].
|
||
|
|
||
|
5. Definition
|
||
|
|
||
|
5.1 Transformations
|
||
|
|
||
|
*[a [b c] d] => [*[a b c] *[a d]]
|
||
|
*[a 0 b] => /[b a]
|
||
|
*[a 1 b] => [b]
|
||
|
*[a 2 b c d] => *[a 3 [0 1] 3 [1 c d] [1 0] 3 [1 2 3] [1 0] 5 5 b]
|
||
|
*[a 3 b] => **[a b]
|
||
|
*[a 4 b] => &*[a b]
|
||
|
*[a 5 b] => ^*[a b]
|
||
|
*[a 6 b] => =*[a b]
|
||
|
*[a] => *[a]
|
||
|
|
||
|
5.2 Operators
|
||
|
|
||
|
5.2.1 Goto [*]
|
||
|
|
||
|
*[a] -> nock[a]
|
||
|
|
||
|
5.2.2 Deep [&]
|
||
|
|
||
|
&[a b] -> 0
|
||
|
&[a] -> 1
|
||
|
|
||
|
5.2.4 Bump [^]
|
||
|
|
||
|
^[a b] -> ^[a b]
|
||
|
^[a] -> (a + 1)
|
||
|
|
||
|
5.2.5 Like [=]
|
||
|
|
||
|
=[a a] -> 0
|
||
|
=[a b] -> 1
|
||
|
=[a] -> =[a]
|
||
|
|
||
|
5.2.6 Snip [/]
|
||
|
|
||
|
/[1 a] -> a
|
||
|
/[2 a b] -> a
|
||
|
/[3 a b] -> b
|
||
|
/[(a + a) b] -> /[2 /[a b]]
|
||
|
/[(a + a + 1) b] -> /[3 /[a b]]
|
||
|
/[a] -> /[a]
|