T's and U's.
This commit is contained in:
parent
81f8ade4be
commit
a722f90072
|
|
@ -2276,256 +2276,226 @@ a F a</code></pre>
|
|||
</blockquote>
|
||||
<hr />
|
||||
<h2 id="tailrec">tailrec</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>[i] genrec</p>
|
||||
<p>Gentzen diagram.</p>
|
||||
<p>Combinator</p>
|
||||
<p>A specialization of the <a href="#genrec">genrec</a> combinator.</p>
|
||||
<h3 id="definition-92">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-3">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source">Source</h3>
|
||||
<p>if basis</p>
|
||||
<blockquote>
|
||||
<p>[<a href="#i">i</a>] <a href="#genrec">genrec</a></p>
|
||||
</blockquote>
|
||||
<h3 id="discussion-69">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<p>Some recursive functions do not need to store additional data or pending actions per-call. These are called <a href="https://en.wikipedia.org/wiki/Tail_recursive">“tail recursive” functions</a>. In Joy, they appear as <a href="#genrec">genrec</a> definitions that have <a href="#i">i</a> for the second half of their recursive branch.</p>
|
||||
<p>See the <a href="https://joypy.osdn.io/notebooks/Recursion_Combinators.html">Recursion Combinators notebook</a>.</p>
|
||||
<h3 id="crosslinks-109">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<p><a href="#genrec">genrec</a></p>
|
||||
<hr />
|
||||
<h2 id="take">take</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>Expects an integer and a quote on the stack and returns the quote with just the top n items in reverse order (because that's easier and you can use reverse if needed.) :</p>
|
||||
<pre><code>[a b c d] 2 take
|
||||
<p>Function</p>
|
||||
<p>Expects an integer <code>n</code> and a list on the stack and replace them with a list with just the top <code>n</code> items in reverse order.</p>
|
||||
<pre><code> [a b c d] 2 take
|
||||
----------------------
|
||||
[b a]</code></pre>
|
||||
<p>Gentzen diagram.</p>
|
||||
[b a]</code></pre>
|
||||
<h3 id="definition-93">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-4">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-1">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-70">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-110">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<blockquote>
|
||||
<p><a href="#section-18"><<{}</a> [<a href="#shift">shift</a>] <a href="#times">times</a> <a href="#pop">pop</a></p>
|
||||
</blockquote>
|
||||
<hr />
|
||||
<h2 id="ternary">ternary</h2>
|
||||
<p>(Combinator)</p>
|
||||
<p>Combinator</p>
|
||||
<p>Run a quoted program using exactly three stack values and leave the first item of the result on the stack.</p>
|
||||
<pre><code> ... z y x [P] unary
|
||||
<pre><code> ... z y x [P] ternary
|
||||
-------------------------
|
||||
... A</code></pre>
|
||||
... a</code></pre>
|
||||
<h3 id="definition-94">Definition</h3>
|
||||
<pre><code>binary popd</code></pre>
|
||||
<h3 id="discussion-71">Discussion</h3>
|
||||
<blockquote>
|
||||
<p><a href="#binary">binary</a> <a href="#popd">popd</a></p>
|
||||
</blockquote>
|
||||
<h3 id="discussion-70">Discussion</h3>
|
||||
<p>Runs any other quoted function and returns its first result while consuming exactly three items from the stack.</p>
|
||||
<h3 id="crosslinks-111">Crosslinks</h3>
|
||||
<h3 id="crosslinks-110">Crosslinks</h3>
|
||||
<p><a href="#binary">binary</a> <a href="#nullary">nullary</a> <a href="#unary">unary</a></p>
|
||||
<hr />
|
||||
<h2 id="third">third</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<pre><code>([a1 a2 a3 ...1] -- a3)</code></pre>
|
||||
<p>Gentzen diagram.</p>
|
||||
<p>Function</p>
|
||||
<pre><code> [a b c ...] third
|
||||
-----------------------
|
||||
c</code></pre>
|
||||
<h3 id="definition-95">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-5">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-2">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-72">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-112">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<blockquote>
|
||||
<p><a href="#rest">rest</a> <a href="#second">second</a></p>
|
||||
</blockquote>
|
||||
<h3 id="crosslinks-111">Crosslinks</h3>
|
||||
<p><a href="#first">first</a> <a href="#second">second</a> <a href="#fourth">fourth</a> <a href="#rest">rest</a></p>
|
||||
<hr />
|
||||
<h2 id="times">times</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>times == [-- dip] cons [swap] infra [0 >] swap while pop :</p>
|
||||
<pre><code>... n [Q] . times
|
||||
--------------------- w/ n <= 0
|
||||
... .
|
||||
<p>Combinator</p>
|
||||
<p>Expect a quoted program and an integer <code>n</code> on the stack and do the program <code>n</code> times.</p>
|
||||
<pre><code> ... n [Q] . times
|
||||
----------------------- w/ n <= 0
|
||||
... .
|
||||
|
||||
|
||||
... 1 [Q] . times
|
||||
... 1 [Q] . times
|
||||
-----------------------
|
||||
... . Q
|
||||
... . Q
|
||||
|
||||
|
||||
... n [Q] . times
|
||||
... n [Q] . times
|
||||
------------------------------------- w/ n > 1
|
||||
... . Q (n - 1) [Q] times</code></pre>
|
||||
<p>Gentzen diagram.</p>
|
||||
... . Q (n-1) [Q] times</code></pre>
|
||||
<h3 id="definition-96">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-6">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-3">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-73">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-113">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<blockquote>
|
||||
<p>[-- dip] cons [swap] infra [0 >] swap while pop :</p>
|
||||
</blockquote>
|
||||
<h3 id="discussion-71">Discussion</h3>
|
||||
<p>This works by building a little <a href="#while">while</a> program and running it:</p>
|
||||
<pre><code> 1 3 [++] • [-- dip] cons [swap] infra [0 >] swap while pop
|
||||
1 3 [++] [-- dip] • cons [swap] infra [0 >] swap while pop
|
||||
1 3 [[++] -- dip] • [swap] infra [0 >] swap while pop
|
||||
1 3 [[++] -- dip] [swap] • infra [0 >] swap while pop
|
||||
dip -- [++] • swap [3 1] swaack [0 >] swap while pop
|
||||
dip [++] -- • [3 1] swaack [0 >] swap while pop
|
||||
dip [++] -- [3 1] • swaack [0 >] swap while pop
|
||||
1 3 [-- [++] dip] • [0 >] swap while pop
|
||||
1 3 [-- [++] dip] [0 >] • swap while pop
|
||||
1 3 [0 >] [-- [++] dip] • while pop </code></pre>
|
||||
<p>This is a common pattern in Joy. You accept some parameters from the stack which typically include qouted programs and use them to build another program which does the actual work. This is kind of like macros in Lisp, or preprocessor directives in C.</p>
|
||||
<hr />
|
||||
<h2 id="truthy">truthy</h2>
|
||||
<p>See <a href="#bool">bool</a>.</p>
|
||||
<hr />
|
||||
<h2 id="tuck">tuck</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<pre><code>(a2 a1 -- a1 a2 a1)</code></pre>
|
||||
<p>Gentzen diagram.</p>
|
||||
<p>Function</p>
|
||||
<p><a href="#dup">dup</a> the item on the top of the stack under the second item on the stack.</p>
|
||||
<pre><code> a b tuck
|
||||
--------------
|
||||
b a b</code></pre>
|
||||
<h3 id="definition-97">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-7">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-4">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-74">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-114">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<blockquote>
|
||||
<p><a href="#dup">dup</a> [<a href="#swap">swap</a>] <a href="#dip">dip</a></p>
|
||||
</blockquote>
|
||||
<h3 id="crosslinks-112">Crosslinks</h3>
|
||||
<p><a href="#over">over</a></p>
|
||||
<hr />
|
||||
<h2 id="unary">unary</h2>
|
||||
<p>(Combinator)</p>
|
||||
<p>Run a quoted program using exactly one stack value and leave the first item of the result on the stack.</p>
|
||||
<pre><code> ... x [P] unary
|
||||
---------------------
|
||||
... A</code></pre>
|
||||
... a</code></pre>
|
||||
<h3 id="definition-98">Definition</h3>
|
||||
<pre><code>nullary popd</code></pre>
|
||||
<h3 id="discussion-75">Discussion</h3>
|
||||
<blockquote>
|
||||
<p><a href="#nullary">nullary</a> <a href="#popd">popd</a></p>
|
||||
</blockquote>
|
||||
<h3 id="discussion-72">Discussion</h3>
|
||||
<p>Runs any other quoted function and returns its first result while consuming exactly one item from the stack.</p>
|
||||
<h3 id="crosslinks-115">Crosslinks</h3>
|
||||
<h3 id="crosslinks-113">Crosslinks</h3>
|
||||
<p><a href="#binary">binary</a> <a href="#nullary">nullary</a> <a href="#ternary">ternary</a></p>
|
||||
<hr />
|
||||
<h2 id="uncons">uncons</h2>
|
||||
<p>(Basis Function)</p>
|
||||
<p>Basis Function</p>
|
||||
<p>Removes an item from a list and leaves it on the stack under the rest of the list. You cannot <code>uncons</code> an item from an empty list.</p>
|
||||
<pre><code> [A ...] uncons
|
||||
<pre><code> [a ...] uncons
|
||||
--------------------
|
||||
A [...]</code></pre>
|
||||
<h3 id="source-5">Source</h3>
|
||||
<pre><code>func(uncons, Si, So) :- func(cons, So, Si).</code></pre>
|
||||
<h3 id="discussion-76">Discussion</h3>
|
||||
<p>This is the inverse of <code>cons</code>.</p>
|
||||
<h3 id="crosslinks-116">Crosslinks</h3>
|
||||
a [...]</code></pre>
|
||||
<h3 id="discussion-73">Discussion</h3>
|
||||
<p>This is the inverse of <a href="#cons">cons</a>.</p>
|
||||
<h3 id="crosslinks-114">Crosslinks</h3>
|
||||
<p><a href="#cons">cons</a></p>
|
||||
<hr />
|
||||
<h2 id="unique">unique</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>Function</p>
|
||||
<p>Given a list remove duplicate items.</p>
|
||||
<p>Gentzen diagram.</p>
|
||||
<h3 id="definition-99">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-8">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-6">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-77">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-117">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<hr />
|
||||
<h2 id="unit">unit</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<pre><code>(a1 -- [a1 ])</code></pre>
|
||||
<p>Gentzen diagram.</p>
|
||||
<h3 id="definition-100">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-9">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-7">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-78">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-118">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<p>Function</p>
|
||||
<pre><code> a unit
|
||||
------------
|
||||
[a]</code></pre>
|
||||
<h3 id="definition-99">Definition</h3>
|
||||
<blockquote>
|
||||
<p>[] <a href="#cons">cons</a></p>
|
||||
</blockquote>
|
||||
<hr />
|
||||
<h2 id="unquoted">unquoted</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>[i] dip</p>
|
||||
<p>Gentzen diagram.</p>
|
||||
<h3 id="definition-101">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-10">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-8">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-79">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-119">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<p>Combinator</p>
|
||||
<p>Unquote (using <a href="#i">i</a>) the list that is second on the stack.</p>
|
||||
<h3 id="example-31">Example</h3>
|
||||
<pre><code> 1 2 [3 4] 5 unquoted
|
||||
--------------------------
|
||||
1 2 3 4 5</code></pre>
|
||||
<h3 id="definition-100">Definition</h3>
|
||||
<blockquote>
|
||||
<p>[<a href="#i">i</a>] <a href="#dip">dip</a></p>
|
||||
</blockquote>
|
||||
<h3 id="crosslinks-115">Crosslinks</h3>
|
||||
<p><a href="#unit">unit</a></p>
|
||||
<hr />
|
||||
<h2 id="unswons">unswons</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<pre><code>([a1 ...1] -- [...1] a1)</code></pre>
|
||||
<p>Gentzen diagram.</p>
|
||||
<h3 id="definition-102">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-11">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-9">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-80">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-120">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<p>Function</p>
|
||||
<pre><code> [a ...] unswons
|
||||
---------------------
|
||||
[...] a</code></pre>
|
||||
<h3 id="definition-101">Definition</h3>
|
||||
<blockquote>
|
||||
<p><a href="#uncons">uncons</a> <a href="#swap">swap</a></p>
|
||||
</blockquote>
|
||||
<hr />
|
||||
<h2 id="void">void</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>True if the form on TOS is void otherwise False.</p>
|
||||
<p>Gentzen diagram.</p>
|
||||
<h3 id="definition-103">Definition</h3>
|
||||
<h3 id="definition-102">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-12">Derivation</h3>
|
||||
<h3 id="derivation-3">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-10">Source</h3>
|
||||
<h3 id="source">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-81">Discussion</h3>
|
||||
<h3 id="discussion-74">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-121">Crosslinks</h3>
|
||||
<h3 id="crosslinks-116">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<hr />
|
||||
<h2 id="warranty">warranty</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>Print warranty information.</p>
|
||||
<p>Gentzen diagram.</p>
|
||||
<h3 id="definition-104">Definition</h3>
|
||||
<h3 id="definition-103">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-13">Derivation</h3>
|
||||
<h3 id="derivation-4">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-11">Source</h3>
|
||||
<h3 id="source-1">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-82">Discussion</h3>
|
||||
<h3 id="discussion-75">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-122">Crosslinks</h3>
|
||||
<h3 id="crosslinks-117">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<hr />
|
||||
<h2 id="while">while</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>swap nulco dupdipd concat loop</p>
|
||||
<p>Gentzen diagram.</p>
|
||||
<h3 id="definition-105">Definition</h3>
|
||||
<h3 id="definition-104">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-14">Derivation</h3>
|
||||
<h3 id="derivation-5">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-12">Source</h3>
|
||||
<h3 id="source-2">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-83">Discussion</h3>
|
||||
<h3 id="discussion-76">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-123">Crosslinks</h3>
|
||||
<h3 id="crosslinks-118">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<hr />
|
||||
<h2 id="words">words</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>Print all the words in alphabetical order.</p>
|
||||
<p>Gentzen diagram.</p>
|
||||
<h3 id="definition-106">Definition</h3>
|
||||
<h3 id="definition-105">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-15">Derivation</h3>
|
||||
<h3 id="derivation-6">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-13">Source</h3>
|
||||
<h3 id="source-3">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-84">Discussion</h3>
|
||||
<h3 id="discussion-77">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-124">Crosslinks</h3>
|
||||
<h3 id="crosslinks-119">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<hr />
|
||||
<h2 id="x">x</h2>
|
||||
|
|
@ -2533,39 +2503,39 @@ a F a</code></pre>
|
|||
<pre><code> [F] x
|
||||
-----------
|
||||
[F] F</code></pre>
|
||||
<h3 id="definition-107">Definition</h3>
|
||||
<h3 id="definition-106">Definition</h3>
|
||||
<pre><code>dup i</code></pre>
|
||||
<h3 id="discussion-85">Discussion</h3>
|
||||
<h3 id="discussion-78">Discussion</h3>
|
||||
<p>The <code>x</code> combinator …</p>
|
||||
<hr />
|
||||
<h2 id="xor">xor</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>Same as a ^ b.</p>
|
||||
<p>Gentzen diagram.</p>
|
||||
<h3 id="definition-108">Definition</h3>
|
||||
<h3 id="definition-107">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-16">Derivation</h3>
|
||||
<h3 id="derivation-7">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-14">Source</h3>
|
||||
<h3 id="source-4">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-86">Discussion</h3>
|
||||
<h3 id="discussion-79">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-125">Crosslinks</h3>
|
||||
<h3 id="crosslinks-120">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<hr />
|
||||
<h2 id="zip">zip</h2>
|
||||
<p>Basis Function Combinator</p>
|
||||
<p>Replace the two lists on the top of the stack with a list of the pairs from each list. The smallest list sets the length of the result list.</p>
|
||||
<p>Gentzen diagram.</p>
|
||||
<h3 id="definition-109">Definition</h3>
|
||||
<h3 id="definition-108">Definition</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="derivation-17">Derivation</h3>
|
||||
<h3 id="derivation-8">Derivation</h3>
|
||||
<p>if not basis.</p>
|
||||
<h3 id="source-15">Source</h3>
|
||||
<h3 id="source-5">Source</h3>
|
||||
<p>if basis</p>
|
||||
<h3 id="discussion-87">Discussion</h3>
|
||||
<h3 id="discussion-80">Discussion</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
<h3 id="crosslinks-126">Crosslinks</h3>
|
||||
<h3 id="crosslinks-121">Crosslinks</h3>
|
||||
<p>Lorem ipsum.</p>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -3656,85 +3656,62 @@ Like [cons] but [swap] the item and list.
|
|||
|
||||
## tailrec
|
||||
|
||||
Basis Function Combinator
|
||||
Combinator
|
||||
|
||||
\[i\] genrec
|
||||
|
||||
Gentzen diagram.
|
||||
A specialization of the [genrec] combinator.
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
> \[[i]\] [genrec]
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
Some recursive functions do not need to store additional data or pending
|
||||
actions per-call. These are called ["tail recursive" functions](https://en.wikipedia.org/wiki/Tail_recursive). In Joy,
|
||||
they appear as [genrec] definitions that have [i] for the second half of
|
||||
their recursive branch.
|
||||
|
||||
See the [Recursion Combinators notebook](https://joypy.osdn.io/notebooks/Recursion_Combinators.html).
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
[genrec]
|
||||
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
## take
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
Expects an integer and a quote on the stack and returns the quote with
|
||||
just the top n items in reverse order (because that\'s easier and you
|
||||
can use reverse if needed.) :
|
||||
Expects an integer `n` and a list on the stack and replace them with a list
|
||||
with just the top `n` items in reverse order.
|
||||
|
||||
[a b c d] 2 take
|
||||
[a b c d] 2 take
|
||||
----------------------
|
||||
[b a]
|
||||
|
||||
Gentzen diagram.
|
||||
[b a]
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
> [\<\<\{\}] \[[shift]\] [times] [pop]
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
--------------------
|
||||
|
||||
## ternary
|
||||
|
||||
(Combinator)
|
||||
|
||||
Combinator
|
||||
|
||||
Run a quoted program using exactly three stack values and leave the first
|
||||
item of the result on the stack.
|
||||
|
||||
... z y x [P] unary
|
||||
... z y x [P] ternary
|
||||
-------------------------
|
||||
... A
|
||||
... a
|
||||
|
||||
### Definition
|
||||
|
||||
binary popd
|
||||
> [binary] [popd]
|
||||
|
||||
### Discussion
|
||||
|
||||
|
|
@ -3752,75 +3729,70 @@ consuming exactly three items from the stack.
|
|||
|
||||
## third
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
([a1 a2 a3 ...1] -- a3)
|
||||
|
||||
Gentzen diagram.
|
||||
[a b c ...] third
|
||||
-----------------------
|
||||
c
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
> [rest] [second]
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
[first]
|
||||
[second]
|
||||
[fourth]
|
||||
[rest]
|
||||
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
## times
|
||||
|
||||
Basis Function Combinator
|
||||
Combinator
|
||||
|
||||
times == \[\-- dip\] cons \[swap\] infra \[0 \>\] swap while pop :
|
||||
Expect a quoted program and an integer `n` on the stack and do the
|
||||
program `n` times.
|
||||
|
||||
... n [Q] . times
|
||||
--------------------- w/ n <= 0
|
||||
... .
|
||||
... n [Q] . times
|
||||
----------------------- w/ n <= 0
|
||||
... .
|
||||
|
||||
|
||||
... 1 [Q] . times
|
||||
... 1 [Q] . times
|
||||
-----------------------
|
||||
... . Q
|
||||
... . Q
|
||||
|
||||
|
||||
... n [Q] . times
|
||||
... n [Q] . times
|
||||
------------------------------------- w/ n > 1
|
||||
... . Q (n - 1) [Q] times
|
||||
|
||||
Gentzen diagram.
|
||||
... . Q (n-1) [Q] times
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
> \[\-- dip\] cons \[swap\] infra \[0 \>\] swap while pop :
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
This works by building a little [while] program and running it:
|
||||
|
||||
### Crosslinks
|
||||
1 3 [++] • [-- dip] cons [swap] infra [0 >] swap while pop
|
||||
1 3 [++] [-- dip] • cons [swap] infra [0 >] swap while pop
|
||||
1 3 [[++] -- dip] • [swap] infra [0 >] swap while pop
|
||||
1 3 [[++] -- dip] [swap] • infra [0 >] swap while pop
|
||||
dip -- [++] • swap [3 1] swaack [0 >] swap while pop
|
||||
dip [++] -- • [3 1] swaack [0 >] swap while pop
|
||||
dip [++] -- [3 1] • swaack [0 >] swap while pop
|
||||
1 3 [-- [++] dip] • [0 >] swap while pop
|
||||
1 3 [-- [++] dip] [0 >] • swap while pop
|
||||
1 3 [0 >] [-- [++] dip] • while pop
|
||||
|
||||
This is a common pattern in Joy. You accept some parameters from the
|
||||
stack which typically include qouted programs and use them to build
|
||||
another program which does the actual work. This is kind of like macros
|
||||
in Lisp, or preprocessor directives in C.
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
--------------
|
||||
|
||||
|
|
@ -3833,31 +3805,23 @@ See [bool](#bool).
|
|||
|
||||
## tuck
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
(a2 a1 -- a1 a2 a1)
|
||||
[dup] the item on the top of the stack under the second item on the
|
||||
stack.
|
||||
|
||||
Gentzen diagram.
|
||||
a b tuck
|
||||
--------------
|
||||
b a b
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
> [dup] \[[swap]\] [dip]
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
[over]
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
|
|
@ -3865,15 +3829,16 @@ Lorem ipsum.
|
|||
|
||||
(Combinator)
|
||||
|
||||
Run a quoted program using exactly one stack value and leave the first item of the result on the stack.
|
||||
Run a quoted program using exactly one stack value and leave the first
|
||||
item of the result on the stack.
|
||||
|
||||
... x [P] unary
|
||||
---------------------
|
||||
... A
|
||||
... a
|
||||
|
||||
### Definition
|
||||
|
||||
nullary popd
|
||||
> [nullary] [popd]
|
||||
|
||||
### Discussion
|
||||
|
||||
|
|
@ -3891,147 +3856,85 @@ consuming exactly one item from the stack.
|
|||
|
||||
## uncons
|
||||
|
||||
(Basis Function)
|
||||
Basis Function
|
||||
|
||||
Removes an item from a list and leaves it on the stack under the rest of
|
||||
the list. You cannot `uncons` an item from an empty list.
|
||||
|
||||
[A ...] uncons
|
||||
[a ...] uncons
|
||||
--------------------
|
||||
A [...]
|
||||
|
||||
### Source
|
||||
|
||||
func(uncons, Si, So) :- func(cons, So, Si).
|
||||
a [...]
|
||||
|
||||
### Discussion
|
||||
|
||||
This is the inverse of `cons`.
|
||||
This is the inverse of [cons].
|
||||
|
||||
### Crosslinks
|
||||
|
||||
[cons](#cons)
|
||||
[cons]
|
||||
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
## unique
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
Given a list remove duplicate items.
|
||||
|
||||
Gentzen diagram.
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
## unit
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
(a1 -- [a1 ])
|
||||
|
||||
Gentzen diagram.
|
||||
a unit
|
||||
------------
|
||||
[a]
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
> \[\] [cons]
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
## unquoted
|
||||
|
||||
Basis Function Combinator
|
||||
Combinator
|
||||
|
||||
\[i\] dip
|
||||
Unquote (using [i]) the list that is second on the stack.
|
||||
|
||||
Gentzen diagram.
|
||||
### Example
|
||||
|
||||
1 2 [3 4] 5 unquoted
|
||||
--------------------------
|
||||
1 2 3 4 5
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
> \[[i]\] [dip]
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
[unit]
|
||||
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
## unswons
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
([a1 ...1] -- [...1] a1)
|
||||
|
||||
Gentzen diagram.
|
||||
[a ...] unswons
|
||||
---------------------
|
||||
[...] a
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
> [uncons] [swap]
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
|
|
|||
|
|
@ -2,28 +2,24 @@
|
|||
|
||||
## tailrec
|
||||
|
||||
Basis Function Combinator
|
||||
Combinator
|
||||
|
||||
\[i\] genrec
|
||||
|
||||
Gentzen diagram.
|
||||
A specialization of the [genrec] combinator.
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
> \[[i]\] [genrec]
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
Some recursive functions do not need to store additional data or pending
|
||||
actions per-call. These are called ["tail recursive" functions](https://en.wikipedia.org/wiki/Tail_recursive). In Joy,
|
||||
they appear as [genrec] definitions that have [i] for the second half of
|
||||
their recursive branch.
|
||||
|
||||
See the [Recursion Combinators notebook](https://joypy.osdn.io/notebooks/Recursion_Combinators.html).
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
[genrec]
|
||||
|
||||
|
|
|
|||
|
|
@ -2,34 +2,16 @@
|
|||
|
||||
## take
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
Expects an integer and a quote on the stack and returns the quote with
|
||||
just the top n items in reverse order (because that\'s easier and you
|
||||
can use reverse if needed.) :
|
||||
Expects an integer `n` and a list on the stack and replace them with a list
|
||||
with just the top `n` items in reverse order.
|
||||
|
||||
[a b c d] 2 take
|
||||
[a b c d] 2 take
|
||||
----------------------
|
||||
[b a]
|
||||
|
||||
Gentzen diagram.
|
||||
[b a]
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
> [\<\<\{\}] \[[shift]\] [times] [pop]
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
|
|
|
|||
|
|
@ -2,19 +2,18 @@
|
|||
|
||||
## ternary
|
||||
|
||||
(Combinator)
|
||||
|
||||
Combinator
|
||||
|
||||
Run a quoted program using exactly three stack values and leave the first
|
||||
item of the result on the stack.
|
||||
|
||||
... z y x [P] unary
|
||||
... z y x [P] ternary
|
||||
-------------------------
|
||||
... A
|
||||
... a
|
||||
|
||||
### Definition
|
||||
|
||||
binary popd
|
||||
> [binary] [popd]
|
||||
|
||||
### Discussion
|
||||
|
||||
|
|
|
|||
|
|
@ -2,28 +2,20 @@
|
|||
|
||||
## third
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
([a1 a2 a3 ...1] -- a3)
|
||||
|
||||
Gentzen diagram.
|
||||
[a b c ...] third
|
||||
-----------------------
|
||||
c
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
> [rest] [second]
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
[first]
|
||||
[second]
|
||||
[fourth]
|
||||
[rest]
|
||||
|
||||
|
|
|
|||
|
|
@ -2,42 +2,45 @@
|
|||
|
||||
## times
|
||||
|
||||
Basis Function Combinator
|
||||
Combinator
|
||||
|
||||
times == \[\-- dip\] cons \[swap\] infra \[0 \>\] swap while pop :
|
||||
Expect a quoted program and an integer `n` on the stack and do the
|
||||
program `n` times.
|
||||
|
||||
... n [Q] . times
|
||||
--------------------- w/ n <= 0
|
||||
... .
|
||||
... n [Q] . times
|
||||
----------------------- w/ n <= 0
|
||||
... .
|
||||
|
||||
|
||||
... 1 [Q] . times
|
||||
... 1 [Q] . times
|
||||
-----------------------
|
||||
... . Q
|
||||
... . Q
|
||||
|
||||
|
||||
... n [Q] . times
|
||||
... n [Q] . times
|
||||
------------------------------------- w/ n > 1
|
||||
... . Q (n - 1) [Q] times
|
||||
|
||||
Gentzen diagram.
|
||||
... . Q (n-1) [Q] times
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
> \[\-- dip\] cons \[swap\] infra \[0 \>\] swap while pop :
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
This works by building a little [while] program and running it:
|
||||
|
||||
### Crosslinks
|
||||
1 3 [++] • [-- dip] cons [swap] infra [0 >] swap while pop
|
||||
1 3 [++] [-- dip] • cons [swap] infra [0 >] swap while pop
|
||||
1 3 [[++] -- dip] • [swap] infra [0 >] swap while pop
|
||||
1 3 [[++] -- dip] [swap] • infra [0 >] swap while pop
|
||||
dip -- [++] • swap [3 1] swaack [0 >] swap while pop
|
||||
dip [++] -- • [3 1] swaack [0 >] swap while pop
|
||||
dip [++] -- [3 1] • swaack [0 >] swap while pop
|
||||
1 3 [-- [++] dip] • [0 >] swap while pop
|
||||
1 3 [-- [++] dip] [0 >] • swap while pop
|
||||
1 3 [0 >] [-- [++] dip] • while pop
|
||||
|
||||
This is a common pattern in Joy. You accept some parameters from the
|
||||
stack which typically include qouted programs and use them to build
|
||||
another program which does the actual work. This is kind of like macros
|
||||
in Lisp, or preprocessor directives in C.
|
||||
|
||||
Lorem ipsum.
|
||||
|
|
|
|||
|
|
@ -2,28 +2,20 @@
|
|||
|
||||
## tuck
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
(a2 a1 -- a1 a2 a1)
|
||||
[dup] the item on the top of the stack under the second item on the
|
||||
stack.
|
||||
|
||||
Gentzen diagram.
|
||||
a b tuck
|
||||
--------------
|
||||
b a b
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
> [dup] \[[swap]\] [dip]
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
[over]
|
||||
|
||||
|
|
|
|||
|
|
@ -4,15 +4,16 @@
|
|||
|
||||
(Combinator)
|
||||
|
||||
Run a quoted program using exactly one stack value and leave the first item of the result on the stack.
|
||||
Run a quoted program using exactly one stack value and leave the first
|
||||
item of the result on the stack.
|
||||
|
||||
... x [P] unary
|
||||
---------------------
|
||||
... A
|
||||
... a
|
||||
|
||||
### Definition
|
||||
|
||||
nullary popd
|
||||
> [nullary] [popd]
|
||||
|
||||
### Discussion
|
||||
|
||||
|
|
|
|||
|
|
@ -2,24 +2,20 @@
|
|||
|
||||
## uncons
|
||||
|
||||
(Basis Function)
|
||||
Basis Function
|
||||
|
||||
Removes an item from a list and leaves it on the stack under the rest of
|
||||
the list. You cannot `uncons` an item from an empty list.
|
||||
|
||||
[A ...] uncons
|
||||
[a ...] uncons
|
||||
--------------------
|
||||
A [...]
|
||||
|
||||
### Source
|
||||
|
||||
func(uncons, Si, So) :- func(cons, So, Si).
|
||||
a [...]
|
||||
|
||||
### Discussion
|
||||
|
||||
This is the inverse of `cons`.
|
||||
This is the inverse of [cons].
|
||||
|
||||
### Crosslinks
|
||||
|
||||
[cons](#cons)
|
||||
[cons]
|
||||
|
||||
|
|
|
|||
|
|
@ -2,28 +2,7 @@
|
|||
|
||||
## unique
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
Given a list remove duplicate items.
|
||||
|
||||
Gentzen diagram.
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
|
|
|
|||
|
|
@ -2,28 +2,13 @@
|
|||
|
||||
## unit
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
(a1 -- [a1 ])
|
||||
|
||||
Gentzen diagram.
|
||||
a unit
|
||||
------------
|
||||
[a]
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
> \[\] [cons]
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
|
|
|
|||
|
|
@ -2,28 +2,21 @@
|
|||
|
||||
## unquoted
|
||||
|
||||
Basis Function Combinator
|
||||
Combinator
|
||||
|
||||
\[i\] dip
|
||||
Unquote (using [i]) the list that is second on the stack.
|
||||
|
||||
Gentzen diagram.
|
||||
### Example
|
||||
|
||||
1 2 [3 4] 5 unquoted
|
||||
--------------------------
|
||||
1 2 3 4 5
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
> \[[i]\] [dip]
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
[unit]
|
||||
|
||||
|
|
|
|||
|
|
@ -2,28 +2,13 @@
|
|||
|
||||
## unswons
|
||||
|
||||
Basis Function Combinator
|
||||
Function
|
||||
|
||||
([a1 ...1] -- [...1] a1)
|
||||
|
||||
Gentzen diagram.
|
||||
[a ...] unswons
|
||||
---------------------
|
||||
[...] a
|
||||
|
||||
### Definition
|
||||
|
||||
if not basis.
|
||||
> [uncons] [swap]
|
||||
|
||||
### Derivation
|
||||
|
||||
if not basis.
|
||||
|
||||
### Source
|
||||
|
||||
if basis
|
||||
|
||||
### Discussion
|
||||
|
||||
Lorem ipsum.
|
||||
|
||||
### Crosslinks
|
||||
|
||||
Lorem ipsum.
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ swons swap cons
|
|||
swoncat swap concat
|
||||
sqr dup mul
|
||||
tailrec [i] genrec
|
||||
take [] roll> [shift] times pop
|
||||
take <<{} [shift] times pop
|
||||
ternary binary popd
|
||||
third rest second
|
||||
tuck dup swapd
|
||||
|
|
|
|||
Loading…
Reference in New Issue