remove the individual md ref files
This commit is contained in:
parent
fa4771fea7
commit
aeb1eee646
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## &
|
|
||||||
|
|
||||||
See [and](#and).
|
|
||||||
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## &&
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Short-circuiting Boolean AND
|
|
||||||
|
|
||||||
Accept two quoted programs, run the first and expect a Boolean value, if
|
|
||||||
it's `true` pop it and run the second program (which should also return a
|
|
||||||
Boolean value) otherwise pop the second program (leaving `false` on the
|
|
||||||
stack.)
|
|
||||||
|
|
||||||
|
|
||||||
[A] [B] &&
|
|
||||||
---------------- true
|
|
||||||
B
|
|
||||||
|
|
||||||
|
|
||||||
[A] [B] &&
|
|
||||||
---------------- false
|
|
||||||
false
|
|
||||||
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
nulco [nullary [false]] dip branch
|
|
||||||
|
|
||||||
### Derivation
|
|
||||||
|
|
||||||
TODO: this is derived in one of the notebooks I think, look it up and
|
|
||||||
link to it, or copy the content here.
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This is seldom useful, I suspect, but this way you have it.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[||](#section-25)
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## *
|
|
||||||
|
|
||||||
See [mul](#mul).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## •
|
|
||||||
|
|
||||||
See [id](#id).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## ^
|
|
||||||
|
|
||||||
See [xor](#xor).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## =
|
|
||||||
|
|
||||||
See [eq](#eq).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## !=
|
|
||||||
|
|
||||||
See [ne](#ne).
|
|
||||||
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## !-
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Not negative.
|
|
||||||
|
|
||||||
|
|
||||||
n !-
|
|
||||||
----------- n < 0
|
|
||||||
false
|
|
||||||
|
|
||||||
|
|
||||||
n !-
|
|
||||||
---------- n >= 0
|
|
||||||
true
|
|
||||||
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
0 \>=
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Return a Boolean value indicating if a number is greater than or equal to
|
|
||||||
zero.
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## >
|
|
||||||
|
|
||||||
See [gt](#gt).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## >=
|
|
||||||
|
|
||||||
See [ge](#ge).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## >>
|
|
||||||
|
|
||||||
See [rshift](#rshift).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## -
|
|
||||||
|
|
||||||
See [sub](#sub).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## --
|
|
||||||
|
|
||||||
See [pred](#pred).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## <
|
|
||||||
|
|
||||||
See [lt](#lt).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## <=
|
|
||||||
|
|
||||||
See [le](#le).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## <>
|
|
||||||
|
|
||||||
See [ne](#ne).
|
|
||||||
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## \<\{\}
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
|
|
||||||
... a <{}
|
|
||||||
----------------
|
|
||||||
... [] a
|
|
||||||
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
[] swap
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Tuck an empty list just under the first item on the stack.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[<<{}](#section-18)
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## <<
|
|
||||||
|
|
||||||
See [lshift](#lshift).
|
|
||||||
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## \<\<\{\}
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
|
|
||||||
... b a <{}
|
|
||||||
-----------------
|
|
||||||
... [] b a
|
|
||||||
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
[] rollup
|
|
||||||
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Tuck an empty list just under the first two items on the stack.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[<{}](#section-16)
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## %
|
|
||||||
|
|
||||||
See [mod](#mod).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## +
|
|
||||||
|
|
||||||
See [add](#add).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## ++
|
|
||||||
|
|
||||||
See [succ](#succ).
|
|
||||||
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## ?
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Is the item on the top of the stack "truthy"?
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [dup](#dup) [bool](#bool)
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
You often want to test the truth value of an item on the stack without
|
|
||||||
consuming the item.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[bool](#bool)
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## /
|
|
||||||
|
|
||||||
See [floordiv](#floordiv).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## //
|
|
||||||
|
|
||||||
See [floordiv](#floordiv).
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## /floor
|
|
||||||
|
|
||||||
See [floordiv](#floordiv).
|
|
||||||
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## \|\|
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Short-circuiting Boolean OR
|
|
||||||
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [nulco](#nulco) \[[nullary](#nullary)\] [dip](#dip) \[true\] [branch](#branch)
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Accept two quoted programs, run the first and expect a Boolean value, if
|
|
||||||
it’s `false` pop it and run the second program (which should also return a
|
|
||||||
Boolean value) otherwise pop the second program (leaving `true` on the
|
|
||||||
stack.)
|
|
||||||
|
|
||||||
[A] [B] ||
|
|
||||||
---------------- A -> false
|
|
||||||
B
|
|
||||||
|
|
||||||
|
|
||||||
[A] [B] ||
|
|
||||||
---------------- A -> true
|
|
||||||
true
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[&&](#section-1)
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## abs
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Return the absolute value of the argument.
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [dup](#dup) 0 < [] \[[neg](#neg)\] [branch](#branch)
|
|
||||||
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## add
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Add two numbers together: a + b.
|
|
||||||
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## anamorphism
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Build a list of values from a generator program `G` and a stopping
|
|
||||||
predicate `P`.
|
|
||||||
|
|
||||||
[P] [G] anamorphism
|
|
||||||
-----------------------------------------
|
|
||||||
[P] [pop []] [G] [dip swons] genrec
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[pop](#pop) \[\]\] [swap](#swap) \[[dip](#dip) [swons](#swons)\] [genrec](#genrec)
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
The `range` function generates a list of the integers from 0 to n - 1:
|
|
||||||
|
|
||||||
> \[0 <=\] \[\-\- dup\] anamorphism
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
See the [Recursion Combinators notebook](https://joypy.osdn.io/notebooks/Recursion_Combinators.html).
|
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## and
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Logical bit-wise AND.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[or](#or)
|
|
||||||
[xor](#xor)
|
|
||||||
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
--------------------
|
|
||||||
|
|
||||||
## app1
|
|
||||||
|
|
||||||
"apply one"
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Given a quoted program on TOS and anything as the second stack item run
|
|
||||||
the program without disturbing the stack and replace the two args with
|
|
||||||
the first result of the program.
|
|
||||||
|
|
||||||
... x [Q] app1
|
|
||||||
---------------------------------
|
|
||||||
... [x ...] [Q] infra first
|
|
||||||
|
|
||||||
This is the same effect as the [unary](#unary) combinator.
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [nullary](#nullary) [popd](#popd)
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Just a specialization of `nullary` really. Its parallelizable cousins
|
|
||||||
are more useful.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[app2](#app2)
|
|
||||||
[app3](#app3)
|
|
||||||
[appN](#appN)
|
|
||||||
[unary](#unary)
|
|
||||||
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## app2
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Like [app1](#app1) with two items.
|
|
||||||
|
|
||||||
... y x [Q] . app2
|
|
||||||
-----------------------------------
|
|
||||||
... [y ...] [Q] . infra first
|
|
||||||
[x ...] [Q] infra first
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[grba] [swap] [grba] [swap]\] [dip] \[[infrst]\] [cons] [ii]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Unlike [app1](#app1), which is essentially an alias for [unary](#unary),
|
|
||||||
this function is not the same as [binary](#binary). Instead of running
|
|
||||||
one program using exactly two items from the stack and pushing one
|
|
||||||
result (as [binary](#binary) does) this function takes two items from the
|
|
||||||
stack and runs the program twice, separately for each of the items, then
|
|
||||||
puts both results onto the stack.
|
|
||||||
|
|
||||||
This is not currently implemented as parallel processes but it can (and
|
|
||||||
should) be done.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[app1](#app1)
|
|
||||||
[app3](#app3)
|
|
||||||
[appN](#appN)
|
|
||||||
[unary](#unary)
|
|
||||||
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## app3
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Like [app1] with three items.
|
|
||||||
|
|
||||||
... z y x [Q] . app3
|
|
||||||
-----------------------------------
|
|
||||||
... [z ...] [Q] . infra first
|
|
||||||
[y ...] [Q] infra first
|
|
||||||
[x ...] [Q] infra first
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> 3 [appN]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
See [app2].
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[app1](#app1)
|
|
||||||
[app2](#app2)
|
|
||||||
[appN](#appN)
|
|
||||||
[unary](#unary)
|
|
||||||
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## appN
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Like [app1] with any number of items.
|
|
||||||
|
|
||||||
... xN ... x2 x1 x0 [Q] n . appN
|
|
||||||
--------------------------------------
|
|
||||||
... [xN ...] [Q] . infra first
|
|
||||||
...
|
|
||||||
[x2 ...] [Q] infra first
|
|
||||||
[x1 ...] [Q] infra first
|
|
||||||
[x0 ...] [Q] infra first
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[grabN]\] [codi] [map] [disenstacken]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This function takes a quoted function `Q` and an integer and runs the
|
|
||||||
function that many times on that many stack items. See also [app2].
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[app1](#app1)
|
|
||||||
[app2](#app2)
|
|
||||||
[app3](#app3)
|
|
||||||
[unary](#unary)
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## at
|
|
||||||
|
|
||||||
See [getitem](#getitem).
|
|
||||||
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## average
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Compute the average of a list of numbers.
|
|
||||||
(Currently broken until I can figure out what to do about "numeric tower"
|
|
||||||
in Thun.)
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[sum]\] \[[size]\] [cleave] [/]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Theoretically this function would compute the sum and the size in two
|
|
||||||
separate threads, then divide. This works but a compiled version would
|
|
||||||
probably do better to sum and count the list once, in one thread, eh?
|
|
||||||
|
|
||||||
As an exercise in Functional Programming in Joy it would be fun to
|
|
||||||
convert this into a catamorphism.
|
|
||||||
See the [Recursion Combinators notebook](https://joypy.osdn.io/notebooks/Recursion_Combinators.html).
|
|
||||||
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
--------------------
|
|
||||||
|
|
||||||
## b
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Run two quoted programs
|
|
||||||
|
|
||||||
[P] [Q] b
|
|
||||||
---------------
|
|
||||||
P Q
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[i]\] [dip] [i]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This combinator may seem trivial but it comes in handy.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[dupdip](#dupdip)
|
|
||||||
[ii](#ii)
|
|
||||||
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
--------------------
|
|
||||||
|
|
||||||
## binary
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Run a quoted program using exactly two stack values and leave the first
|
|
||||||
item of the result on the stack.
|
|
||||||
|
|
||||||
... y x [P] binary
|
|
||||||
-----------------------
|
|
||||||
... a
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [unary] [popd]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Runs any other quoted function and returns its first result while
|
|
||||||
consuming exactly two items from the stack.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[nullary](#nullary)
|
|
||||||
[ternary](#ternary)
|
|
||||||
[unary](#unary)
|
|
||||||
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## bool
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Convert the item on the top of the stack to a Boolean value.
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
For integers 0 is `false` and any other number is `true`; for lists the
|
|
||||||
empty list is `false` and all other lists are `true`.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[not]
|
|
||||||
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## branch
|
|
||||||
|
|
||||||
Basis Combinator
|
|
||||||
|
|
||||||
Use a Boolean value to select and run one of two quoted programs.
|
|
||||||
|
|
||||||
|
|
||||||
false [F] [T] branch
|
|
||||||
--------------------------
|
|
||||||
F
|
|
||||||
|
|
||||||
true [F] [T] branch
|
|
||||||
-------------------------
|
|
||||||
T
|
|
||||||
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [rolldown] [choice] [i]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This is one of the fundamental operations (although it can be defined in
|
|
||||||
terms of [choice] as above). The more common "if..then..else" construct
|
|
||||||
[ifte] adds a predicate function that is evaluated [nullary].
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[choice]
|
|
||||||
[ifte]
|
|
||||||
[select]
|
|
||||||
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## ccccons
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
a b c d [...] ccccons
|
|
||||||
---------------------------
|
|
||||||
[a b c d ...]
|
|
||||||
|
|
||||||
Do [cons] four times.
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [ccons] [ccons]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[ccons] [cons] [times]
|
|
||||||
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
--------------------
|
|
||||||
|
|
||||||
## ccons
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
a b [...] ccons
|
|
||||||
---------------------
|
|
||||||
[a b ...]
|
|
||||||
|
|
||||||
Do [cons] two times.
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [cons] [cons]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[cons]
|
|
||||||
[ccons]
|
|
||||||
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## choice
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Use a Boolean value to select one of two items.
|
|
||||||
|
|
||||||
a b false choice
|
|
||||||
----------------------
|
|
||||||
a
|
|
||||||
|
|
||||||
a b true choice
|
|
||||||
---------------------
|
|
||||||
b
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[pop]\] \[[popd]\] [branch]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
It's a matter of taste whether you implement this in terms of [branch] or
|
|
||||||
the other way around.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[branch]
|
|
||||||
[select]
|
|
||||||
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## clear
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Clear everything from the stack.
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [stack] [bool] \[[pop] [stack] [bool]\] [loop]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[stack]
|
|
||||||
[swaack]
|
|
||||||
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## cleave
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Run two programs in parallel, consuming one additional item, and put their
|
|
||||||
results on the stack.
|
|
||||||
|
|
||||||
... x [A] [B] cleave
|
|
||||||
------------------------
|
|
||||||
... a b
|
|
||||||
|
|
||||||
### Derivation
|
|
||||||
|
|
||||||
> [fork] [popdd]
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
1 2 3 [+] [-] cleave
|
|
||||||
--------------------------
|
|
||||||
1 2 5 -1
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
One of a handful of useful parallel combinators.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[clop]
|
|
||||||
[fork]
|
|
||||||
[map]
|
|
||||||
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## clop
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Run two programs in parallel, consuming two additional items, and put their results on the stack.
|
|
||||||
|
|
||||||
... x y [A] [B] clop
|
|
||||||
--------------------------
|
|
||||||
... a b
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [cleave] [popdd]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Like [cleave] but consumes an additional item from the stack.
|
|
||||||
|
|
||||||
1 2 3 4 [+] [-] clop
|
|
||||||
--------------------------
|
|
||||||
1 2 7 -1
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[cleave]
|
|
||||||
[fork]
|
|
||||||
[map]
|
|
||||||
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## cmp
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Take two values and three quoted programs on the stack and run one
|
|
||||||
of the three depending on the results of comparing the two values.
|
|
||||||
|
|
||||||
a b [G] [E] [L] cmp
|
|
||||||
------------------------- a > b
|
|
||||||
G
|
|
||||||
|
|
||||||
a b [G] [E] [L] cmp
|
|
||||||
------------------------- a = b
|
|
||||||
E
|
|
||||||
|
|
||||||
a b [G] [E] [L] cmp
|
|
||||||
------------------------- a < b
|
|
||||||
L
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This is useful sometimes, and you can [dup] or [dupd] with two quoted
|
|
||||||
programs to handle the cases when you just want to deal with [<=] or [>=]
|
|
||||||
and not all three possibilities, e.g.:
|
|
||||||
|
|
||||||
[G] [EL] dup cmp
|
|
||||||
|
|
||||||
[GE] [L] dupd cmp
|
|
||||||
|
|
||||||
Or even:
|
|
||||||
|
|
||||||
[GL] [E] over cmp
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
TODO: link to tree notebooks where this was used.
|
|
||||||
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## codi
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Take a quoted program from the stack, [cons] the next item onto it, then
|
|
||||||
[dip] the whole thing under what was the third item on the stack.
|
|
||||||
|
|
||||||
a b [F] . codi
|
|
||||||
--------------------
|
|
||||||
b . F a
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [cons] [dip]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This is one of those weirdly specific functions that turns out to be
|
|
||||||
useful in a few places.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[appN]
|
|
||||||
[codireco]
|
|
||||||
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## codireco
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
This is part of the [make_generator] function. You would not use this
|
|
||||||
combinator directly.
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [codi] [reco]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
See [make_generator] and the
|
|
||||||
["Using `x` to Generate Values" notebook](https://joypy.osdn.io/notebooks/Generator_Programs.html#an-interesting-variation)
|
|
||||||
as well as
|
|
||||||
[Recursion Theory and Joy](https://www.kevinalbrecht.com/code/joy-mirror/j05cmp.html) by Manfred von Thun.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[make_generator]
|
|
||||||
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## concat
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Concatinate two lists.
|
|
||||||
|
|
||||||
[a b c] [d e f] concat
|
|
||||||
----------------------------
|
|
||||||
[a b c d e f]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[first]
|
|
||||||
[first_two]
|
|
||||||
[flatten]
|
|
||||||
[fourth]
|
|
||||||
[getitem]
|
|
||||||
[remove]
|
|
||||||
[rest]
|
|
||||||
[reverse]
|
|
||||||
[rrest]
|
|
||||||
[second]
|
|
||||||
[shift]
|
|
||||||
[shunt]
|
|
||||||
[size]
|
|
||||||
[sort]
|
|
||||||
[split_at]
|
|
||||||
[split_list]
|
|
||||||
[swaack]
|
|
||||||
[third]
|
|
||||||
[zip]
|
|
||||||
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## cond
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
This combinator works like a case statement. It expects a single quote
|
|
||||||
on the stack that must contain zero or more condition quotes and a
|
|
||||||
default quote. Each condition quote should contain a quoted predicate
|
|
||||||
followed by the function expression to run if that predicate returns
|
|
||||||
`true`. If no predicates return `true` the default function runs.
|
|
||||||
|
|
||||||
[
|
|
||||||
[ [Predicate0] Function0 ]
|
|
||||||
[ [Predicate1] Function1 ]
|
|
||||||
...
|
|
||||||
[ [PredicateN] FunctionN ]
|
|
||||||
[Default]
|
|
||||||
]
|
|
||||||
cond
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
It works by rewriting into a chain of nested [ifte]{.title-ref}
|
|
||||||
expressions, e.g.:
|
|
||||||
|
|
||||||
[[[B0] T0] [[B1] T1] [D]] cond
|
|
||||||
-----------------------------------------
|
|
||||||
[B0] [T0] [[B1] [T1] [D] ifte] ifte
|
|
||||||
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[ifte]
|
|
||||||
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
--------------------
|
|
||||||
|
|
||||||
## cons
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Given an item and a list, append the item to the list to make a new list.
|
|
||||||
|
|
||||||
a [...] cons
|
|
||||||
------------------
|
|
||||||
[a ...]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Cons is a [venerable old function from Lisp](https://en.wikipedia.org/wiki/Cons#Lists).
|
|
||||||
Its inverse operation is [uncons].
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[uncons]
|
|
||||||
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## dinfrirst
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Specialist function (that means I forgot what it does and why.)
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [dip] [infrst]
|
|
||||||
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## dip
|
|
||||||
|
|
||||||
Basis Combinator
|
|
||||||
|
|
||||||
The `dip` combinator expects a quoted program on the stack and below it
|
|
||||||
some item, it hoists the item into the expression and runs the program
|
|
||||||
on the rest of the stack.
|
|
||||||
|
|
||||||
... x [Q] . dip
|
|
||||||
---------------------
|
|
||||||
... . Q x
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This along with [infra] are enough to update any datastructure.
|
|
||||||
See the ["Traversing Datastructures with Zippers" notebook](https://joypy.osdn.io/notebooks/Zipper.html).
|
|
||||||
|
|
||||||
Note that the item that was on the top of the stack (`x` in the example above)
|
|
||||||
will not be treated specially by the interpreter when it is reached
|
|
||||||
again. This is something of a footgun. My advice is to avoid putting
|
|
||||||
bare unquoted symbols onto the stack, but then you can't use symbols as
|
|
||||||
"atoms" and also use `dip` and `infra` to operate on compound
|
|
||||||
datastructures with atoms in them. This is a kind of side-effect of the
|
|
||||||
Continuation-Passing Style. The `dip` combinator could "set aside" the
|
|
||||||
item and replace it after running `Q` but that means that there is an
|
|
||||||
"extra space" where the item resides while `Q` runs. One of the nice
|
|
||||||
things about CPS is that the whole state is recorded in the stack and
|
|
||||||
pending expression (not counting modifications to the dictionary.)
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[dipd]
|
|
||||||
[dipdd]
|
|
||||||
[dupdip]
|
|
||||||
[dupdipd]
|
|
||||||
[infra]
|
|
||||||
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## dipd
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Like [dip] but expects two items.
|
|
||||||
|
|
||||||
... y x [Q] . dipd
|
|
||||||
-------------------------
|
|
||||||
... . Q y x
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
See [dip].
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[dip]
|
|
||||||
[dipdd]
|
|
||||||
[dupdip]
|
|
||||||
[dupdipd]
|
|
||||||
[infra]
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## dipdd
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Like [dip] but expects three items. :
|
|
||||||
|
|
||||||
... z y x [Q] . dip
|
|
||||||
-----------------------------
|
|
||||||
... . Q z y x
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
See [dip].
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[dip]
|
|
||||||
[dipd]
|
|
||||||
[dupdip]
|
|
||||||
[dupdipd]
|
|
||||||
[infra]
|
|
||||||
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## disenstacken
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
The `disenstacken` function expects a list on top of the stack and makes
|
|
||||||
that the stack discarding the rest of the stack.
|
|
||||||
|
|
||||||
1 2 3 [4 5 6] disenstacken
|
|
||||||
--------------------------------
|
|
||||||
6 5 4
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[clear]\] [dip] [reverse] [unstack](#unstack)
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Note that the order of the list is not changed, it just looks that way
|
|
||||||
because the stack is printed with the top on the right while lists are
|
|
||||||
printed with the top or head on the left.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[enstacken]
|
|
||||||
[stack]
|
|
||||||
[unstack](#unstack)
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
--------------
|
|
||||||
|
|
||||||
## div
|
|
||||||
|
|
||||||
See [floordiv](#floordiv).
|
|
||||||
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## divmod
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
x y divmod
|
|
||||||
------------------
|
|
||||||
q r
|
|
||||||
(x/y) (x%y)
|
|
||||||
|
|
||||||
Invariant: `qy + r = x`.
|
|
||||||
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[floordiv]\] \[[mod]\] [clop]
|
|
||||||
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## down_to_zero
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Given a number greater than zero put all the Natural numbers (including
|
|
||||||
zero) less than that onto the stack.
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
3 down_to_zero
|
|
||||||
--------------------
|
|
||||||
3 2 1 0
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[0 \>\] \[[dup] [--]\] [while]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[range]
|
|
||||||
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## drop
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Expects an integer and a quote on the stack and returns the quote with n
|
|
||||||
items removed off the top.
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
[a b c d] 2 drop
|
|
||||||
----------------------
|
|
||||||
[c d]
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[rest]\] [times]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[take]
|
|
||||||
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## dup
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
"Dup"licate the top item on the stack.
|
|
||||||
|
|
||||||
a dup
|
|
||||||
-----------
|
|
||||||
a a
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[dupd]
|
|
||||||
[dupdd]
|
|
||||||
[dupdip]
|
|
||||||
[dupdipd]
|
|
||||||
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## dupd
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
[dup] the second item down on the stack.
|
|
||||||
|
|
||||||
a b dupd
|
|
||||||
--------------
|
|
||||||
a a b
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[dup]\] [dip]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[dup]
|
|
||||||
[dupdd]
|
|
||||||
[dupdip]
|
|
||||||
[dupdipd]
|
|
||||||
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## dupdd
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
[dup] the third item down on the stack.
|
|
||||||
|
|
||||||
a b c dupdd
|
|
||||||
-----------------
|
|
||||||
a a b c
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[dup]\] [dipd]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[dup]
|
|
||||||
[dupd]
|
|
||||||
[dupdip]
|
|
||||||
[dupdipd]
|
|
||||||
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## dupdip
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Apply a function `F` and [dup] the item under it on the stack.
|
|
||||||
|
|
||||||
a [F] dupdip
|
|
||||||
------------------
|
|
||||||
a F a
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [dupd] [dip]
|
|
||||||
|
|
||||||
### Derivation
|
|
||||||
|
|
||||||
a [F] dupdip
|
|
||||||
a [F] dupd dip
|
|
||||||
a [F] [dup] dip dip
|
|
||||||
a dup [F] dip
|
|
||||||
a a [F] dip
|
|
||||||
a F a
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
A very common and useful combinator.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[dupdipd]
|
|
||||||
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## dupdipd
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Run a copy of program `F` under the next item down on the stack.
|
|
||||||
|
|
||||||
a [F] dupdipd
|
|
||||||
-------------------
|
|
||||||
F a [F]
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [dup] [dipd]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[dupdip]
|
|
||||||
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## enstacken
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Put the stack onto the stack replacing the contents of the stack.
|
|
||||||
|
|
||||||
... a b c enstacken
|
|
||||||
-------------------------
|
|
||||||
[c b a ...]
|
|
||||||
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [stack] \[[clear]\] [dip]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This is a destructive version of [stack]. See the note under
|
|
||||||
[disenstacken] about the apparent but illusory reversal of the stack.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[stack]
|
|
||||||
[unstack]
|
|
||||||
[disenstacken]
|
|
||||||
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## eq
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Compare the two items on the top of the stack for equality and replace
|
|
||||||
them with a Boolean value.
|
|
||||||
|
|
||||||
a b eq
|
|
||||||
-------------
|
|
||||||
Boolean
|
|
||||||
(a = b)
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[cmp]
|
|
||||||
[ge]
|
|
||||||
[gt]
|
|
||||||
[le]
|
|
||||||
[lt]
|
|
||||||
[ne]
|
|
||||||
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## first
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Replace a list with its first item.
|
|
||||||
|
|
||||||
[a ...]
|
|
||||||
--------------
|
|
||||||
a
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [uncons] [pop]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[second]
|
|
||||||
[third]
|
|
||||||
[fourth]
|
|
||||||
[rest]
|
|
||||||
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## first_two
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Replace a list with its first two items.
|
|
||||||
|
|
||||||
[a b ...] first_two
|
|
||||||
-------------------------
|
|
||||||
a b
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [uncons] [first]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[first]
|
|
||||||
[second]
|
|
||||||
[third]
|
|
||||||
[fourth]
|
|
||||||
[rest]
|
|
||||||
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## flatten
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Given a list of lists, concatinate them.
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
[[1 2] [3 [4] 5] [6 7]] flatten
|
|
||||||
-------------------------------------
|
|
||||||
[1 2 3 [4] 5 6 7]
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [\<\{\}] \[[concat]\] [step]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Note that only one "level" of lists is flattened. In the example above
|
|
||||||
`[4]` is not unquoted.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[concat]
|
|
||||||
[first]
|
|
||||||
[first_two]
|
|
||||||
[fourth]
|
|
||||||
[getitem]
|
|
||||||
[remove]
|
|
||||||
[rest]
|
|
||||||
[reverse]
|
|
||||||
[rrest]
|
|
||||||
[second]
|
|
||||||
[shift]
|
|
||||||
[shunt]
|
|
||||||
[size]
|
|
||||||
[sort]
|
|
||||||
[split_at]
|
|
||||||
[split_list]
|
|
||||||
[swaack]
|
|
||||||
[third]
|
|
||||||
[zip]
|
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## floor
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Return the largest integer \<= x.
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This function doesn't make sense (yet) to have because there are (as yet)
|
|
||||||
only integers in the system.
|
|
||||||
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## floordiv
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
I don't know why this is called "floor" div, I think it rounds its
|
|
||||||
result down (not towards zero or up.)
|
|
||||||
|
|
||||||
a b floordiv
|
|
||||||
------------------
|
|
||||||
(a/b)
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
All the division commands need to be revisited when the "numeric tower"
|
|
||||||
for Thun gets nailed down.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[divmod]
|
|
||||||
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## fork
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Run two quoted programs in parallel and replace them with their results.
|
|
||||||
|
|
||||||
... [F] [G] fork
|
|
||||||
----------------------
|
|
||||||
... f g
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[i]\] [app2]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
The basic parallelism combinator, the two programs are run independently.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[cleave]
|
|
||||||
[clop]
|
|
||||||
[map]
|
|
||||||
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## fourth
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Replace a list with its fourth item.
|
|
||||||
|
|
||||||
[a b c d ...] fourth
|
|
||||||
--------------------------
|
|
||||||
d
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [rest] [third]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[first]
|
|
||||||
[second]
|
|
||||||
[third]
|
|
||||||
[rest]
|
|
||||||
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## gcd
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Take two integers from the stack and replace them with their Greatest
|
|
||||||
Common Denominator.
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> true \[[tuck] [mod] [dup] 0 [>]\] [loop] [pop]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Euclid's Algorithm
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## gcd2
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Compiled GCD function.
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
See [gcd].
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[gcd]
|
|
||||||
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## ge
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Greater-than-or-equal-to comparison of two numbers.
|
|
||||||
|
|
||||||
a b ge
|
|
||||||
--------------
|
|
||||||
Boolean
|
|
||||||
(a >= b)
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[cmp]
|
|
||||||
[eq]
|
|
||||||
[gt]
|
|
||||||
[le]
|
|
||||||
[lt]
|
|
||||||
[ne]
|
|
||||||
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## genrec
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
**Gen**eral **Rec**ursion Combinator.
|
|
||||||
|
|
||||||
[if] [then] [rec1] [rec2] genrec
|
|
||||||
---------------------------------------------------------------------
|
|
||||||
[if] [then] [rec1 [[if] [then] [rec1] [rec2] genrec] rec2] ifte
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[\[[genrec]\] [ccccons]\] [nullary] [swons] [concat] [ifte]
|
|
||||||
|
|
||||||
(Note that this definition includes the `genrec` symbol itself, it is
|
|
||||||
self-referential. This is possible because the definition machinery does
|
|
||||||
not check that symbols in defs are in the dictionary. `genrec` is the
|
|
||||||
only self-referential definition.)
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
See the [Recursion Combinators notebook](https://joypy.osdn.io/notebooks/Recursion_Combinators.html).
|
|
||||||
|
|
||||||
From ["Recursion Theory and Joy"](https://www.kevinalbrecht.com/code/joy-mirror/j05cmp.html)
|
|
||||||
by Manfred von Thun:
|
|
||||||
|
|
||||||
> "The genrec combinator takes four program parameters in addition to
|
|
||||||
> whatever data parameters it needs. Fourth from the top is an if-part,
|
|
||||||
> followed by a then-part. If the if-part yields true, then the then-part
|
|
||||||
> is executed and the combinator terminates. The other two parameters are
|
|
||||||
> the rec1-part and the rec2-part. If the if-part yields false, the
|
|
||||||
> rec1-part is executed. Following that the four program parameters and
|
|
||||||
> the combinator are again pushed onto the stack bundled up in a quoted
|
|
||||||
> form. Then the rec2-part is executed, where it will find the bundled
|
|
||||||
> form. Typically it will then execute the bundled form, either with i
|
|
||||||
> or with app2, or some other combinator."
|
|
||||||
|
|
||||||
The way to design one of these is to fix your base case `[then]` and the
|
|
||||||
test `[if]`, and then treat `rec1` and `rec2` as an else-part
|
|
||||||
"sandwiching" a quotation of the whole function.
|
|
||||||
|
|
||||||
For example, given a (general recursive) function `F`:
|
|
||||||
|
|
||||||
F == [I] [T] [R1] [R2] genrec
|
|
||||||
|
|
||||||
If the `[I]` if-part fails you must derive `R1` and `R2` from: :
|
|
||||||
|
|
||||||
... R1 [F] R2
|
|
||||||
|
|
||||||
Just set the stack arguments in front, and figure out what `R1` and `R2`
|
|
||||||
have to do to apply the quoted `[F]` in the proper way. In effect, the
|
|
||||||
`genrec` combinator turns into an [ifte] combinator with a quoted copy of
|
|
||||||
the original definition in the else-part:
|
|
||||||
|
|
||||||
F == [I] [T] [R1] [R2] genrec
|
|
||||||
== [I] [T] [R1 [F] R2] ifte
|
|
||||||
|
|
||||||
Tail recursive functions are those where `R2` is the `i` combinator:
|
|
||||||
|
|
||||||
P == [I] [T] [R] tailrec
|
|
||||||
== [I] [T] [R [P] i] ifte
|
|
||||||
== [I] [T] [R P] ifte
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[anamorphism]
|
|
||||||
[tailrec]
|
|
||||||
[x]
|
|
||||||
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## getitem
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Expects an integer and a quote on the stack and returns the item at the
|
|
||||||
nth position in the quote counting from 0.
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
[a b c d] 2 getitem
|
|
||||||
-------------------------
|
|
||||||
c
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [drop] [first]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
If the number isn't a valid index into the quote `getitem` will cause
|
|
||||||
some sort of problem (the exact nature of which is
|
|
||||||
implementation-dependant.)
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[concat]
|
|
||||||
[first]
|
|
||||||
[first_two]
|
|
||||||
[flatten]
|
|
||||||
[fourth]
|
|
||||||
[remove]
|
|
||||||
[rest]
|
|
||||||
[reverse]
|
|
||||||
[rrest]
|
|
||||||
[second]
|
|
||||||
[shift]
|
|
||||||
[shunt]
|
|
||||||
[size]
|
|
||||||
[sort]
|
|
||||||
[split_at]
|
|
||||||
[split_list]
|
|
||||||
[swaack]
|
|
||||||
[third]
|
|
||||||
[zip]
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## grabN
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Expect a number on the top of the stack and [cons] that many items from under it onto a new list.
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
a b c d e 3 grabN
|
|
||||||
-----------------------
|
|
||||||
a b [c d e]
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [\<\{\}] \[[cons]\] [times]
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## grba
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
A weird function used in [app2] that does this:
|
|
||||||
|
|
||||||
... 1 2 3 4 5 grba
|
|
||||||
-------------------------------
|
|
||||||
... 1 2 3 [4 3 2 1 ...] 5
|
|
||||||
|
|
||||||
It grabs the stack under the top item, and substitutes it for the second item down on the stack.
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[stack] [popd]\] [dip]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This function "grabs" an item from the stack along with a copy of the stack.
|
|
||||||
It's part of the [app2] definition.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[app2]
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## gt
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Greater-than comparison of two numbers.
|
|
||||||
|
|
||||||
a b gt
|
|
||||||
--------------
|
|
||||||
Boolean
|
|
||||||
(a > b)
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[cmp]
|
|
||||||
[eq]
|
|
||||||
[ge]
|
|
||||||
[le]
|
|
||||||
[lt]
|
|
||||||
[ne]
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## help
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
Accepts a quoted symbol on the top of the stack and prints its
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
[foo] help
|
|
||||||
----------------
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Technically this is equivalent to `pop`, but it will only work if the
|
|
||||||
item on the top of the stack is a quoted symbol.
|
|
||||||
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## hypot
|
|
||||||
|
|
||||||
Function
|
|
||||||
|
|
||||||
x y hypot
|
|
||||||
---------------------------
|
|
||||||
sqrt(sqr(x) + sqr(y))
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[sqr]\] [ii] [+] [sqrt]
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This is another function that has to wait on the numeric tower.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[sqrt]
|
|
||||||
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
--------------------
|
|
||||||
|
|
||||||
## i
|
|
||||||
|
|
||||||
Basis Combinator
|
|
||||||
|
|
||||||
Append a quoted expression onto the pending expression.
|
|
||||||
|
|
||||||
|
|
||||||
[Q] . i
|
|
||||||
-------------
|
|
||||||
. Q
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This is a fundamental combinator. It is used in all kinds of places. For
|
|
||||||
example, the [x] combinator can be defined as `dup i`.
|
|
||||||
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## id
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
The identity function.
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
Does nothing. It's kind of a mathematical thing, but it occasionally comes in handy.
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## ifte
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
If-Then-Else combinator, a common and convenient specialization of [branch].
|
|
||||||
|
|
||||||
[if] [then] [else] ifte
|
|
||||||
---------------------------------------
|
|
||||||
[if] nullary [else] [then] branch
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[nullary]\] [dipd] [swap] [branch]
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[branch]
|
|
||||||
[loop]
|
|
||||||
[while]
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## ii
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Take a quoted program from the stack and run it twice, first under the
|
|
||||||
top item, then again with the top item.
|
|
||||||
|
|
||||||
... a [Q] ii
|
|
||||||
------------------
|
|
||||||
... Q a Q
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> \[[dip]\] [dupdip] [i]
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
It's a little tricky to understand how this works so here's an example trace:
|
|
||||||
|
|
||||||
1 2 3 4 [++] • [dip] dupdip i
|
|
||||||
1 2 3 4 [++] [dip] • dupdip i
|
|
||||||
1 2 3 4 [++] • dip [++] i
|
|
||||||
1 2 3 • ++ 4 [++] i
|
|
||||||
1 2 4 • 4 [++] i
|
|
||||||
1 2 4 4 • [++] i
|
|
||||||
1 2 4 4 [++] • i
|
|
||||||
1 2 4 4 • ++
|
|
||||||
1 2 4 5 •
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
In some cases (like the example above) this is the same effect as using [app2] but most of the time it's not:
|
|
||||||
|
|
||||||
1 2 3 4 [+] ii
|
|
||||||
--------------------
|
|
||||||
1 9
|
|
||||||
|
|
||||||
1 2 3 4 [+] app2
|
|
||||||
----------------------
|
|
||||||
1 2 5 6
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[app2]
|
|
||||||
[b]
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
--------------------
|
|
||||||
|
|
||||||
## infra
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Accept a quoted program and a list on the stack and run the program with
|
|
||||||
the list as its stack. Does not affect the stack (below the list.)
|
|
||||||
|
|
||||||
... x y z [a b c] [Q] infra
|
|
||||||
---------------------------------
|
|
||||||
c b a Q [z y x ...] swaack
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [swons] [swaack] \[[i]\] [dip] [swaack]
|
|
||||||
|
|
||||||
|
|
||||||
... [a b c] [F] swons swaack [i] dip swaack
|
|
||||||
... [[F] a b c] swaack [i] dip swaack
|
|
||||||
|
|
||||||
c b a [F] [...] [i] dip swaack
|
|
||||||
c b a [F] i [...] swaack
|
|
||||||
c b a F [...] swaack
|
|
||||||
d e [...] swaack
|
|
||||||
... [e d]
|
|
||||||
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This is one of the more useful combinators. It allows a quoted
|
|
||||||
expression to serve as a stack for a program, effectively running it in a
|
|
||||||
kind of "pocket universe". If the list represents a datastructure then
|
|
||||||
`infra` lets you work on its internal structure.
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[swaack](#swaack)
|
|
||||||
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## infrst
|
|
||||||
|
|
||||||
Combinator
|
|
||||||
|
|
||||||
Does [infra] and then extracts the [first] item from the resulting list.
|
|
||||||
|
|
||||||
### Definition
|
|
||||||
|
|
||||||
> [infra] [first]
|
|
||||||
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## inscribe
|
|
||||||
|
|
||||||
Create a new Joy function definition in the Joy dictionary. A definition
|
|
||||||
is given as a quote with a name followed by a Joy expression.
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
[sqr dup mul] inscribe
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This is the only function that modifies the dictionary. It's provided as a
|
|
||||||
convenience, for tinkering with new definitions before entering them into
|
|
||||||
the `defs.txt` file. It can be abused, which you should avoid unless you
|
|
||||||
know what you're doing.
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## le
|
|
||||||
|
|
||||||
Basis Function
|
|
||||||
|
|
||||||
Less-Than-or-Equal-to comparison of the two items on the top of the
|
|
||||||
stack, replacing them with a Boolean value.
|
|
||||||
|
|
||||||
a b le
|
|
||||||
-------------
|
|
||||||
Boolean
|
|
||||||
(a <= b)
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[cmp]
|
|
||||||
[eq]
|
|
||||||
[ge]
|
|
||||||
[gt]
|
|
||||||
[lt]
|
|
||||||
[ne]
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## loop
|
|
||||||
|
|
||||||
Basis Combinator
|
|
||||||
|
|
||||||
Expect a quoted program `Q` and a Boolean value on the stack. If the value is false
|
|
||||||
discard the quoted program, otherwise run a copy of `Q` and `loop` again.
|
|
||||||
|
|
||||||
false [Q] loop
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
|
|
||||||
true [Q] . loop
|
|
||||||
--------------------------
|
|
||||||
. Q [Q] loop
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
This, along with [branch] and [fork], is one of the four main combinators
|
|
||||||
of all programming. The fourth, sequence, is implied by juxtaposition.
|
|
||||||
That is to say, in Joy `F G` is like `G(F(...))` in a language bassed on
|
|
||||||
function application. Or again, to quote the [Joy Wikipedia
|
|
||||||
entry](https://en.wikipedia.org/wiki/Joy_(programming_language)#Mathematical_purity),
|
|
||||||
|
|
||||||
> In Joy, the meaning function is a homomorphism from the syntactic monoid onto the semantic monoid. That is, the syntactic relation of concatenation of symbols maps directly onto the semantic relation of composition of functions.
|
|
||||||
|
|
||||||
Anyway, [branch], [fork], amd [loop] are the fundamental combinators in Joy.
|
|
||||||
Just as [branch] has it's more common and convenient form [ifte],
|
|
||||||
[loop] has [while].
|
|
||||||
|
|
||||||
### Crosslinks
|
|
||||||
|
|
||||||
[branch]
|
|
||||||
[fork]
|
|
||||||
[while]
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue