Functions Grouped by, er, Function with Examples
------------------------------------------------
-.. code:: ipython2
+.. code:: python
from notebook_preamble import J, V
``clear``
~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('1 2 3 clear')
``dup`` ``dupd``
~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('1 2 3 dup')
1 2 3 3
-.. code:: ipython2
+.. code:: python
J('1 2 3 dupd')
(I may have these paired up wrong. I.e. ``disenstacken`` should be
``unstack`` and vice versa.)
-.. code:: ipython2
+.. code:: python
J('1 2 3 enstacken') # Replace the stack with a quote of itself.
[3 2 1]
-.. code:: ipython2
+.. code:: python
J('4 5 6 [3 2 1] disenstacken') # Unpack a list onto the stack.
4 5 6 3 2 1
-.. code:: ipython2
+.. code:: python
J('1 2 3 stack') # Get the stack on the stack.
1 2 3 [3 2 1]
-.. code:: ipython2
+.. code:: python
J('1 2 3 [4 5 6] unstack') # Replace the stack with the list on top.
# The items appear reversed but they are not,
``pop`` ``popd`` ``popop``
~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('1 2 3 pop')
1 2
-.. code:: ipython2
+.. code:: python
J('1 2 3 popd')
1 3
-.. code:: ipython2
+.. code:: python
J('1 2 3 popop')
The "down" and "up" refer to the movement of two of the top three items
(displacing the third.)
-.. code:: ipython2
+.. code:: python
J('1 2 3 roll<')
2 3 1
-.. code:: ipython2
+.. code:: python
J('1 2 3 roll>')
``swap``
~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('1 2 3 swap')
``tuck`` ``over``
~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('1 2 3 tuck')
1 3 2 3
-.. code:: ipython2
+.. code:: python
J('1 2 3 over')
``unit`` ``quoted`` ``unquoted``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('1 2 3 unit')
1 2 [3]
-.. code:: ipython2
+.. code:: python
J('1 2 3 quoted')
1 [2] 3
-.. code:: ipython2
+.. code:: python
J('1 [2] 3 unquoted')
1 2 3
-.. code:: ipython2
+.. code:: python
V('1 [dup] 3 unquoted') # Unquoting evaluates. Be aware.
``concat`` ``swoncat`` ``shunt``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[1 2 3] [4 5 6] concat')
[1 2 3 4 5 6]
-.. code:: ipython2
+.. code:: python
J('[1 2 3] [4 5 6] swoncat')
[4 5 6 1 2 3]
-.. code:: ipython2
+.. code:: python
J('[1 2 3] [4 5 6] shunt')
``cons`` ``swons`` ``uncons``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('1 [2 3] cons')
[1 2 3]
-.. code:: ipython2
+.. code:: python
J('[2 3] 1 swons')
[1 2 3]
-.. code:: ipython2
+.. code:: python
J('[1 2 3] uncons')
``first`` ``second`` ``third`` ``rest``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[1 2 3 4] first')
1
-.. code:: ipython2
+.. code:: python
J('[1 2 3 4] second')
2
-.. code:: ipython2
+.. code:: python
J('[1 2 3 4] third')
3
-.. code:: ipython2
+.. code:: python
J('[1 2 3 4] rest')
``flatten``
~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[[1] [2 [3] 4] [5 6]] flatten')
``at`` and ``getitem`` are the same function. ``of == swap at``
-.. code:: ipython2
+.. code:: python
J('[10 11 12 13 14] 2 getitem')
12
-.. code:: ipython2
+.. code:: python
J('[1 2 3 4] 0 at')
1
-.. code:: ipython2
+.. code:: python
J('2 [1 2 3 4] of')
3
-.. code:: ipython2
+.. code:: python
J('[1 2 3 4] 2 drop')
[3 4]
-.. code:: ipython2
+.. code:: python
J('[1 2 3 4] 2 take') # reverses the order
``remove``
~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[1 2 3 1 4] 1 remove')
``reverse``
~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[1 2 3 4] reverse')
``size``
~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[1 1 1 1] size')
put the old stack on top of the new one. Think of it as a context
switch. Niether of the lists/stacks change their order.
-.. code:: ipython2
+.. code:: python
J('1 2 3 [4 5 6] swaack')
``choice`` ``select``
~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('23 9 1 choice')
9
-.. code:: ipython2
+.. code:: python
J('23 9 0 choice')
23
-.. code:: ipython2
+.. code:: python
J('[23 9 7] 1 select') # select is basically getitem, should retire it?
9
-.. code:: ipython2
+.. code:: python
J('[23 9 7] 0 select')
``zip``
~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[1 2 3] [6 5 4] zip')
[[6 1] [5 2] [4 3]]
-.. code:: ipython2
+.. code:: python
J('[1 2 3] [6 5 4] zip [sum] map')
``+`` ``add``
~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('23 9 +')
``-`` ``sub``
~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('23 9 -')
``*`` ``mul``
~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('23 9 *')
``/`` ``div`` ``floordiv`` ``truediv``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('23 9 /')
2.5555555555555554
-.. code:: ipython2
+.. code:: python
J('23 -9 truediv')
-2.5555555555555554
-.. code:: ipython2
+.. code:: python
J('23 9 div')
2
-.. code:: ipython2
+.. code:: python
J('23 9 floordiv')
2
-.. code:: ipython2
+.. code:: python
J('23 -9 div')
-3
-.. code:: ipython2
+.. code:: python
J('23 -9 floordiv')
``%`` ``mod`` ``modulus`` ``rem`` ``remainder``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('23 9 %')
``neg``
~~~~~~~
-.. code:: ipython2
+.. code:: python
J('23 neg -5 neg')
``pow``
~~~~~~~
-.. code:: ipython2
+.. code:: python
J('2 10 pow')
``sqr`` ``sqrt``
~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('23 sqr')
529
-.. code:: ipython2
+.. code:: python
J('23 sqrt')
``++`` ``succ`` ``--`` ``pred``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('1 ++')
2
-.. code:: ipython2
+.. code:: python
J('1 --')
``<<`` ``lshift`` ``>>`` ``rshift``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('8 1 <<')
16
-.. code:: ipython2
+.. code:: python
J('8 1 >>')
``average``
~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[1 2 3 5] average')
``range`` ``range_to_zero`` ``down_to_zero``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('5 range')
[4 3 2 1 0]
-.. code:: ipython2
+.. code:: python
J('5 range_to_zero')
[0 1 2 3 4 5]
-.. code:: ipython2
+.. code:: python
J('5 down_to_zero')
``product``
~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[1 2 3 5] product')
``sum``
~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[1 2 3 5] sum')
``min``
~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[1 2 3 5] min')
``gcd``
~~~~~~~
-.. code:: ipython2
+.. code:: python
J('45 30 gcd')
If we represent fractions as a quoted pair of integers [q d] this word
reduces them to their ... least common factors or whatever.
-.. code:: ipython2
+.. code:: python
J('[45 30] least_fraction')
[3 2]
-.. code:: ipython2
+.. code:: python
J('[23 12] least_fraction')
Get the Boolean value of the item on the top of the stack.
-.. code:: ipython2
+.. code:: python
J('23 truthy')
True
-.. code:: ipython2
+.. code:: python
J('[] truthy') # Python semantics.
False
-.. code:: ipython2
+.. code:: python
J('0 truthy')
? == dup truthy
-.. code:: ipython2
+.. code:: python
V('23 ?')
23 True .
-.. code:: ipython2
+.. code:: python
J('[] ?')
[] False
-.. code:: ipython2
+.. code:: python
J('0 ?')
``&`` ``and``
~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('23 9 &')
``!=`` ``<>`` ``ne``
~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('23 9 !=')
``^`` ``xor``
~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('1 1 ^')
0
-.. code:: ipython2
+.. code:: python
J('1 0 ^')
``help``
~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[help] help')
``parse``
~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[parse] help')
-.. code:: ipython2
+.. code:: python
J('1 "2 [3] dup" parse')
Evaluate a quoted Joy sequence.
-.. code:: ipython2
+.. code:: python
J('[1 2 dup + +] run')
``app1`` ``app2`` ``app3``
~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[app1] help')
-.. code:: ipython2
+.. code:: python
J('10 4 [sqr *] app1')
10 160
-.. code:: ipython2
+.. code:: python
J('10 3 4 [sqr *] app2')
10 90 160
-.. code:: ipython2
+.. code:: python
J('[app2] help')
-.. code:: ipython2
+.. code:: python
J('10 2 3 4 [sqr *] app3')
range == [0 <=] [1 - dup] anamorphism
-.. code:: ipython2
+.. code:: python
J('3 [0 <=] [1 - dup] anamorphism')
``branch``
~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('3 4 1 [+] [*] branch')
12
-.. code:: ipython2
+.. code:: python
J('3 4 0 [+] [*] branch')
cleave == [i] app2 [popd] dip
-.. code:: ipython2
+.. code:: python
J('10 2 [+] [-] cleave')
``dip`` ``dipd`` ``dipdd``
~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('1 2 3 4 5 [+] dip')
1 2 7 5
-.. code:: ipython2
+.. code:: python
J('1 2 3 4 5 [+] dipd')
1 5 4 5
-.. code:: ipython2
+.. code:: python
J('1 2 3 4 5 [+] dipdd')
n [Q] dupdip == n Q n
-.. code:: ipython2
+.. code:: python
V('23 [++] dupdip *') # N(N + 1)
``genrec`` ``primrec``
~~~~~~~~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[genrec] help')
-.. code:: ipython2
+.. code:: python
J('3 [1 <=] [] [dup --] [i *] genrec')
``i``
~~~~~
-.. code:: ipython2
+.. code:: python
V('1 2 3 [+ +] i')
[predicate] [then] [else] ifte
-.. code:: ipython2
+.. code:: python
J('1 2 [1] [+] [*] ifte')
3
-.. code:: ipython2
+.. code:: python
J('1 2 [0] [+] [*] ifte')
``infra``
~~~~~~~~~
-.. code:: ipython2
+.. code:: python
V('1 2 3 [4 5 6] [* +] infra')
``loop``
~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[loop] help')
-.. code:: ipython2
+.. code:: python
V('3 dup [1 - dup] loop')
``map`` ``pam``
~~~~~~~~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('10 [1 2 3] [*] map')
10 [10 20 30]
-.. code:: ipython2
+.. code:: python
J('10 5 [[*][/][+][-]] pam')
Run a quoted program enforcing
`arity <https://en.wikipedia.org/wiki/Arity>`__.
-.. code:: ipython2
+.. code:: python
J('1 2 3 4 5 [+] nullary')
1 2 3 4 5 9
-.. code:: ipython2
+.. code:: python
J('1 2 3 4 5 [+] unary')
1 2 3 4 9
-.. code:: ipython2
+.. code:: python
J('1 2 3 4 5 [+] binary') # + has arity 2 so this is technically pointless...
1 2 3 9
-.. code:: ipython2
+.. code:: python
J('1 2 3 4 5 [+] ternary')
``step``
~~~~~~~~
-.. code:: ipython2
+.. code:: python
J('[step] help')
-.. code:: ipython2
+.. code:: python
V('0 [1 2 3] [+] step')
``times``
~~~~~~~~~
-.. code:: ipython2
+.. code:: python
V('3 2 1 2 [+] times')
``b``
~~~~~
-.. code:: ipython2
+.. code:: python
J('[b] help')
-.. code:: ipython2
+.. code:: python
V('1 2 [3] [4] b')
[predicate] [body] while
-.. code:: ipython2
+.. code:: python
J('3 [0 >] [dup --] while')
``x``
~~~~~
-.. code:: ipython2
+.. code:: python
J('[x] help')
-.. code:: ipython2
+.. code:: python
V('1 [2] [i 3] x') # Kind of a pointless example.
over quote-only datastructures (that is, datastructures that consist
soley of containers, without strings or numbers or anything else.)
-.. code:: ipython2
+.. code:: python
J('[] void')
False
-.. code:: ipython2
+.. code:: python
J('[[]] void')
True
-.. code:: ipython2
+.. code:: python
J('[[][[]]] void')
True
-.. code:: ipython2
+.. code:: python
J('[[[]][[][]]] void')