Recover the square spiral example code.
I hve no idea how this isn't in VCS. I checked hg and git. Is it in an old branch that I deleted before merging or something? I have backups from which to restore, but it would be nice to know how I effed it up in the first place, eh?
This commit is contained in:
parent
f96013d649
commit
1b193b1924
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,554 @@
|
||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 1,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"from notebook_preamble import J, V, define"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"# Square Spiral Example Joy Code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"\n",
|
||||||
|
"Here is the example of Joy code from the `README` file:\n",
|
||||||
|
"\n",
|
||||||
|
" [[[abs]ii <=][[<>][pop !-]||]&&][[!-][[++]][[--]]ifte dip][[pop !-][--][++]ifte]ifte\n",
|
||||||
|
"\n",
|
||||||
|
"It might seem unreadable but with a little familiarity it becomes just as\n",
|
||||||
|
"legible as any other notation. Some layout helps:\n",
|
||||||
|
"\n",
|
||||||
|
" [ [[abs] ii <=]\n",
|
||||||
|
" [\n",
|
||||||
|
" [<>] [pop !-] ||\n",
|
||||||
|
" ] &&\n",
|
||||||
|
" ]\n",
|
||||||
|
" [[ !-] [[++]] [[--]] ifte dip]\n",
|
||||||
|
" [[pop !-] [--] [++] ifte ]\n",
|
||||||
|
" ifte\n",
|
||||||
|
"\n",
|
||||||
|
"This function accepts two integers on the stack and increments or\n",
|
||||||
|
"decrements one of them such that the new pair of numbers is the next\n",
|
||||||
|
"coordinate pair in a square spiral (like the kind used to construct an\n",
|
||||||
|
"Ulam Spiral). \n",
|
||||||
|
"\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Original Form\n",
|
||||||
|
"\n",
|
||||||
|
"It's adapted from [the original code on StackOverflow](https://stackoverflow.com/questions/398299/looping-in-a-spiral/31864777#31864777):\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"> If all you're trying to do is generate the first N points in the spiral\n",
|
||||||
|
"> (without the original problem's constraint of masking to an N x M\n",
|
||||||
|
"> region), the code becomes very simple:\n",
|
||||||
|
"\n",
|
||||||
|
" void spiral(const int N)\n",
|
||||||
|
" {\n",
|
||||||
|
" int x = 0;\n",
|
||||||
|
" int y = 0;\n",
|
||||||
|
" for(int i = 0; i < N; ++i)\n",
|
||||||
|
" {\n",
|
||||||
|
" cout << x << '\\t' << y << '\\n';\n",
|
||||||
|
" if(abs(x) <= abs(y) && (x != y || x >= 0))\n",
|
||||||
|
" x += ((y >= 0) ? 1 : -1);\n",
|
||||||
|
" else\n",
|
||||||
|
" y += ((x >= 0) ? -1 : 1);\n",
|
||||||
|
" }\n",
|
||||||
|
" }"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Translation to Joy\n",
|
||||||
|
"\n",
|
||||||
|
"I'm going to make a function that take two ints (`x` and `y`) and\n",
|
||||||
|
"generates the next pair, we'll turn it into a generator later using the\n",
|
||||||
|
"`x` combinator."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"### First Boolean Predicate\n",
|
||||||
|
"\n",
|
||||||
|
"We need a function that computes `abs(x) <= abs(y)`, we can use `ii` to\n",
|
||||||
|
"apply `abs` to both values and then compare them\n",
|
||||||
|
"with `<=`:\n",
|
||||||
|
"\n",
|
||||||
|
" [abs] ii <=\n",
|
||||||
|
"\n",
|
||||||
|
"I've defined two short-circuiting Boolean combinators `&&` and `||` that\n",
|
||||||
|
"each accept two quoted predicate programs, run the first, and\n",
|
||||||
|
"conditionally run the second only if required (to compute the final\n",
|
||||||
|
"Boolean value). They run their predicate arguments `nullary`."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 2,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"define('&& [nullary] cons [nullary [0]] dip branch')\n",
|
||||||
|
"define('|| [nullary] cons [nullary] dip [1] branch')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Given those, we can define `x != y || x >= 0` as:\n",
|
||||||
|
"\n",
|
||||||
|
" [<>] [pop 0 >=] ||\n",
|
||||||
|
"\n",
|
||||||
|
"And `(abs(x) <= abs(y) && (x != y || x >= 0))` as:\n",
|
||||||
|
"\n",
|
||||||
|
" [[abs] ii <=] [[<>] [pop 0 >=] ||] &&\n",
|
||||||
|
"\n",
|
||||||
|
"It's a little rough, but, as I say, with a little familiarity it becomes\n",
|
||||||
|
"legible."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"### The Increment / Decrement Branches\n",
|
||||||
|
"\n",
|
||||||
|
"Turning to the branches of the main `if` statement:\n",
|
||||||
|
"\n",
|
||||||
|
" x += ((y >= 0) ? 1 : -1);\n",
|
||||||
|
"\n",
|
||||||
|
"Rewrite as a hybrid (pseudo-code) `ifte` expression:\n",
|
||||||
|
"\n",
|
||||||
|
" [y >= 0] [x += 1] [X -= 1] ifte\n",
|
||||||
|
"\n",
|
||||||
|
"Change each C phrase to Joy code:\n",
|
||||||
|
"\n",
|
||||||
|
" [0 >=] [[++] dip] [[--] dip] ifte\n",
|
||||||
|
"\n",
|
||||||
|
"Factor out the dip from each branch:\n",
|
||||||
|
"\n",
|
||||||
|
" [0 >=] [[++]] [[--]] ifte dip\n",
|
||||||
|
"\n",
|
||||||
|
"Similar logic applies to the other branch:\n",
|
||||||
|
"\n",
|
||||||
|
" y += ((x >= 0) ? -1 : 1);\n",
|
||||||
|
"\n",
|
||||||
|
" [x >= 0] [y -= 1] [y += 1] ifte\n",
|
||||||
|
"\n",
|
||||||
|
" [pop 0 >=] [--] [++] ifte"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"### \"Not Negative\""
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 3,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"define('!- 0 >=')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Putting the Pieces Together\n",
|
||||||
|
"\n",
|
||||||
|
"We can assemble the three functions we just defined in quotes and give\n",
|
||||||
|
"them them to the `ifte` combinator. With some arrangement to show off\n",
|
||||||
|
"the symmetry of the two branches, we have:\n",
|
||||||
|
"\n",
|
||||||
|
" [[[abs] ii <=] [[<>] [pop !-] ||] &&]\n",
|
||||||
|
" [[ !-] [[++]] [[--]] ifte dip]\n",
|
||||||
|
" [[pop !-] [--] [++] ifte ]\n",
|
||||||
|
" ifte\n",
|
||||||
|
"\n",
|
||||||
|
"As I was writing this up I realized that, since the `&&` combinator\n",
|
||||||
|
"doesn't consume the stack (below its quoted args), I can unquote the\n",
|
||||||
|
"predicate, swap the branches, and use the `branch` combinator instead of\n",
|
||||||
|
"`ifte`:\n",
|
||||||
|
"\n",
|
||||||
|
" [[abs] ii <=] [[<>] [pop !-] ||] &&\n",
|
||||||
|
" [[pop !-] [--] [++] ifte ]\n",
|
||||||
|
" [[ !-] [[++]] [[--]] ifte dip]\n",
|
||||||
|
" branch"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 4,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"define('spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Let's try it out:"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 5,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"1 0\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"J('0 0 spiral_next')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 6,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"1 -1\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"J('1 0 spiral_next')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 7,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"0 -1\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"J('1 -1 spiral_next')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 8,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"-1 -1\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"J('0 -1 spiral_next')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Turning it into a Generator with `x`\n",
|
||||||
|
"\n",
|
||||||
|
"It can be used with the x combinator to make a kind of generator for\n",
|
||||||
|
"spiral square coordinates.\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"We can use `codireco` to make a generator\n",
|
||||||
|
"\n",
|
||||||
|
" codireco ::= cons dip rest cons\n",
|
||||||
|
"\n",
|
||||||
|
"It will look like this:\n",
|
||||||
|
"\n",
|
||||||
|
" [value [F] codireco]\n",
|
||||||
|
"\n",
|
||||||
|
"Here's a trace of how it works:\n",
|
||||||
|
"\n",
|
||||||
|
" [0 [dup ++] codireco] . x\n",
|
||||||
|
" [0 [dup ++] codireco] . 0 [dup ++] codireco\n",
|
||||||
|
" [0 [dup ++] codireco] 0 . [dup ++] codireco\n",
|
||||||
|
" [0 [dup ++] codireco] 0 [dup ++] . codireco\n",
|
||||||
|
" [0 [dup ++] codireco] 0 [dup ++] . cons dip rest cons\n",
|
||||||
|
" [0 [dup ++] codireco] [0 dup ++] . dip rest cons\n",
|
||||||
|
" . 0 dup ++ [0 [dup ++] codireco] rest cons\n",
|
||||||
|
" 0 . dup ++ [0 [dup ++] codireco] rest cons\n",
|
||||||
|
" 0 0 . ++ [0 [dup ++] codireco] rest cons\n",
|
||||||
|
" 0 1 . [0 [dup ++] codireco] rest cons\n",
|
||||||
|
" 0 1 [0 [dup ++] codireco] . rest cons\n",
|
||||||
|
" 0 1 [[dup ++] codireco] . cons\n",
|
||||||
|
" 0 [1 [dup ++] codireco] . "
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"But first we have to change the `spiral_next` function to work on a\n",
|
||||||
|
"quoted pair of integers, and leave a copy of the pair on the stack.\n",
|
||||||
|
"From:\n",
|
||||||
|
"\n",
|
||||||
|
" y x spiral_next\n",
|
||||||
|
" ---------------------\n",
|
||||||
|
" y' x'\n",
|
||||||
|
"\n",
|
||||||
|
"to:\n",
|
||||||
|
"\n",
|
||||||
|
" [x y] [spiral_next] infra\n",
|
||||||
|
" -------------------------------\n",
|
||||||
|
" [x' y']"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 9,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"[0 1]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"J('[0 0] [spiral_next] infra')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"So our generator is:\n",
|
||||||
|
"\n",
|
||||||
|
" [[x y] [dup [spiral_next] infra] codireco]\n",
|
||||||
|
"\n",
|
||||||
|
"Or rather:\n",
|
||||||
|
"\n",
|
||||||
|
" [[0 0] [dup [spiral_next] infra] codireco]\n",
|
||||||
|
"\n",
|
||||||
|
"There is a function `make_generator` that will build the generator for us\n",
|
||||||
|
"out of the value and stepper function:\n",
|
||||||
|
"\n",
|
||||||
|
" [0 0] [dup [spiral_next] infra] make_generator\n",
|
||||||
|
" ----------------------------------------------------\n",
|
||||||
|
" [[0 0] [dup [spiral_next] infra] codireco]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Here it is in action:"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 10,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"[0 0] [0 1] [-1 1] [-1 0]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"J('[0 0] [dup [spiral_next] infra] make_generator x x x x pop')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Four `x` combinators, four pairs of coordinates."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Conclusion\n",
|
||||||
|
"\n",
|
||||||
|
"So that's an example of Joy code. It's a straightforward translation of\n",
|
||||||
|
"the original. It's a little long for a single definition, you might\n",
|
||||||
|
"break it up like so:\n",
|
||||||
|
"\n",
|
||||||
|
" _spn_P ::= [[abs] ii <=] [[<>] [pop !-] ||] &&\n",
|
||||||
|
"\n",
|
||||||
|
" _spn_T ::= [ !-] [[++]] [[--]] ifte dip\n",
|
||||||
|
" _spn_E ::= [pop !-] [--] [++] ifte\n",
|
||||||
|
"\n",
|
||||||
|
" spiral_next ::= _spn_P [_spn_E] [_spn_T] branch\n",
|
||||||
|
"\n",
|
||||||
|
"This way it's easy to see that the function is a branch with two\n",
|
||||||
|
"quasi-symmetrical paths.\n",
|
||||||
|
"\n",
|
||||||
|
"We then used this function to make a simple generator of coordinate\n",
|
||||||
|
"pairs, where the next pair in the series can be generated at any time by\n",
|
||||||
|
"using the `x` combinator on the generator (which is just a quoted\n",
|
||||||
|
"expression containing a copy of the current pair and the \"stepper\n",
|
||||||
|
"function\" to generate the next pair from that.)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 11,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"define('_spn_P [[abs] ii <=] [[<>] [pop !-] ||] &&')\n",
|
||||||
|
"define('_spn_T [!-] [[++]] [[--]] ifte dip')\n",
|
||||||
|
"define('_spn_E [pop !-] [--] [++] ifte')\n",
|
||||||
|
"define('spiral_next _spn_P [_spn_E] [_spn_T] branch')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 12,
|
||||||
|
"metadata": {
|
||||||
|
"scrolled": true
|
||||||
|
},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
" . 23 18 spiral_next\n",
|
||||||
|
" 23 . 18 spiral_next\n",
|
||||||
|
" 23 18 . spiral_next\n",
|
||||||
|
" 23 18 . _spn_P [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 . [[abs] ii <=] [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [[abs] ii <=] . [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [[abs] ii <=] [[<>] [pop !-] ||] . && [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [[abs] ii <=] [[<>] [pop !-] ||] . [nullary] cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [[abs] ii <=] [[<>] [pop !-] ||] [nullary] . cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] . [nullary [0]] dip branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
"23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] [nullary [0]] . dip branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [[abs] ii <=] . nullary [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [[abs] ii <=] . [stack] dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [[abs] ii <=] [stack] . dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [[abs] ii <=] [stack] . dip infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 . stack [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [18 23] . [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [18 23] [[abs] ii <=] . infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 . [abs] ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [abs] . ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [abs] . [dip] dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [abs] [dip] . dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [abs] . dip [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 . abs 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 . 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 . [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [abs] . i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 . abs <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 . <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" False . [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" False [18 23] . swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 [False] . first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 False . [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 False [0] . [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 False [0] [[[<>] [pop !-] ||] nullary] . branch [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 . 0 [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 0 . [_spn_E] [_spn_T] branch\n",
|
||||||
|
" 23 18 0 [_spn_E] . [_spn_T] branch\n",
|
||||||
|
" 23 18 0 [_spn_E] [_spn_T] . branch\n",
|
||||||
|
" 23 18 . _spn_E\n",
|
||||||
|
" 23 18 . [pop !-] [--] [++] ifte\n",
|
||||||
|
" 23 18 [pop !-] . [--] [++] ifte\n",
|
||||||
|
" 23 18 [pop !-] [--] . [++] ifte\n",
|
||||||
|
" 23 18 [pop !-] [--] [++] . ifte\n",
|
||||||
|
" 23 18 [pop !-] [--] [++] . [nullary not] dipd branch\n",
|
||||||
|
" 23 18 [pop !-] [--] [++] [nullary not] . dipd branch\n",
|
||||||
|
" 23 18 [pop !-] . nullary not [--] [++] branch\n",
|
||||||
|
" 23 18 [pop !-] . [stack] dinfrirst not [--] [++] branch\n",
|
||||||
|
" 23 18 [pop !-] [stack] . dinfrirst not [--] [++] branch\n",
|
||||||
|
" 23 18 [pop !-] [stack] . dip infra first not [--] [++] branch\n",
|
||||||
|
" 23 18 . stack [pop !-] infra first not [--] [++] branch\n",
|
||||||
|
" 23 18 [18 23] . [pop !-] infra first not [--] [++] branch\n",
|
||||||
|
" 23 18 [18 23] [pop !-] . infra first not [--] [++] branch\n",
|
||||||
|
" 23 18 . pop !- [18 23] swaack first not [--] [++] branch\n",
|
||||||
|
" 23 . !- [18 23] swaack first not [--] [++] branch\n",
|
||||||
|
" 23 . 0 >= [18 23] swaack first not [--] [++] branch\n",
|
||||||
|
" 23 0 . >= [18 23] swaack first not [--] [++] branch\n",
|
||||||
|
" True . [18 23] swaack first not [--] [++] branch\n",
|
||||||
|
" True [18 23] . swaack first not [--] [++] branch\n",
|
||||||
|
" 23 18 [True] . first not [--] [++] branch\n",
|
||||||
|
" 23 18 True . not [--] [++] branch\n",
|
||||||
|
" 23 18 False . [--] [++] branch\n",
|
||||||
|
" 23 18 False [--] . [++] branch\n",
|
||||||
|
" 23 18 False [--] [++] . branch\n",
|
||||||
|
" 23 18 . --\n",
|
||||||
|
" 23 17 . \n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"V('23 18 spiral_next')"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 2",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python2"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.8.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 2
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,363 @@
|
||||||
|
```python
|
||||||
|
from notebook_preamble import J, V, define
|
||||||
|
```
|
||||||
|
|
||||||
|
# Square Spiral Example Joy Code
|
||||||
|
|
||||||
|
|
||||||
|
Here is the example of Joy code from the `README` file:
|
||||||
|
|
||||||
|
[[[abs]ii <=][[<>][pop !-]||]&&][[!-][[++]][[--]]ifte dip][[pop !-][--][++]ifte]ifte
|
||||||
|
|
||||||
|
It might seem unreadable but with a little familiarity it becomes just as
|
||||||
|
legible as any other notation. Some layout helps:
|
||||||
|
|
||||||
|
[ [[abs] ii <=]
|
||||||
|
[
|
||||||
|
[<>] [pop !-] ||
|
||||||
|
] &&
|
||||||
|
]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
|
||||||
|
This function accepts two integers on the stack and increments or
|
||||||
|
decrements one of them such that the new pair of numbers is the next
|
||||||
|
coordinate pair in a square spiral (like the kind used to construct an
|
||||||
|
Ulam Spiral).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Original Form
|
||||||
|
|
||||||
|
It's adapted from [the original code on StackOverflow](https://stackoverflow.com/questions/398299/looping-in-a-spiral/31864777#31864777):
|
||||||
|
|
||||||
|
|
||||||
|
> If all you're trying to do is generate the first N points in the spiral
|
||||||
|
> (without the original problem's constraint of masking to an N x M
|
||||||
|
> region), the code becomes very simple:
|
||||||
|
|
||||||
|
void spiral(const int N)
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
for(int i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
cout << x << '\t' << y << '\n';
|
||||||
|
if(abs(x) <= abs(y) && (x != y || x >= 0))
|
||||||
|
x += ((y >= 0) ? 1 : -1);
|
||||||
|
else
|
||||||
|
y += ((x >= 0) ? -1 : 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
## Translation to Joy
|
||||||
|
|
||||||
|
I'm going to make a function that take two ints (`x` and `y`) and
|
||||||
|
generates the next pair, we'll turn it into a generator later using the
|
||||||
|
`x` combinator.
|
||||||
|
|
||||||
|
### First Boolean Predicate
|
||||||
|
|
||||||
|
We need a function that computes `abs(x) <= abs(y)`, we can use `ii` to
|
||||||
|
apply `abs` to both values and then compare them
|
||||||
|
with `<=`:
|
||||||
|
|
||||||
|
[abs] ii <=
|
||||||
|
|
||||||
|
I've defined two short-circuiting Boolean combinators `&&` and `||` that
|
||||||
|
each accept two quoted predicate programs, run the first, and
|
||||||
|
conditionally run the second only if required (to compute the final
|
||||||
|
Boolean value). They run their predicate arguments `nullary`.
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
define('&& [nullary] cons [nullary [0]] dip branch')
|
||||||
|
define('|| [nullary] cons [nullary] dip [1] branch')
|
||||||
|
```
|
||||||
|
|
||||||
|
Given those, we can define `x != y || x >= 0` as:
|
||||||
|
|
||||||
|
[<>] [pop 0 >=] ||
|
||||||
|
|
||||||
|
And `(abs(x) <= abs(y) && (x != y || x >= 0))` as:
|
||||||
|
|
||||||
|
[[abs] ii <=] [[<>] [pop 0 >=] ||] &&
|
||||||
|
|
||||||
|
It's a little rough, but, as I say, with a little familiarity it becomes
|
||||||
|
legible.
|
||||||
|
|
||||||
|
### The Increment / Decrement Branches
|
||||||
|
|
||||||
|
Turning to the branches of the main `if` statement:
|
||||||
|
|
||||||
|
x += ((y >= 0) ? 1 : -1);
|
||||||
|
|
||||||
|
Rewrite as a hybrid (pseudo-code) `ifte` expression:
|
||||||
|
|
||||||
|
[y >= 0] [x += 1] [X -= 1] ifte
|
||||||
|
|
||||||
|
Change each C phrase to Joy code:
|
||||||
|
|
||||||
|
[0 >=] [[++] dip] [[--] dip] ifte
|
||||||
|
|
||||||
|
Factor out the dip from each branch:
|
||||||
|
|
||||||
|
[0 >=] [[++]] [[--]] ifte dip
|
||||||
|
|
||||||
|
Similar logic applies to the other branch:
|
||||||
|
|
||||||
|
y += ((x >= 0) ? -1 : 1);
|
||||||
|
|
||||||
|
[x >= 0] [y -= 1] [y += 1] ifte
|
||||||
|
|
||||||
|
[pop 0 >=] [--] [++] ifte
|
||||||
|
|
||||||
|
### "Not Negative"
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
define('!- 0 >=')
|
||||||
|
```
|
||||||
|
|
||||||
|
## Putting the Pieces Together
|
||||||
|
|
||||||
|
We can assemble the three functions we just defined in quotes and give
|
||||||
|
them them to the `ifte` combinator. With some arrangement to show off
|
||||||
|
the symmetry of the two branches, we have:
|
||||||
|
|
||||||
|
[[[abs] ii <=] [[<>] [pop !-] ||] &&]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
|
||||||
|
As I was writing this up I realized that, since the `&&` combinator
|
||||||
|
doesn't consume the stack (below its quoted args), I can unquote the
|
||||||
|
predicate, swap the branches, and use the `branch` combinator instead of
|
||||||
|
`ifte`:
|
||||||
|
|
||||||
|
[[abs] ii <=] [[<>] [pop !-] ||] &&
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
branch
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
define('spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte')
|
||||||
|
```
|
||||||
|
|
||||||
|
Let's try it out:
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
J('0 0 spiral_next')
|
||||||
|
```
|
||||||
|
|
||||||
|
1 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
J('1 0 spiral_next')
|
||||||
|
```
|
||||||
|
|
||||||
|
1 -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
J('1 -1 spiral_next')
|
||||||
|
```
|
||||||
|
|
||||||
|
0 -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
J('0 -1 spiral_next')
|
||||||
|
```
|
||||||
|
|
||||||
|
-1 -1
|
||||||
|
|
||||||
|
|
||||||
|
## Turning it into a Generator with `x`
|
||||||
|
|
||||||
|
It can be used with the x combinator to make a kind of generator for
|
||||||
|
spiral square coordinates.
|
||||||
|
|
||||||
|
|
||||||
|
We can use `codireco` to make a generator
|
||||||
|
|
||||||
|
codireco ::= cons dip rest cons
|
||||||
|
|
||||||
|
It will look like this:
|
||||||
|
|
||||||
|
[value [F] codireco]
|
||||||
|
|
||||||
|
Here's a trace of how it works:
|
||||||
|
|
||||||
|
[0 [dup ++] codireco] . x
|
||||||
|
[0 [dup ++] codireco] . 0 [dup ++] codireco
|
||||||
|
[0 [dup ++] codireco] 0 . [dup ++] codireco
|
||||||
|
[0 [dup ++] codireco] 0 [dup ++] . codireco
|
||||||
|
[0 [dup ++] codireco] 0 [dup ++] . cons dip rest cons
|
||||||
|
[0 [dup ++] codireco] [0 dup ++] . dip rest cons
|
||||||
|
. 0 dup ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 . dup ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 0 . ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 1 . [0 [dup ++] codireco] rest cons
|
||||||
|
0 1 [0 [dup ++] codireco] . rest cons
|
||||||
|
0 1 [[dup ++] codireco] . cons
|
||||||
|
0 [1 [dup ++] codireco] .
|
||||||
|
|
||||||
|
But first we have to change the `spiral_next` function to work on a
|
||||||
|
quoted pair of integers, and leave a copy of the pair on the stack.
|
||||||
|
From:
|
||||||
|
|
||||||
|
y x spiral_next
|
||||||
|
---------------------
|
||||||
|
y' x'
|
||||||
|
|
||||||
|
to:
|
||||||
|
|
||||||
|
[x y] [spiral_next] infra
|
||||||
|
-------------------------------
|
||||||
|
[x' y']
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
J('[0 0] [spiral_next] infra')
|
||||||
|
```
|
||||||
|
|
||||||
|
[0 1]
|
||||||
|
|
||||||
|
|
||||||
|
So our generator is:
|
||||||
|
|
||||||
|
[[x y] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
Or rather:
|
||||||
|
|
||||||
|
[[0 0] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
There is a function `make_generator` that will build the generator for us
|
||||||
|
out of the value and stepper function:
|
||||||
|
|
||||||
|
[0 0] [dup [spiral_next] infra] make_generator
|
||||||
|
----------------------------------------------------
|
||||||
|
[[0 0] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
Here it is in action:
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
J('[0 0] [dup [spiral_next] infra] make_generator x x x x pop')
|
||||||
|
```
|
||||||
|
|
||||||
|
[0 0] [0 1] [-1 1] [-1 0]
|
||||||
|
|
||||||
|
|
||||||
|
Four `x` combinators, four pairs of coordinates.
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
So that's an example of Joy code. It's a straightforward translation of
|
||||||
|
the original. It's a little long for a single definition, you might
|
||||||
|
break it up like so:
|
||||||
|
|
||||||
|
_spn_P ::= [[abs] ii <=] [[<>] [pop !-] ||] &&
|
||||||
|
|
||||||
|
_spn_T ::= [ !-] [[++]] [[--]] ifte dip
|
||||||
|
_spn_E ::= [pop !-] [--] [++] ifte
|
||||||
|
|
||||||
|
spiral_next ::= _spn_P [_spn_E] [_spn_T] branch
|
||||||
|
|
||||||
|
This way it's easy to see that the function is a branch with two
|
||||||
|
quasi-symmetrical paths.
|
||||||
|
|
||||||
|
We then used this function to make a simple generator of coordinate
|
||||||
|
pairs, where the next pair in the series can be generated at any time by
|
||||||
|
using the `x` combinator on the generator (which is just a quoted
|
||||||
|
expression containing a copy of the current pair and the "stepper
|
||||||
|
function" to generate the next pair from that.)
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
define('_spn_P [[abs] ii <=] [[<>] [pop !-] ||] &&')
|
||||||
|
define('_spn_T [!-] [[++]] [[--]] ifte dip')
|
||||||
|
define('_spn_E [pop !-] [--] [++] ifte')
|
||||||
|
define('spiral_next _spn_P [_spn_E] [_spn_T] branch')
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
V('23 18 spiral_next')
|
||||||
|
```
|
||||||
|
|
||||||
|
. 23 18 spiral_next
|
||||||
|
23 . 18 spiral_next
|
||||||
|
23 18 . spiral_next
|
||||||
|
23 18 . _spn_P [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [[abs] ii <=] [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] . && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] . [nullary] cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] [nullary] . cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] . [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] [nullary [0]] . dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . nullary [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . [stack] dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [stack] . dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [stack] . dip infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . stack [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [18 23] . [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [18 23] [[abs] ii <=] . infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [abs] ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . [dip] dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] [dip] . dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . dip [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 . abs 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 . 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . abs <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
False . [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
False [18 23] . swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [False] . first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False . [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False [0] . [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False [0] [[[<>] [pop !-] ||] nullary] . branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . 0 [_spn_E] [_spn_T] branch
|
||||||
|
23 18 0 . [_spn_E] [_spn_T] branch
|
||||||
|
23 18 0 [_spn_E] . [_spn_T] branch
|
||||||
|
23 18 0 [_spn_E] [_spn_T] . branch
|
||||||
|
23 18 . _spn_E
|
||||||
|
23 18 . [pop !-] [--] [++] ifte
|
||||||
|
23 18 [pop !-] . [--] [++] ifte
|
||||||
|
23 18 [pop !-] [--] . [++] ifte
|
||||||
|
23 18 [pop !-] [--] [++] . ifte
|
||||||
|
23 18 [pop !-] [--] [++] . [nullary not] dipd branch
|
||||||
|
23 18 [pop !-] [--] [++] [nullary not] . dipd branch
|
||||||
|
23 18 [pop !-] . nullary not [--] [++] branch
|
||||||
|
23 18 [pop !-] . [stack] dinfrirst not [--] [++] branch
|
||||||
|
23 18 [pop !-] [stack] . dinfrirst not [--] [++] branch
|
||||||
|
23 18 [pop !-] [stack] . dip infra first not [--] [++] branch
|
||||||
|
23 18 . stack [pop !-] infra first not [--] [++] branch
|
||||||
|
23 18 [18 23] . [pop !-] infra first not [--] [++] branch
|
||||||
|
23 18 [18 23] [pop !-] . infra first not [--] [++] branch
|
||||||
|
23 18 . pop !- [18 23] swaack first not [--] [++] branch
|
||||||
|
23 . !- [18 23] swaack first not [--] [++] branch
|
||||||
|
23 . 0 >= [18 23] swaack first not [--] [++] branch
|
||||||
|
23 0 . >= [18 23] swaack first not [--] [++] branch
|
||||||
|
True . [18 23] swaack first not [--] [++] branch
|
||||||
|
True [18 23] . swaack first not [--] [++] branch
|
||||||
|
23 18 [True] . first not [--] [++] branch
|
||||||
|
23 18 True . not [--] [++] branch
|
||||||
|
23 18 False . [--] [++] branch
|
||||||
|
23 18 False [--] . [++] branch
|
||||||
|
23 18 False [--] [++] . branch
|
||||||
|
23 18 . --
|
||||||
|
23 17 .
|
||||||
|
|
||||||
|
|
@ -0,0 +1,421 @@
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
Square Spiral Example Joy Code
|
||||||
|
==============================
|
||||||
|
|
||||||
|
Here is the example of Joy code from the ``README`` file:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[[abs]ii <=][[<>][pop !-]||]&&][[!-][[++]][[--]]ifte dip][[pop !-][--][++]ifte]ifte
|
||||||
|
|
||||||
|
It might seem unreadable but with a little familiarity it becomes just
|
||||||
|
as legible as any other notation. Some layout helps:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[ [[abs] ii <=]
|
||||||
|
[
|
||||||
|
[<>] [pop !-] ||
|
||||||
|
] &&
|
||||||
|
]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
|
||||||
|
This function accepts two integers on the stack and increments or
|
||||||
|
decrements one of them such that the new pair of numbers is the next
|
||||||
|
coordinate pair in a square spiral (like the kind used to construct an
|
||||||
|
Ulam Spiral).
|
||||||
|
|
||||||
|
Original Form
|
||||||
|
-------------
|
||||||
|
|
||||||
|
It's adapted from `the original code on
|
||||||
|
StackOverflow <https://stackoverflow.com/questions/398299/looping-in-a-spiral/31864777#31864777>`__:
|
||||||
|
|
||||||
|
If all you're trying to do is generate the first N points in the
|
||||||
|
spiral (without the original problem's constraint of masking to an N
|
||||||
|
x M region), the code becomes very simple:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
void spiral(const int N)
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
for(int i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
cout << x << '\t' << y << '\n';
|
||||||
|
if(abs(x) <= abs(y) && (x != y || x >= 0))
|
||||||
|
x += ((y >= 0) ? 1 : -1);
|
||||||
|
else
|
||||||
|
y += ((x >= 0) ? -1 : 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Translation to Joy
|
||||||
|
------------------
|
||||||
|
|
||||||
|
I'm going to make a function that take two ints (``x`` and ``y``) and
|
||||||
|
generates the next pair, we'll turn it into a generator later using the
|
||||||
|
``x`` combinator.
|
||||||
|
|
||||||
|
First Boolean Predicate
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
We need a function that computes ``abs(x) <= abs(y)``, we can use ``ii``
|
||||||
|
to apply ``abs`` to both values and then compare them with ``<=``:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[abs] ii <=
|
||||||
|
|
||||||
|
I've defined two short-circuiting Boolean combinators ``&&`` and ``||``
|
||||||
|
that each accept two quoted predicate programs, run the first, and
|
||||||
|
conditionally run the second only if required (to compute the final
|
||||||
|
Boolean value). They run their predicate arguments ``nullary``.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('&& [nullary] cons [nullary [0]] dip branch')
|
||||||
|
define('|| [nullary] cons [nullary] dip [1] branch')
|
||||||
|
|
||||||
|
Given those, we can define ``x != y || x >= 0`` as:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[<>] [pop 0 >=] ||
|
||||||
|
|
||||||
|
And ``(abs(x) <= abs(y) && (x != y || x >= 0))`` as:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[abs] ii <=] [[<>] [pop 0 >=] ||] &&
|
||||||
|
|
||||||
|
It's a little rough, but, as I say, with a little familiarity it becomes
|
||||||
|
legible.
|
||||||
|
|
||||||
|
The Increment / Decrement Branches
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Turning to the branches of the main ``if`` statement:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
x += ((y >= 0) ? 1 : -1);
|
||||||
|
|
||||||
|
Rewrite as a hybrid (pseudo-code) ``ifte`` expression:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[y >= 0] [x += 1] [X -= 1] ifte
|
||||||
|
|
||||||
|
Change each C phrase to Joy code:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 >=] [[++] dip] [[--] dip] ifte
|
||||||
|
|
||||||
|
Factor out the dip from each branch:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 >=] [[++]] [[--]] ifte dip
|
||||||
|
|
||||||
|
Similar logic applies to the other branch:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
y += ((x >= 0) ? -1 : 1);
|
||||||
|
|
||||||
|
[x >= 0] [y -= 1] [y += 1] ifte
|
||||||
|
|
||||||
|
[pop 0 >=] [--] [++] ifte
|
||||||
|
|
||||||
|
"Not Negative"
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('!- 0 >=')
|
||||||
|
|
||||||
|
Putting the Pieces Together
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
We can assemble the three functions we just defined in quotes and give
|
||||||
|
them them to the ``ifte`` combinator. With some arrangement to show off
|
||||||
|
the symmetry of the two branches, we have:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[[abs] ii <=] [[<>] [pop !-] ||] &&]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
|
||||||
|
As I was writing this up I realized that, since the ``&&`` combinator
|
||||||
|
doesn't consume the stack (below its quoted args), I can unquote the
|
||||||
|
predicate, swap the branches, and use the ``branch`` combinator instead
|
||||||
|
of ``ifte``:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[abs] ii <=] [[<>] [pop !-] ||] &&
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
branch
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte')
|
||||||
|
|
||||||
|
Let's try it out:
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('0 0 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
1 0
|
||||||
|
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('1 0 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
1 -1
|
||||||
|
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('1 -1 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
0 -1
|
||||||
|
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('0 -1 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
-1 -1
|
||||||
|
|
||||||
|
|
||||||
|
Turning it into a Generator with ``x``
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
It can be used with the x combinator to make a kind of generator for
|
||||||
|
spiral square coordinates.
|
||||||
|
|
||||||
|
We can use ``codireco`` to make a generator
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
codireco ::= cons dip rest cons
|
||||||
|
|
||||||
|
It will look like this:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[value [F] codireco]
|
||||||
|
|
||||||
|
Here's a trace of how it works:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 [dup ++] codireco] . x
|
||||||
|
[0 [dup ++] codireco] . 0 [dup ++] codireco
|
||||||
|
[0 [dup ++] codireco] 0 . [dup ++] codireco
|
||||||
|
[0 [dup ++] codireco] 0 [dup ++] . codireco
|
||||||
|
[0 [dup ++] codireco] 0 [dup ++] . cons dip rest cons
|
||||||
|
[0 [dup ++] codireco] [0 dup ++] . dip rest cons
|
||||||
|
. 0 dup ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 . dup ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 0 . ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 1 . [0 [dup ++] codireco] rest cons
|
||||||
|
0 1 [0 [dup ++] codireco] . rest cons
|
||||||
|
0 1 [[dup ++] codireco] . cons
|
||||||
|
0 [1 [dup ++] codireco] .
|
||||||
|
|
||||||
|
But first we have to change the ``spiral_next`` function to work on a
|
||||||
|
quoted pair of integers, and leave a copy of the pair on the stack.
|
||||||
|
From:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
y x spiral_next
|
||||||
|
---------------------
|
||||||
|
y' x'
|
||||||
|
|
||||||
|
to:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[x y] [spiral_next] infra
|
||||||
|
-------------------------------
|
||||||
|
[x' y']
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('[0 0] [spiral_next] infra')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
[0 1]
|
||||||
|
|
||||||
|
|
||||||
|
So our generator is:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[x y] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
Or rather:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[0 0] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
There is a function ``make_generator`` that will build the generator for
|
||||||
|
us out of the value and stepper function:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 0] [dup [spiral_next] infra] make_generator
|
||||||
|
----------------------------------------------------
|
||||||
|
[[0 0] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
Here it is in action:
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('[0 0] [dup [spiral_next] infra] make_generator x x x x pop')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
[0 0] [0 1] [-1 1] [-1 0]
|
||||||
|
|
||||||
|
|
||||||
|
Four ``x`` combinators, four pairs of coordinates.
|
||||||
|
|
||||||
|
Conclusion
|
||||||
|
----------
|
||||||
|
|
||||||
|
So that's an example of Joy code. It's a straightforward translation of
|
||||||
|
the original. It's a little long for a single definition, you might
|
||||||
|
break it up like so:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
_spn_P ::= [[abs] ii <=] [[<>] [pop !-] ||] &&
|
||||||
|
|
||||||
|
_spn_T ::= [ !-] [[++]] [[--]] ifte dip
|
||||||
|
_spn_E ::= [pop !-] [--] [++] ifte
|
||||||
|
|
||||||
|
spiral_next ::= _spn_P [_spn_E] [_spn_T] branch
|
||||||
|
|
||||||
|
This way it's easy to see that the function is a branch with two
|
||||||
|
quasi-symmetrical paths.
|
||||||
|
|
||||||
|
We then used this function to make a simple generator of coordinate
|
||||||
|
pairs, where the next pair in the series can be generated at any time by
|
||||||
|
using the ``x`` combinator on the generator (which is just a quoted
|
||||||
|
expression containing a copy of the current pair and the "stepper
|
||||||
|
function" to generate the next pair from that.)
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('_spn_P [[abs] ii <=] [[<>] [pop !-] ||] &&')
|
||||||
|
define('_spn_T [!-] [[++]] [[--]] ifte dip')
|
||||||
|
define('_spn_E [pop !-] [--] [++] ifte')
|
||||||
|
define('spiral_next _spn_P [_spn_E] [_spn_T] branch')
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
V('23 18 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
. 23 18 spiral_next
|
||||||
|
23 . 18 spiral_next
|
||||||
|
23 18 . spiral_next
|
||||||
|
23 18 . _spn_P [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [[abs] ii <=] [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] . && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] . [nullary] cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] [nullary] . cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] . [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] [nullary [0]] . dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . nullary [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . [stack] dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [stack] . dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [stack] . dip infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . stack [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [18 23] . [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [18 23] [[abs] ii <=] . infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [abs] ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . [dip] dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] [dip] . dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . dip [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 . abs 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 . 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . abs <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
False . [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
False [18 23] . swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [False] . first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False . [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False [0] . [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False [0] [[[<>] [pop !-] ||] nullary] . branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . 0 [_spn_E] [_spn_T] branch
|
||||||
|
23 18 0 . [_spn_E] [_spn_T] branch
|
||||||
|
23 18 0 [_spn_E] . [_spn_T] branch
|
||||||
|
23 18 0 [_spn_E] [_spn_T] . branch
|
||||||
|
23 18 . _spn_E
|
||||||
|
23 18 . [pop !-] [--] [++] ifte
|
||||||
|
23 18 [pop !-] . [--] [++] ifte
|
||||||
|
23 18 [pop !-] [--] . [++] ifte
|
||||||
|
23 18 [pop !-] [--] [++] . ifte
|
||||||
|
23 18 [pop !-] [--] [++] . [nullary not] dipd branch
|
||||||
|
23 18 [pop !-] [--] [++] [nullary not] . dipd branch
|
||||||
|
23 18 [pop !-] . nullary not [--] [++] branch
|
||||||
|
23 18 [pop !-] . [stack] dinfrirst not [--] [++] branch
|
||||||
|
23 18 [pop !-] [stack] . dinfrirst not [--] [++] branch
|
||||||
|
23 18 [pop !-] [stack] . dip infra first not [--] [++] branch
|
||||||
|
23 18 . stack [pop !-] infra first not [--] [++] branch
|
||||||
|
23 18 [18 23] . [pop !-] infra first not [--] [++] branch
|
||||||
|
23 18 [18 23] [pop !-] . infra first not [--] [++] branch
|
||||||
|
23 18 . pop !- [18 23] swaack first not [--] [++] branch
|
||||||
|
23 . !- [18 23] swaack first not [--] [++] branch
|
||||||
|
23 . 0 >= [18 23] swaack first not [--] [++] branch
|
||||||
|
23 0 . >= [18 23] swaack first not [--] [++] branch
|
||||||
|
True . [18 23] swaack first not [--] [++] branch
|
||||||
|
True [18 23] . swaack first not [--] [++] branch
|
||||||
|
23 18 [True] . first not [--] [++] branch
|
||||||
|
23 18 True . not [--] [++] branch
|
||||||
|
23 18 False . [--] [++] branch
|
||||||
|
23 18 False [--] . [++] branch
|
||||||
|
23 18 False [--] [++] . branch
|
||||||
|
23 18 . --
|
||||||
|
23 17 .
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -34,6 +34,31 @@ itself.
|
||||||
.. _Concatinative: https://en.wikipedia.org/wiki/Concatenative_programming_language
|
.. _Concatinative: https://en.wikipedia.org/wiki/Concatenative_programming_language
|
||||||
|
|
||||||
|
|
||||||
|
Example Code
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Here is an example of Joy code::
|
||||||
|
|
||||||
|
[[[abs]ii <=][[<>][pop !-]||]&&][[!-][[++]][[--]]ifte dip][[pop !-][--][++]ifte]ifte
|
||||||
|
|
||||||
|
It might seem unreadable but with a little familiarity it becomes just as
|
||||||
|
legible as any other notation. Some layout helps::
|
||||||
|
|
||||||
|
[ [[abs] ii <=]
|
||||||
|
[
|
||||||
|
[<>] [pop !-] ||
|
||||||
|
] &&
|
||||||
|
]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
|
||||||
|
This function accepts two integers on the stack and increments or
|
||||||
|
decrements one of them such that the new pair of numbers is the next
|
||||||
|
coordinate pair in a square spiral (like the kind used to construct an
|
||||||
|
Ulam Spiral). For more information see :doc:`notebooks/Square_Spiral`
|
||||||
|
|
||||||
|
|
||||||
Quick Start
|
Quick Start
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ E.g.:
|
||||||
Implementation
|
Implementation
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from functools import partial as curry
|
from functools import partial as curry
|
||||||
from itertools import product
|
from itertools import product
|
||||||
|
|
@ -86,7 +86,7 @@ Implementation
|
||||||
|
|
||||||
The empty set and the set of just the empty string.
|
The empty set and the set of just the empty string.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
phi = frozenset() # ϕ
|
phi = frozenset() # ϕ
|
||||||
y = frozenset({''}) # λ
|
y = frozenset({''}) # λ
|
||||||
|
|
@ -101,7 +101,7 @@ alphabet with two symbols (if you had to.)
|
||||||
I chose the names ``O`` and ``l`` (uppercase “o” and lowercase “L”) to
|
I chose the names ``O`` and ``l`` (uppercase “o” and lowercase “L”) to
|
||||||
look like ``0`` and ``1`` (zero and one) respectively.
|
look like ``0`` and ``1`` (zero and one) respectively.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
syms = O, l = frozenset({'0'}), frozenset({'1'})
|
syms = O, l = frozenset({'0'}), frozenset({'1'})
|
||||||
|
|
||||||
|
|
@ -123,7 +123,7 @@ expression* is one of:
|
||||||
|
|
||||||
Where ``R`` and ``S`` stand for *regular expressions*.
|
Where ``R`` and ``S`` stand for *regular expressions*.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
AND, CONS, KSTAR, NOT, OR = 'and cons * not or'.split() # Tags are just strings.
|
AND, CONS, KSTAR, NOT, OR = 'and cons * not or'.split() # Tags are just strings.
|
||||||
|
|
||||||
|
|
@ -133,7 +133,7 @@ only, these datastructures are immutable.
|
||||||
String Representation of RE Datastructures
|
String Representation of RE Datastructures
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def stringy(re):
|
def stringy(re):
|
||||||
'''
|
'''
|
||||||
|
|
@ -175,11 +175,11 @@ Match anything. Often spelled “.”
|
||||||
|
|
||||||
I = (0|1)*
|
I = (0|1)*
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
I = (KSTAR, (OR, O, l))
|
I = (KSTAR, (OR, O, l))
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print stringy(I)
|
print stringy(I)
|
||||||
|
|
||||||
|
|
@ -201,14 +201,14 @@ The example expression from Brzozowski:
|
||||||
|
|
||||||
Note that it contains one of everything.
|
Note that it contains one of everything.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
a = (CONS, I, (CONS, l, (CONS, l, (CONS, l, I))))
|
a = (CONS, I, (CONS, l, (CONS, l, (CONS, l, I))))
|
||||||
b = (CONS, I, (CONS, O, l))
|
b = (CONS, I, (CONS, O, l))
|
||||||
c = (CONS, l, (KSTAR, l))
|
c = (CONS, l, (KSTAR, l))
|
||||||
it = (AND, a, (NOT, (OR, b, c)))
|
it = (AND, a, (NOT, (OR, b, c)))
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print stringy(it)
|
print stringy(it)
|
||||||
|
|
||||||
|
|
@ -223,7 +223,7 @@ Note that it contains one of everything.
|
||||||
|
|
||||||
Let’s get that auxiliary predicate function ``δ`` out of the way.
|
Let’s get that auxiliary predicate function ``δ`` out of the way.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def nully(R):
|
def nully(R):
|
||||||
'''
|
'''
|
||||||
|
|
@ -263,7 +263,7 @@ This is the straightforward version with no “compaction”. It works fine,
|
||||||
but does waaaay too much work because the expressions grow each
|
but does waaaay too much work because the expressions grow each
|
||||||
derivation.
|
derivation.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def D(symbol):
|
def D(symbol):
|
||||||
|
|
||||||
|
|
@ -308,7 +308,7 @@ derivation.
|
||||||
Compaction Rules
|
Compaction Rules
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def _compaction_rule(relation, one, zero, a, b):
|
def _compaction_rule(relation, one, zero, a, b):
|
||||||
return (
|
return (
|
||||||
|
|
@ -320,7 +320,7 @@ Compaction Rules
|
||||||
|
|
||||||
An elegant symmetry.
|
An elegant symmetry.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
# R ∧ I = I ∧ R = R
|
# R ∧ I = I ∧ R = R
|
||||||
# R ∧ ϕ = ϕ ∧ R = ϕ
|
# R ∧ ϕ = ϕ ∧ R = ϕ
|
||||||
|
|
@ -341,7 +341,7 @@ We can save re-processing by remembering results we have already
|
||||||
computed. RE datastructures are immutable and the ``derv()`` functions
|
computed. RE datastructures are immutable and the ``derv()`` functions
|
||||||
are *pure* so this is fine.
|
are *pure* so this is fine.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class Memo(object):
|
class Memo(object):
|
||||||
|
|
||||||
|
|
@ -365,7 +365,7 @@ With “Compaction”
|
||||||
This version uses the rules above to perform compaction. It keeps the
|
This version uses the rules above to perform compaction. It keeps the
|
||||||
expressions from growing too large.
|
expressions from growing too large.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def D_compaction(symbol):
|
def D_compaction(symbol):
|
||||||
|
|
||||||
|
|
@ -414,7 +414,7 @@ Let’s try it out…
|
||||||
|
|
||||||
(FIXME: redo.)
|
(FIXME: redo.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
o, z = D_compaction('0'), D_compaction('1')
|
o, z = D_compaction('0'), D_compaction('1')
|
||||||
REs = set()
|
REs = set()
|
||||||
|
|
@ -533,10 +533,10 @@ machine transition table.
|
||||||
|
|
||||||
Says, “Three or more 1’s and not ending in 01 nor composed of all 1’s.”
|
Says, “Three or more 1’s and not ending in 01 nor composed of all 1’s.”
|
||||||
|
|
||||||
.. figure:: omg.svg
|
.. figure:: attachment:omg.svg
|
||||||
:alt: State Machine Graph
|
:alt: omg.svg
|
||||||
|
|
||||||
State Machine Graph
|
omg.svg
|
||||||
|
|
||||||
Start at ``a`` and follow the transition arrows according to their
|
Start at ``a`` and follow the transition arrows according to their
|
||||||
labels. Accepting states have a double outline. (Graphic generated with
|
labels. Accepting states have a double outline. (Graphic generated with
|
||||||
|
|
@ -605,20 +605,20 @@ You can see the one-way nature of the ``g`` state and the ``hij`` “trap”
|
||||||
in the way that the ``.111.`` on the left-hand side of the ``&``
|
in the way that the ``.111.`` on the left-hand side of the ``&``
|
||||||
disappears once it has been matched.
|
disappears once it has been matched.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
from string import ascii_lowercase
|
from string import ascii_lowercase
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
d0, d1 = D_compaction('0'), D_compaction('1')
|
d0, d1 = D_compaction('0'), D_compaction('1')
|
||||||
|
|
||||||
``explore()``
|
``explore()``
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def explore(re):
|
def explore(re):
|
||||||
|
|
||||||
|
|
@ -645,7 +645,7 @@ disappears once it has been matched.
|
||||||
|
|
||||||
return table, accepting
|
return table, accepting
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
table, accepting = explore(it)
|
table, accepting = explore(it)
|
||||||
table
|
table
|
||||||
|
|
@ -678,7 +678,7 @@ disappears once it has been matched.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
accepting
|
accepting
|
||||||
|
|
||||||
|
|
@ -697,7 +697,7 @@ Generate Diagram
|
||||||
Once we have the FSM table and the set of accepting states we can
|
Once we have the FSM table and the set of accepting states we can
|
||||||
generate the diagram above.
|
generate the diagram above.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
_template = '''\
|
_template = '''\
|
||||||
digraph finite_state_machine {
|
digraph finite_state_machine {
|
||||||
|
|
@ -722,7 +722,7 @@ generate the diagram above.
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print make_graph(table, accepting)
|
print make_graph(table, accepting)
|
||||||
|
|
||||||
|
|
@ -776,7 +776,7 @@ Trampoline Function
|
||||||
Python has no GOTO statement but we can fake it with a “trampoline”
|
Python has no GOTO statement but we can fake it with a “trampoline”
|
||||||
function.
|
function.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def trampoline(input_, jump_from, accepting):
|
def trampoline(input_, jump_from, accepting):
|
||||||
I = iter(input_)
|
I = iter(input_)
|
||||||
|
|
@ -793,7 +793,7 @@ Stream Functions
|
||||||
Little helpers to process the iterator of our data (a “stream” of “1”
|
Little helpers to process the iterator of our data (a “stream” of “1”
|
||||||
and “0” characters, not bits.)
|
and “0” characters, not bits.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
getch = lambda I: int(next(I))
|
getch = lambda I: int(next(I))
|
||||||
|
|
||||||
|
|
@ -816,7 +816,7 @@ code. (You have to imagine that these are GOTO statements in C or
|
||||||
branches in assembly and that the state names are branch destination
|
branches in assembly and that the state names are branch destination
|
||||||
labels.)
|
labels.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
a = lambda I: c if getch(I) else b
|
a = lambda I: c if getch(I) else b
|
||||||
b = lambda I: _0(I) or d
|
b = lambda I: _0(I) or d
|
||||||
|
|
@ -833,12 +833,12 @@ Note that the implementations of ``h`` and ``g`` are identical ergo
|
||||||
``h = g`` and we could eliminate one in the code but ``h`` is an
|
``h = g`` and we could eliminate one in the code but ``h`` is an
|
||||||
accepting state and ``g`` isn’t.
|
accepting state and ``g`` isn’t.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def acceptable(input_):
|
def acceptable(input_):
|
||||||
return trampoline(input_, a, {h, i})
|
return trampoline(input_, a, {h, i})
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for n in range(2**5):
|
for n in range(2**5):
|
||||||
s = bin(n)[2:]
|
s = bin(n)[2:]
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ Using ``x`` to Generate Values
|
||||||
|
|
||||||
Cf. jp-reprod.html
|
Cf. jp-reprod.html
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import J, V, define
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
|
@ -57,7 +57,7 @@ We can make a generator for the Natural numbers (0, 1, 2, …) by using
|
||||||
|
|
||||||
Let’s try it:
|
Let’s try it:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[0 swap [dup ++] dip rest cons] x')
|
V('[0 swap [dup ++] dip rest cons] x')
|
||||||
|
|
||||||
|
|
@ -81,7 +81,7 @@ Let’s try it:
|
||||||
After one application of ``x`` the quoted program contains ``1`` and
|
After one application of ``x`` the quoted program contains ``1`` and
|
||||||
``0`` is below it on the stack.
|
``0`` is below it on the stack.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[0 swap [dup ++] dip rest cons] x x x x x pop')
|
J('[0 swap [dup ++] dip rest cons] x x x x x pop')
|
||||||
|
|
||||||
|
|
@ -94,11 +94,11 @@ After one application of ``x`` the quoted program contains ``1`` and
|
||||||
``direco``
|
``direco``
|
||||||
----------
|
----------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('direco == dip rest cons')
|
define('direco == dip rest cons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[0 swap [dup ++] direco] x')
|
V('[0 swap [dup ++] direco] x')
|
||||||
|
|
||||||
|
|
@ -149,13 +149,13 @@ Reading from the bottom up:
|
||||||
G == [direco] cons [swap] swap concat cons
|
G == [direco] cons [swap] swap concat cons
|
||||||
G == [direco] cons [swap] swoncat cons
|
G == [direco] cons [swap] swoncat cons
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('G == [direco] cons [swap] swoncat cons')
|
define('G == [direco] cons [swap] swoncat cons')
|
||||||
|
|
||||||
Let’s try it out:
|
Let’s try it out:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('0 [dup ++] G')
|
J('0 [dup ++] G')
|
||||||
|
|
||||||
|
|
@ -165,7 +165,7 @@ Let’s try it out:
|
||||||
[0 swap [dup ++] direco]
|
[0 swap [dup ++] direco]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('0 [dup ++] G x x x pop')
|
J('0 [dup ++] G x x x pop')
|
||||||
|
|
||||||
|
|
@ -178,7 +178,7 @@ Let’s try it out:
|
||||||
Powers of 2
|
Powers of 2
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('1 [dup 1 <<] G x x x x x x x x x pop')
|
J('1 [dup 1 <<] G x x x x x x x x x pop')
|
||||||
|
|
||||||
|
|
@ -194,7 +194,7 @@ Powers of 2
|
||||||
If we have one of these quoted programs we can drive it using ``times``
|
If we have one of these quoted programs we can drive it using ``times``
|
||||||
with the ``x`` combinator.
|
with the ``x`` combinator.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('23 [dup ++] G 5 [x] times')
|
J('23 [dup ++] G 5 [x] times')
|
||||||
|
|
||||||
|
|
@ -226,11 +226,11 @@ int:
|
||||||
And pick them off by masking with 3 (binary 11) and then shifting the
|
And pick them off by masking with 3 (binary 11) and then shifting the
|
||||||
int right two bits.
|
int right two bits.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE1.1 == dup [3 &] dip 2 >>')
|
define('PE1.1 == dup [3 &] dip 2 >>')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('14811 PE1.1')
|
V('14811 PE1.1')
|
||||||
|
|
||||||
|
|
@ -252,7 +252,7 @@ int right two bits.
|
||||||
|
|
||||||
If we plug ``14811`` and ``[PE1.1]`` into our generator form…
|
If we plug ``14811`` and ``[PE1.1]`` into our generator form…
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('14811 [PE1.1] G')
|
J('14811 [PE1.1] G')
|
||||||
|
|
||||||
|
|
@ -264,7 +264,7 @@ If we plug ``14811`` and ``[PE1.1]`` into our generator form…
|
||||||
|
|
||||||
…we get a generator that works for seven cycles before it reaches zero:
|
…we get a generator that works for seven cycles before it reaches zero:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[14811 swap [PE1.1] direco] 7 [x] times')
|
J('[14811 swap [PE1.1] direco] 7 [x] times')
|
||||||
|
|
||||||
|
|
@ -280,11 +280,11 @@ Reset at Zero
|
||||||
We need a function that checks if the int has reached zero and resets it
|
We need a function that checks if the int has reached zero and resets it
|
||||||
if so.
|
if so.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE1.1.check == dup [pop 14811] [] branch')
|
define('PE1.1.check == dup [pop 14811] [] branch')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('14811 [PE1.1.check PE1.1] G')
|
J('14811 [PE1.1.check PE1.1] G')
|
||||||
|
|
||||||
|
|
@ -294,7 +294,7 @@ if so.
|
||||||
[14811 swap [PE1.1.check PE1.1] direco]
|
[14811 swap [PE1.1.check PE1.1] direco]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[14811 swap [PE1.1.check PE1.1] direco] 21 [x] times')
|
J('[14811 swap [PE1.1.check PE1.1] direco] 21 [x] times')
|
||||||
|
|
||||||
|
|
@ -316,7 +316,7 @@ In the PE1 problem we are asked to sum all the multiples of three and
|
||||||
five less than 1000. It’s worked out that we need to use all seven
|
five less than 1000. It’s worked out that we need to use all seven
|
||||||
numbers sixty-six times and then four more.
|
numbers sixty-six times and then four more.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('7 66 * 4 +')
|
J('7 66 * 4 +')
|
||||||
|
|
||||||
|
|
@ -328,7 +328,7 @@ numbers sixty-six times and then four more.
|
||||||
|
|
||||||
If we drive our generator 466 times and sum the stack we get 999.
|
If we drive our generator 466 times and sum the stack we get 999.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times')
|
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times')
|
||||||
|
|
||||||
|
|
@ -338,7 +338,7 @@ If we drive our generator 466 times and sum the stack we get 999.
|
||||||
3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 [57 swap [PE1.1.check PE1.1] direco]
|
3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 [57 swap [PE1.1.check PE1.1] direco]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times pop enstacken sum')
|
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times pop enstacken sum')
|
||||||
|
|
||||||
|
|
@ -351,13 +351,13 @@ If we drive our generator 466 times and sum the stack we get 999.
|
||||||
Project Euler Problem One
|
Project Euler Problem One
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE1.2 == + dup [+] dip')
|
define('PE1.2 == + dup [+] dip')
|
||||||
|
|
||||||
Now we can add ``PE1.2`` to the quoted program given to ``G``.
|
Now we can add ``PE1.2`` to the quoted program given to ``G``.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('0 0 0 [PE1.1.check PE1.1] G 466 [x [PE1.2] dip] times popop')
|
J('0 0 0 [PE1.1.check PE1.1] G 466 [x [PE1.2] dip] times popop')
|
||||||
|
|
||||||
|
|
@ -445,15 +445,15 @@ Putting it all together:
|
||||||
F == + [popdd over] cons infra uncons
|
F == + [popdd over] cons infra uncons
|
||||||
fib_gen == [1 1 F]
|
fib_gen == [1 1 F]
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('fib == + [popdd over] cons infra uncons')
|
define('fib == + [popdd over] cons infra uncons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('fib_gen == [1 1 fib]')
|
define('fib_gen == [1 1 fib]')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('fib_gen 10 [x] times')
|
J('fib_gen 10 [x] times')
|
||||||
|
|
||||||
|
|
@ -473,14 +473,14 @@ Now that we have a generator for the Fibonacci sequence, we need a
|
||||||
function that adds a term in the sequence to a sum if it is even, and
|
function that adds a term in the sequence to a sum if it is even, and
|
||||||
``pop``\ s it otherwise.
|
``pop``\ s it otherwise.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE2.1 == dup 2 % [+] [pop] branch')
|
define('PE2.1 == dup 2 % [+] [pop] branch')
|
||||||
|
|
||||||
And a predicate function that detects when the terms in the series
|
And a predicate function that detects when the terms in the series
|
||||||
“exceed four million”.
|
“exceed four million”.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('>4M == 4000000 >')
|
define('>4M == 4000000 >')
|
||||||
|
|
||||||
|
|
@ -488,11 +488,11 @@ Now it’s straightforward to define ``PE2`` as a recursive function that
|
||||||
generates terms in the Fibonacci sequence until they exceed four million
|
generates terms in the Fibonacci sequence until they exceed four million
|
||||||
and sums the even ones.
|
and sums the even ones.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE2 == 0 fib_gen x [pop >4M] [popop] [[PE2.1] dip x] primrec')
|
define('PE2 == 0 fib_gen x [pop >4M] [popop] [[PE2.1] dip x] primrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('PE2')
|
J('PE2')
|
||||||
|
|
||||||
|
|
@ -535,7 +535,7 @@ So the Fibonacci sequence considered in terms of just parity would be:
|
||||||
|
|
||||||
Every third term is even.
|
Every third term is even.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 0 fib] x x x') # To start the sequence with 1 1 2 3 instead of 1 2 3.
|
J('[1 0 fib] x x x') # To start the sequence with 1 1 2 3 instead of 1 2 3.
|
||||||
|
|
||||||
|
|
@ -547,7 +547,7 @@ Every third term is even.
|
||||||
|
|
||||||
Drive the generator three times and ``popop`` the two odd terms.
|
Drive the generator three times and ``popop`` the two odd terms.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 0 fib] x x x [popop] dipd')
|
J('[1 0 fib] x x x [popop] dipd')
|
||||||
|
|
||||||
|
|
@ -557,11 +557,11 @@ Drive the generator three times and ``popop`` the two odd terms.
|
||||||
2 [3 2 fib]
|
2 [3 2 fib]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE2.2 == x x x [popop] dipd')
|
define('PE2.2 == x x x [popop] dipd')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 0 fib] 10 [PE2.2] times')
|
J('[1 0 fib] 10 [PE2.2] times')
|
||||||
|
|
||||||
|
|
@ -574,7 +574,7 @@ Drive the generator three times and ``popop`` the two odd terms.
|
||||||
Replace ``x`` with our new driver function ``PE2.2`` and start our
|
Replace ``x`` with our new driver function ``PE2.2`` and start our
|
||||||
``fib`` generator at ``1 0``.
|
``fib`` generator at ``1 0``.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('0 [1 0 fib] PE2.2 [pop >4M] [popop] [[PE2.1] dip PE2.2] primrec')
|
J('0 [1 0 fib] PE2.2 [pop >4M] [popop] [[PE2.1] dip PE2.2] primrec')
|
||||||
|
|
||||||
|
|
@ -593,11 +593,11 @@ modifications to the default ``x``?
|
||||||
An Interesting Variation
|
An Interesting Variation
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('codireco == cons dip rest cons')
|
define('codireco == cons dip rest cons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[0 [dup ++] codireco] x')
|
V('[0 [dup ++] codireco] x')
|
||||||
|
|
||||||
|
|
@ -620,11 +620,11 @@ An Interesting Variation
|
||||||
0 [1 [dup ++] codireco] .
|
0 [1 [dup ++] codireco] .
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('G == [codireco] cons cons')
|
define('G == [codireco] cons cons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('230 [dup ++] G 5 [x] times pop')
|
J('230 [dup ++] G 5 [x] times pop')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ to write a function that can compute the square root of a number.
|
||||||
Cf. `"Why Functional Programming Matters" by John
|
Cf. `"Why Functional Programming Matters" by John
|
||||||
Hughes <https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf>`__
|
Hughes <https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf>`__
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
from notebook_preamble import J, V, define
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
|
@ -75,11 +75,11 @@ The generator can be written as:
|
||||||
1 [23 over / + 2 /] [dup] swoncat make_generator
|
1 [23 over / + 2 /] [dup] swoncat make_generator
|
||||||
1 [dup 23 over / + 2 /] make_generator
|
1 [dup 23 over / + 2 /] make_generator
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
define('gsra 1 swap [over / + 2 /] cons [dup] swoncat make_generator')
|
define('gsra 1 swap [over / + 2 /] cons [dup] swoncat make_generator')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
J('23 gsra')
|
J('23 gsra')
|
||||||
|
|
||||||
|
|
@ -92,7 +92,7 @@ The generator can be written as:
|
||||||
Let's drive the generator a few time (with the ``x`` combinator) and
|
Let's drive the generator a few time (with the ``x`` combinator) and
|
||||||
square the approximation to see how well it works...
|
square the approximation to see how well it works...
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
J('23 gsra 6 [x popd] times first sqr')
|
J('23 gsra 6 [x popd] times first sqr')
|
||||||
|
|
||||||
|
|
@ -142,7 +142,7 @@ Predicate
|
||||||
abs(a-b) ε <=
|
abs(a-b) ε <=
|
||||||
(abs(a-b)<=ε)
|
(abs(a-b)<=ε)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
define('_within_P [first - abs] dip <=')
|
define('_within_P [first - abs] dip <=')
|
||||||
|
|
||||||
|
|
@ -156,7 +156,7 @@ Base-Case
|
||||||
[b G] first
|
[b G] first
|
||||||
b
|
b
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
define('_within_B roll< popop first')
|
define('_within_B roll< popop first')
|
||||||
|
|
||||||
|
|
@ -184,7 +184,7 @@ Pretty straightforward:
|
||||||
|
|
||||||
b [c G] ε within
|
b [c G] ε within
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
define('_within_R [popd x] dip')
|
define('_within_R [popd x] dip')
|
||||||
|
|
||||||
|
|
@ -199,14 +199,14 @@ The recursive function we have defined so far needs a slight preamble:
|
||||||
[a G] x ε ...
|
[a G] x ε ...
|
||||||
a [b G] ε ...
|
a [b G] ε ...
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
define('within x 0.000000001 [_within_P] [_within_B] [_within_R] tailrec')
|
define('within x 0.000000001 [_within_P] [_within_B] [_within_R] tailrec')
|
||||||
define('sqrt gsra within')
|
define('sqrt gsra within')
|
||||||
|
|
||||||
Try it out...
|
Try it out...
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
J('36 sqrt')
|
J('36 sqrt')
|
||||||
|
|
||||||
|
|
@ -216,7 +216,7 @@ Try it out...
|
||||||
6.0
|
6.0
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
J('23 sqrt')
|
J('23 sqrt')
|
||||||
|
|
||||||
|
|
@ -228,7 +228,7 @@ Try it out...
|
||||||
|
|
||||||
Check it.
|
Check it.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
4.795831523312719**2
|
4.795831523312719**2
|
||||||
|
|
||||||
|
|
@ -241,7 +241,7 @@ Check it.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
from math import sqrt
|
from math import sqrt
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ implementation under the hood. (Where does the “type” come from? It has
|
||||||
a contingent existence predicated on the disciplined use of these
|
a contingent existence predicated on the disciplined use of these
|
||||||
functions on otherwise undistinguished Joy datastructures.)
|
functions on otherwise undistinguished Joy datastructures.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import D, J, V, define, DefinitionWrapper
|
from notebook_preamble import D, J, V, define, DefinitionWrapper
|
||||||
|
|
||||||
|
|
@ -87,11 +87,11 @@ Definition:
|
||||||
|
|
||||||
Tree-new == swap [[] []] cons cons
|
Tree-new == swap [[] []] cons cons
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Tree-new == swap [[] []] cons cons')
|
define('Tree-new == swap [[] []] cons cons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('"v" "k" Tree-new')
|
J('"v" "k" Tree-new')
|
||||||
|
|
||||||
|
|
@ -163,11 +163,11 @@ comparison operator:
|
||||||
P < == pop roll> pop first <
|
P < == pop roll> pop first <
|
||||||
P == pop roll> pop first
|
P == pop roll> pop first
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('P == pop roll> pop first')
|
define('P == pop roll> pop first')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["old_key" 23 [] []] 17 "new_key" ["..."] P')
|
J('["old_key" 23 [] []] 17 "new_key" ["..."] P')
|
||||||
|
|
||||||
|
|
@ -242,11 +242,11 @@ And so ``T`` is just:
|
||||||
|
|
||||||
T == cons cons [dipdd] cons infra
|
T == cons cons [dipdd] cons infra
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('T == cons cons [dipdd] cons infra')
|
define('T == cons cons [dipdd] cons infra')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] T')
|
J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] T')
|
||||||
|
|
||||||
|
|
@ -266,7 +266,7 @@ This is very very similar to the above:
|
||||||
[key_n value_n left right] value key [Tree-add] E
|
[key_n value_n left right] value key [Tree-add] E
|
||||||
[key_n value_n left right] value key [Tree-add] [P <] [Te] [Ee] ifte
|
[key_n value_n left right] value key [Tree-add] [P <] [Te] [Ee] ifte
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('E == [P <] [Te] [Ee] ifte')
|
define('E == [P <] [Te] [Ee] ifte')
|
||||||
|
|
||||||
|
|
@ -278,11 +278,11 @@ instead of the right, so the only difference is that it must use
|
||||||
|
|
||||||
Te == cons cons [dipd] cons infra
|
Te == cons cons [dipd] cons infra
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Te == cons cons [dipd] cons infra')
|
define('Te == cons cons [dipd] cons infra')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] Te')
|
J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] Te')
|
||||||
|
|
||||||
|
|
@ -320,11 +320,11 @@ Example:
|
||||||
key new_value [ left right] cons cons
|
key new_value [ left right] cons cons
|
||||||
[key new_value left right]
|
[key new_value left right]
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Ee == pop swap roll< rest rest cons cons')
|
define('Ee == pop swap roll< rest rest cons cons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee')
|
J('["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee')
|
||||||
|
|
||||||
|
|
@ -355,14 +355,14 @@ Putting it all together:
|
||||||
|
|
||||||
Tree-add == [popop not] [[pop] dipd Tree-new] [] [R] genrec
|
Tree-add == [popop not] [[pop] dipd Tree-new] [] [R] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [[P >] [T] [E] ifte] genrec')
|
define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [[P >] [T] [E] ifte] genrec')
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
~~~~~~~~
|
~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] 23 "b" Tree-add') # Initial
|
J('[] 23 "b" Tree-add') # Initial
|
||||||
|
|
||||||
|
|
@ -372,7 +372,7 @@ Examples
|
||||||
['b' 23 [] []]
|
['b' 23 [] []]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["b" 23 [] []] 88 "c" Tree-add') # Greater than
|
J('["b" 23 [] []] 88 "c" Tree-add') # Greater than
|
||||||
|
|
||||||
|
|
@ -382,7 +382,7 @@ Examples
|
||||||
['b' 23 [] ['c' 88 [] []]]
|
['b' 23 [] ['c' 88 [] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["b" 23 [] []] 88 "a" Tree-add') # Less than
|
J('["b" 23 [] []] 88 "a" Tree-add') # Less than
|
||||||
|
|
||||||
|
|
@ -392,7 +392,7 @@ Examples
|
||||||
['b' 23 ['a' 88 [] []] []]
|
['b' 23 ['a' 88 [] []] []]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["b" 23 [] []] 88 "b" Tree-add') # Equal to
|
J('["b" 23 [] []] 88 "b" Tree-add') # Equal to
|
||||||
|
|
||||||
|
|
@ -402,7 +402,7 @@ Examples
|
||||||
['b' 88 [] []]
|
['b' 88 [] []]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Series.
|
J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Series.
|
||||||
|
|
||||||
|
|
@ -412,7 +412,7 @@ Examples
|
||||||
['b' 23 ['a' 88 [] []] ['c' 44 [] []]]
|
['b' 23 ['a' 88 [] []] ['c' 44 [] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step')
|
J('[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step')
|
||||||
|
|
||||||
|
|
@ -444,7 +444,7 @@ values:
|
||||||
------------------------- a < b
|
------------------------- a < b
|
||||||
L
|
L
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("1 0 ['G'] ['E'] ['L'] cmp")
|
J("1 0 ['G'] ['E'] ['L'] cmp")
|
||||||
|
|
||||||
|
|
@ -454,7 +454,7 @@ values:
|
||||||
'G'
|
'G'
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("1 1 ['G'] ['E'] ['L'] cmp")
|
J("1 1 ['G'] ['E'] ['L'] cmp")
|
||||||
|
|
||||||
|
|
@ -464,7 +464,7 @@ values:
|
||||||
'E'
|
'E'
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("0 1 ['G'] ['E'] ['L'] cmp")
|
J("0 1 ['G'] ['E'] ['L'] cmp")
|
||||||
|
|
||||||
|
|
@ -514,7 +514,7 @@ Or just:
|
||||||
|
|
||||||
P == over [popop popop first] nullary
|
P == over [popop popop first] nullary
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('P == over [popop popop first] nullary')
|
define('P == over [popop popop first] nullary')
|
||||||
|
|
||||||
|
|
@ -541,11 +541,11 @@ to understand:
|
||||||
|
|
||||||
Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec
|
Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec')
|
define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Still works.
|
J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Still works.
|
||||||
|
|
||||||
|
|
@ -685,14 +685,14 @@ Working backward:
|
||||||
|
|
||||||
Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec
|
Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec')
|
define('Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec')
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
~~~~~~~~
|
~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] [foo] Tree-iter') # It doesn't matter what F is as it won't be used.
|
J('[] [foo] Tree-iter') # It doesn't matter what F is as it won't be used.
|
||||||
|
|
||||||
|
|
@ -702,7 +702,7 @@ Examples
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter")
|
J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter")
|
||||||
|
|
||||||
|
|
@ -712,7 +712,7 @@ Examples
|
||||||
'b' 'a' 'c'
|
'b' 'a' 'c'
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter")
|
J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter")
|
||||||
|
|
||||||
|
|
@ -731,7 +731,7 @@ to it will only occur once within it, and we can query it in
|
||||||
`:math:`O(\log_2 N)` <https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2>`__
|
`:math:`O(\log_2 N)` <https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2>`__
|
||||||
time.
|
time.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] [3 9 5 2 8 6 7 8 4] [0 swap Tree-add] step')
|
J('[] [3 9 5 2 8 6 7 8 4] [0 swap Tree-add] step')
|
||||||
|
|
||||||
|
|
@ -741,11 +741,11 @@ time.
|
||||||
[3 0 [2 0 [] []] [9 0 [5 0 [4 0 [] []] [8 0 [6 0 [] [7 0 [] []]] []]] []]]
|
[3 0 [2 0 [] []] [9 0 [5 0 [4 0 [] []] [8 0 [6 0 [] [7 0 [] []]] []]] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('to_set == [] swap [0 swap Tree-add] step')
|
define('to_set == [] swap [0 swap Tree-add] step')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[3 9 5 2 8 6 7 8 4] to_set')
|
J('[3 9 5 2 8 6 7 8 4] to_set')
|
||||||
|
|
||||||
|
|
@ -758,11 +758,11 @@ time.
|
||||||
And with that we can write a little program ``unique`` to remove
|
And with that we can write a little program ``unique`` to remove
|
||||||
duplicate items from a list.
|
duplicate items from a list.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('unique == [to_set [first] Tree-iter] cons run')
|
define('unique == [to_set [first] Tree-iter] cons run')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique') # Filter duplicate items.
|
J('[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique') # Filter duplicate items.
|
||||||
|
|
||||||
|
|
@ -872,7 +872,7 @@ Let’s do a little semantic factoring:
|
||||||
|
|
||||||
Now we can sort sequences.
|
Now we can sort sequences.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
#define('Tree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec')
|
#define('Tree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec')
|
||||||
|
|
||||||
|
|
@ -892,7 +892,7 @@ Now we can sort sequences.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[3 9 5 2 8 6 7 8 4] to_set Tree-iter-order')
|
J('[3 9 5 2 8 6 7 8 4] to_set Tree-iter-order')
|
||||||
|
|
||||||
|
|
@ -1070,7 +1070,7 @@ So:
|
||||||
|
|
||||||
Tree-get == [pop not] swap [] [P [T>] [E] [T<] cmp] genrec
|
Tree-get == [pop not] swap [] [P [T>] [E] [T<] cmp] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
# I don't want to deal with name conflicts with the above so I'm inlining everything here.
|
# I don't want to deal with name conflicts with the above so I'm inlining everything here.
|
||||||
# The original Joy system has "hide" which is a meta-command which allows you to use named
|
# The original Joy system has "hide" which is a meta-command which allows you to use named
|
||||||
|
|
@ -1088,7 +1088,7 @@ So:
|
||||||
] genrec
|
] genrec
|
||||||
''')
|
''')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get')
|
J('["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get')
|
||||||
|
|
||||||
|
|
@ -1098,7 +1098,7 @@ So:
|
||||||
'mike not in tree'
|
'mike not in tree'
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["gary" 23 [] []] "gary" [popop "err"] Tree-get')
|
J('["gary" 23 [] []] "gary" [popop "err"] Tree-get')
|
||||||
|
|
||||||
|
|
@ -1108,7 +1108,7 @@ So:
|
||||||
23
|
23
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('''
|
J('''
|
||||||
|
|
||||||
|
|
@ -1124,7 +1124,7 @@ So:
|
||||||
2
|
2
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('''
|
J('''
|
||||||
|
|
||||||
|
|
@ -1500,7 +1500,7 @@ Refactoring
|
||||||
By the standards of the code I’ve written so far, this is a *huge* Joy
|
By the standards of the code I’ve written so far, this is a *huge* Joy
|
||||||
program.
|
program.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
DefinitionWrapper.add_definitions('''
|
DefinitionWrapper.add_definitions('''
|
||||||
first_two == uncons uncons pop
|
first_two == uncons uncons pop
|
||||||
|
|
@ -1519,7 +1519,7 @@ program.
|
||||||
Tree-Delete == [pop not] [pop] [R0] [R1] genrec
|
Tree-Delete == [pop not] [pop] [R0] [R1] genrec
|
||||||
''', D)
|
''', D)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete ")
|
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete ")
|
||||||
|
|
||||||
|
|
@ -1529,7 +1529,7 @@ program.
|
||||||
['a' 23 [] ['b' 88 [] []]]
|
['a' 23 [] ['b' 88 [] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete ")
|
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete ")
|
||||||
|
|
||||||
|
|
@ -1539,7 +1539,7 @@ program.
|
||||||
['a' 23 [] ['c' 44 [] []]]
|
['a' 23 [] ['c' 44 [] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete ")
|
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete ")
|
||||||
|
|
||||||
|
|
@ -1549,7 +1549,7 @@ program.
|
||||||
['b' 88 [] ['c' 44 [] []]]
|
['b' 88 [] ['c' 44 [] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete ")
|
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete ")
|
||||||
|
|
||||||
|
|
@ -1559,7 +1559,7 @@ program.
|
||||||
['a' 23 [] ['b' 88 [] ['c' 44 [] []]]]
|
['a' 23 [] ['b' 88 [] ['c' 44 [] []]]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] [4 2 3 1 6 7 5 ] [0 swap Tree-add] step')
|
J('[] [4 2 3 1 6 7 5 ] [0 swap Tree-add] step')
|
||||||
|
|
||||||
|
|
@ -1569,7 +1569,7 @@ program.
|
||||||
[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]]
|
[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 3 Tree-Delete ")
|
J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 3 Tree-Delete ")
|
||||||
|
|
||||||
|
|
@ -1579,7 +1579,7 @@ program.
|
||||||
[4 0 [2 0 [1 0 [] []] []] [6 0 [5 0 [] []] [7 0 [] []]]]
|
[4 0 [2 0 [1 0 [] []] []] [6 0 [5 0 [] []] [7 0 [] []]]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 4 Tree-Delete ")
|
J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 4 Tree-Delete ")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import J, V, define
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
|
@ -81,13 +81,13 @@ the variables:
|
||||||
The three arguments are to the left, so we can “chop off” everything to
|
The three arguments are to the left, so we can “chop off” everything to
|
||||||
the right and say it’s the definition of the ``quadratic`` function:
|
the right and say it’s the definition of the ``quadratic`` function:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2')
|
define('quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2')
|
||||||
|
|
||||||
Let’s try it out:
|
Let’s try it out:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('3 1 1 quadratic')
|
J('3 1 1 quadratic')
|
||||||
|
|
||||||
|
|
@ -102,7 +102,7 @@ lines are the ``dip`` and ``dipd`` combinators building the main program
|
||||||
by incorporating the values on the stack. Then that program runs and you
|
by incorporating the values on the stack. Then that program runs and you
|
||||||
get the results. This is pretty typical of Joy code.
|
get the results. This is pretty typical of Joy code.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('-5 1 4 quadratic')
|
V('-5 1 4 quadratic')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import D, DefinitionWrapper, J, V, define
|
from notebook_preamble import D, DefinitionWrapper, J, V, define
|
||||||
|
|
||||||
|
|
@ -80,7 +80,7 @@ is a recursive function ``H :: A -> C`` that converts a value of type
|
||||||
It may be helpful to see this function implemented in imperative Python
|
It may be helpful to see this function implemented in imperative Python
|
||||||
code.
|
code.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def hylomorphism(c, F, P, G):
|
def hylomorphism(c, F, P, G):
|
||||||
'''Return a hylomorphism function H.'''
|
'''Return a hylomorphism function H.'''
|
||||||
|
|
@ -185,7 +185,7 @@ the left so we have a definition for ``hylomorphism``:
|
||||||
|
|
||||||
hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec
|
hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec')
|
define('hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec')
|
||||||
|
|
||||||
|
|
@ -203,13 +203,13 @@ To sum a range of integers from 0 to *n* - 1:
|
||||||
- ``[G]`` is ``[-- dup]``
|
- ``[G]`` is ``[-- dup]``
|
||||||
- ``[F]`` is ``[+]``
|
- ``[F]`` is ``[+]``
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism')
|
define('triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism')
|
||||||
|
|
||||||
Let’s try it:
|
Let’s try it:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 triangular_number')
|
J('5 triangular_number')
|
||||||
|
|
||||||
|
|
@ -219,7 +219,7 @@ Let’s try it:
|
||||||
10
|
10
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[0 1 2 3 4 5 6] [triangular_number] map')
|
J('[0 1 2 3 4 5 6] [triangular_number] map')
|
||||||
|
|
||||||
|
|
@ -391,10 +391,8 @@ values.
|
||||||
|
|
||||||
A == [P] [] [G] [swons] hylomorphism
|
A == [P] [] [G] [swons] hylomorphism
|
||||||
|
|
||||||
``range`` et. al.
|
``range`` et. al. An example of an anamorphism is the ``range`` function which generates the list of integers from 0 to *n* - 1 given *n*.
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
An example of an anamorphism is the ``range`` function which generates the list of integers from 0 to *n* - 1 given *n*.
|
|
||||||
|
|
||||||
Each of the above variations can be used to make four slightly different
|
Each of the above variations can be used to make four slightly different
|
||||||
``range`` functions.
|
``range`` functions.
|
||||||
|
|
@ -407,11 +405,11 @@ Each of the above variations can be used to make four slightly different
|
||||||
H1 == [P] [pop c] [G] [dip F] genrec
|
H1 == [P] [pop c] [G] [dip F] genrec
|
||||||
== [0 <=] [pop []] [-- dup] [dip swons] genrec
|
== [0 <=] [pop []] [-- dup] [dip swons] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('range == [0 <=] [] [-- dup] [swons] hylomorphism')
|
define('range == [0 <=] [] [-- dup] [swons] hylomorphism')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 range')
|
J('5 range')
|
||||||
|
|
||||||
|
|
@ -429,11 +427,11 @@ Each of the above variations can be used to make four slightly different
|
||||||
H2 == c swap [P] [pop] [G [F] dip] primrec
|
H2 == c swap [P] [pop] [G [F] dip] primrec
|
||||||
== [] swap [0 <=] [pop] [-- dup [swons] dip] primrec
|
== [] swap [0 <=] [pop] [-- dup [swons] dip] primrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec')
|
define('range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 range_reverse')
|
J('5 range_reverse')
|
||||||
|
|
||||||
|
|
@ -451,11 +449,11 @@ Each of the above variations can be used to make four slightly different
|
||||||
H3 == [P] [pop c] [[G] dupdip] [dip F] genrec
|
H3 == [P] [pop c] [[G] dupdip] [dip F] genrec
|
||||||
== [0 <=] [pop []] [[--] dupdip] [dip swons] genrec
|
== [0 <=] [pop []] [[--] dupdip] [dip swons] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec')
|
define('ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 ranger')
|
J('5 ranger')
|
||||||
|
|
||||||
|
|
@ -473,11 +471,11 @@ Each of the above variations can be used to make four slightly different
|
||||||
H4 == c swap [P] [pop] [[F] dupdip G ] primrec
|
H4 == c swap [P] [pop] [[F] dupdip G ] primrec
|
||||||
== [] swap [0 <=] [pop] [[swons] dupdip --] primrec
|
== [] swap [0 <=] [pop] [[swons] dupdip --] primrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec')
|
define('ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 ranger_reverse')
|
J('5 ranger_reverse')
|
||||||
|
|
||||||
|
|
@ -503,7 +501,7 @@ and makes some new value.
|
||||||
|
|
||||||
C == [not] c [uncons swap] [F] hylomorphism
|
C == [not] c [uncons swap] [F] hylomorphism
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('swuncons == uncons swap') # Awkward name.
|
define('swuncons == uncons swap') # Awkward name.
|
||||||
|
|
||||||
|
|
@ -513,11 +511,11 @@ An example of a catamorphism is the sum function.
|
||||||
|
|
||||||
sum == [not] 0 [swuncons] [+] hylomorphism
|
sum == [not] 0 [swuncons] [+] hylomorphism
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('sum == [not] 0 [swuncons] [+] hylomorphism')
|
define('sum == [not] 0 [swuncons] [+] hylomorphism')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[5 4 3 2 1] sum')
|
J('[5 4 3 2 1] sum')
|
||||||
|
|
||||||
|
|
@ -533,7 +531,7 @@ The ``step`` combinator
|
||||||
The ``step`` combinator will usually be better to use than
|
The ``step`` combinator will usually be better to use than
|
||||||
``catamorphism``.
|
``catamorphism``.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[step] help')
|
J('[step] help')
|
||||||
|
|
||||||
|
|
@ -562,11 +560,11 @@ The ``step`` combinator will usually be better to use than
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('sum == 0 swap [+] step')
|
define('sum == 0 swap [+] step')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[5 4 3 2 1] sum')
|
J('[5 4 3 2 1] sum')
|
||||||
|
|
||||||
|
|
@ -594,11 +592,11 @@ With:
|
||||||
G == --
|
G == --
|
||||||
P == 1 <=
|
P == 1 <=
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec')
|
define('factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 factorial')
|
J('5 factorial')
|
||||||
|
|
||||||
|
|
@ -637,11 +635,11 @@ We would use:
|
||||||
G == rest dup
|
G == rest dup
|
||||||
P == not
|
P == not
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('tails == [] swap [not] [pop] [rest dup [swons] dip] primrec')
|
define('tails == [] swap [not] [pop] [rest dup [swons] dip] primrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 2 3] tails')
|
J('[1 2 3] tails')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,14 @@ dictionary. However, there’s no function that does that. Adding a new
|
||||||
function to the dictionary is a meta-interpreter action, you have to do
|
function to the dictionary is a meta-interpreter action, you have to do
|
||||||
it in Python, not Joy.
|
it in Python, not Joy.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import D, J, V
|
from notebook_preamble import D, J, V
|
||||||
|
|
||||||
A long trace
|
A long trace
|
||||||
------------
|
------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[23 18] average')
|
V('[23 18] average')
|
||||||
|
|
||||||
|
|
@ -81,7 +81,7 @@ An efficient ``sum`` function is already in the library. But for
|
||||||
``size`` we can use a “compiled” version hand-written in Python to speed
|
``size`` we can use a “compiled” version hand-written in Python to speed
|
||||||
up evaluation and make the trace more readable.
|
up evaluation and make the trace more readable.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from joy.library import SimpleFunctionWrapper
|
from joy.library import SimpleFunctionWrapper
|
||||||
from joy.utils.stack import iter_stack
|
from joy.utils.stack import iter_stack
|
||||||
|
|
@ -99,7 +99,7 @@ up evaluation and make the trace more readable.
|
||||||
Now we replace the old version in the dictionary with the new version,
|
Now we replace the old version in the dictionary with the new version,
|
||||||
and re-evaluate the expression.
|
and re-evaluate the expression.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
D['size'] = size
|
D['size'] = size
|
||||||
|
|
||||||
|
|
@ -108,7 +108,7 @@ A shorter trace
|
||||||
|
|
||||||
You can see that ``size`` now executes in a single step.
|
You can see that ``size`` now executes in a single step.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[23 18] average')
|
V('[23 18] average')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,421 @@
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
Square Spiral Example Joy Code
|
||||||
|
==============================
|
||||||
|
|
||||||
|
Here is the example of Joy code from the ``README`` file:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[[abs]ii <=][[<>][pop !-]||]&&][[!-][[++]][[--]]ifte dip][[pop !-][--][++]ifte]ifte
|
||||||
|
|
||||||
|
It might seem unreadable but with a little familiarity it becomes just
|
||||||
|
as legible as any other notation. Some layout helps:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[ [[abs] ii <=]
|
||||||
|
[
|
||||||
|
[<>] [pop !-] ||
|
||||||
|
] &&
|
||||||
|
]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
|
||||||
|
This function accepts two integers on the stack and increments or
|
||||||
|
decrements one of them such that the new pair of numbers is the next
|
||||||
|
coordinate pair in a square spiral (like the kind used to construct an
|
||||||
|
Ulam Spiral).
|
||||||
|
|
||||||
|
Original Form
|
||||||
|
-------------
|
||||||
|
|
||||||
|
It's adapted from `the original code on
|
||||||
|
StackOverflow <https://stackoverflow.com/questions/398299/looping-in-a-spiral/31864777#31864777>`__:
|
||||||
|
|
||||||
|
If all you're trying to do is generate the first N points in the
|
||||||
|
spiral (without the original problem's constraint of masking to an N
|
||||||
|
x M region), the code becomes very simple:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
void spiral(const int N)
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
for(int i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
cout << x << '\t' << y << '\n';
|
||||||
|
if(abs(x) <= abs(y) && (x != y || x >= 0))
|
||||||
|
x += ((y >= 0) ? 1 : -1);
|
||||||
|
else
|
||||||
|
y += ((x >= 0) ? -1 : 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Translation to Joy
|
||||||
|
------------------
|
||||||
|
|
||||||
|
I'm going to make a function that take two ints (``x`` and ``y``) and
|
||||||
|
generates the next pair, we'll turn it into a generator later using the
|
||||||
|
``x`` combinator.
|
||||||
|
|
||||||
|
First Boolean Predicate
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
We need a function that computes ``abs(x) <= abs(y)``, we can use ``ii``
|
||||||
|
to apply ``abs`` to both values and then compare them with ``<=``:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[abs] ii <=
|
||||||
|
|
||||||
|
I've defined two short-circuiting Boolean combinators ``&&`` and ``||``
|
||||||
|
that each accept two quoted predicate programs, run the first, and
|
||||||
|
conditionally run the second only if required (to compute the final
|
||||||
|
Boolean value). They run their predicate arguments ``nullary``.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('&& [nullary] cons [nullary [0]] dip branch')
|
||||||
|
define('|| [nullary] cons [nullary] dip [1] branch')
|
||||||
|
|
||||||
|
Given those, we can define ``x != y || x >= 0`` as:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[<>] [pop 0 >=] ||
|
||||||
|
|
||||||
|
And ``(abs(x) <= abs(y) && (x != y || x >= 0))`` as:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[abs] ii <=] [[<>] [pop 0 >=] ||] &&
|
||||||
|
|
||||||
|
It's a little rough, but, as I say, with a little familiarity it becomes
|
||||||
|
legible.
|
||||||
|
|
||||||
|
The Increment / Decrement Branches
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Turning to the branches of the main ``if`` statement:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
x += ((y >= 0) ? 1 : -1);
|
||||||
|
|
||||||
|
Rewrite as a hybrid (pseudo-code) ``ifte`` expression:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[y >= 0] [x += 1] [X -= 1] ifte
|
||||||
|
|
||||||
|
Change each C phrase to Joy code:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 >=] [[++] dip] [[--] dip] ifte
|
||||||
|
|
||||||
|
Factor out the dip from each branch:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 >=] [[++]] [[--]] ifte dip
|
||||||
|
|
||||||
|
Similar logic applies to the other branch:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
y += ((x >= 0) ? -1 : 1);
|
||||||
|
|
||||||
|
[x >= 0] [y -= 1] [y += 1] ifte
|
||||||
|
|
||||||
|
[pop 0 >=] [--] [++] ifte
|
||||||
|
|
||||||
|
"Not Negative"
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('!- 0 >=')
|
||||||
|
|
||||||
|
Putting the Pieces Together
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
We can assemble the three functions we just defined in quotes and give
|
||||||
|
them them to the ``ifte`` combinator. With some arrangement to show off
|
||||||
|
the symmetry of the two branches, we have:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[[abs] ii <=] [[<>] [pop !-] ||] &&]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
|
||||||
|
As I was writing this up I realized that, since the ``&&`` combinator
|
||||||
|
doesn't consume the stack (below its quoted args), I can unquote the
|
||||||
|
predicate, swap the branches, and use the ``branch`` combinator instead
|
||||||
|
of ``ifte``:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[abs] ii <=] [[<>] [pop !-] ||] &&
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
branch
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte')
|
||||||
|
|
||||||
|
Let's try it out:
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('0 0 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
1 0
|
||||||
|
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('1 0 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
1 -1
|
||||||
|
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('1 -1 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
0 -1
|
||||||
|
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('0 -1 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
-1 -1
|
||||||
|
|
||||||
|
|
||||||
|
Turning it into a Generator with ``x``
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
It can be used with the x combinator to make a kind of generator for
|
||||||
|
spiral square coordinates.
|
||||||
|
|
||||||
|
We can use ``codireco`` to make a generator
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
codireco ::= cons dip rest cons
|
||||||
|
|
||||||
|
It will look like this:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[value [F] codireco]
|
||||||
|
|
||||||
|
Here's a trace of how it works:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 [dup ++] codireco] . x
|
||||||
|
[0 [dup ++] codireco] . 0 [dup ++] codireco
|
||||||
|
[0 [dup ++] codireco] 0 . [dup ++] codireco
|
||||||
|
[0 [dup ++] codireco] 0 [dup ++] . codireco
|
||||||
|
[0 [dup ++] codireco] 0 [dup ++] . cons dip rest cons
|
||||||
|
[0 [dup ++] codireco] [0 dup ++] . dip rest cons
|
||||||
|
. 0 dup ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 . dup ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 0 . ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 1 . [0 [dup ++] codireco] rest cons
|
||||||
|
0 1 [0 [dup ++] codireco] . rest cons
|
||||||
|
0 1 [[dup ++] codireco] . cons
|
||||||
|
0 [1 [dup ++] codireco] .
|
||||||
|
|
||||||
|
But first we have to change the ``spiral_next`` function to work on a
|
||||||
|
quoted pair of integers, and leave a copy of the pair on the stack.
|
||||||
|
From:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
y x spiral_next
|
||||||
|
---------------------
|
||||||
|
y' x'
|
||||||
|
|
||||||
|
to:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[x y] [spiral_next] infra
|
||||||
|
-------------------------------
|
||||||
|
[x' y']
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('[0 0] [spiral_next] infra')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
[0 1]
|
||||||
|
|
||||||
|
|
||||||
|
So our generator is:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[x y] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
Or rather:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[0 0] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
There is a function ``make_generator`` that will build the generator for
|
||||||
|
us out of the value and stepper function:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 0] [dup [spiral_next] infra] make_generator
|
||||||
|
----------------------------------------------------
|
||||||
|
[[0 0] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
Here it is in action:
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('[0 0] [dup [spiral_next] infra] make_generator x x x x pop')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
[0 0] [0 1] [-1 1] [-1 0]
|
||||||
|
|
||||||
|
|
||||||
|
Four ``x`` combinators, four pairs of coordinates.
|
||||||
|
|
||||||
|
Conclusion
|
||||||
|
----------
|
||||||
|
|
||||||
|
So that's an example of Joy code. It's a straightforward translation of
|
||||||
|
the original. It's a little long for a single definition, you might
|
||||||
|
break it up like so:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
_spn_P ::= [[abs] ii <=] [[<>] [pop !-] ||] &&
|
||||||
|
|
||||||
|
_spn_T ::= [ !-] [[++]] [[--]] ifte dip
|
||||||
|
_spn_E ::= [pop !-] [--] [++] ifte
|
||||||
|
|
||||||
|
spiral_next ::= _spn_P [_spn_E] [_spn_T] branch
|
||||||
|
|
||||||
|
This way it's easy to see that the function is a branch with two
|
||||||
|
quasi-symmetrical paths.
|
||||||
|
|
||||||
|
We then used this function to make a simple generator of coordinate
|
||||||
|
pairs, where the next pair in the series can be generated at any time by
|
||||||
|
using the ``x`` combinator on the generator (which is just a quoted
|
||||||
|
expression containing a copy of the current pair and the "stepper
|
||||||
|
function" to generate the next pair from that.)
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('_spn_P [[abs] ii <=] [[<>] [pop !-] ||] &&')
|
||||||
|
define('_spn_T [!-] [[++]] [[--]] ifte dip')
|
||||||
|
define('_spn_E [pop !-] [--] [++] ifte')
|
||||||
|
define('spiral_next _spn_P [_spn_E] [_spn_T] branch')
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
V('23 18 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
. 23 18 spiral_next
|
||||||
|
23 . 18 spiral_next
|
||||||
|
23 18 . spiral_next
|
||||||
|
23 18 . _spn_P [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [[abs] ii <=] [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] . && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] . [nullary] cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] [nullary] . cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] . [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] [nullary [0]] . dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . nullary [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . [stack] dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [stack] . dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [stack] . dip infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . stack [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [18 23] . [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [18 23] [[abs] ii <=] . infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [abs] ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . [dip] dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] [dip] . dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . dip [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 . abs 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 . 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . abs <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
False . [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
False [18 23] . swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [False] . first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False . [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False [0] . [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False [0] [[[<>] [pop !-] ||] nullary] . branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . 0 [_spn_E] [_spn_T] branch
|
||||||
|
23 18 0 . [_spn_E] [_spn_T] branch
|
||||||
|
23 18 0 [_spn_E] . [_spn_T] branch
|
||||||
|
23 18 0 [_spn_E] [_spn_T] . branch
|
||||||
|
23 18 . _spn_E
|
||||||
|
23 18 . [pop !-] [--] [++] ifte
|
||||||
|
23 18 [pop !-] . [--] [++] ifte
|
||||||
|
23 18 [pop !-] [--] . [++] ifte
|
||||||
|
23 18 [pop !-] [--] [++] . ifte
|
||||||
|
23 18 [pop !-] [--] [++] . [nullary not] dipd branch
|
||||||
|
23 18 [pop !-] [--] [++] [nullary not] . dipd branch
|
||||||
|
23 18 [pop !-] . nullary not [--] [++] branch
|
||||||
|
23 18 [pop !-] . [stack] dinfrirst not [--] [++] branch
|
||||||
|
23 18 [pop !-] [stack] . dinfrirst not [--] [++] branch
|
||||||
|
23 18 [pop !-] [stack] . dip infra first not [--] [++] branch
|
||||||
|
23 18 . stack [pop !-] infra first not [--] [++] branch
|
||||||
|
23 18 [18 23] . [pop !-] infra first not [--] [++] branch
|
||||||
|
23 18 [18 23] [pop !-] . infra first not [--] [++] branch
|
||||||
|
23 18 . pop !- [18 23] swaack first not [--] [++] branch
|
||||||
|
23 . !- [18 23] swaack first not [--] [++] branch
|
||||||
|
23 . 0 >= [18 23] swaack first not [--] [++] branch
|
||||||
|
23 0 . >= [18 23] swaack first not [--] [++] branch
|
||||||
|
True . [18 23] swaack first not [--] [++] branch
|
||||||
|
True [18 23] . swaack first not [--] [++] branch
|
||||||
|
23 18 [True] . first not [--] [++] branch
|
||||||
|
23 18 True . not [--] [++] branch
|
||||||
|
23 18 False . [--] [++] branch
|
||||||
|
23 18 False [--] . [++] branch
|
||||||
|
23 18 False [--] [++] . branch
|
||||||
|
23 18 . --
|
||||||
|
23 17 .
|
||||||
|
|
||||||
|
|
@ -148,11 +148,11 @@ Working backwards:
|
||||||
Define ``treestep``
|
Define ``treestep``
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import D, J, V, define, DefinitionWrapper
|
from notebook_preamble import D, J, V, define, DefinitionWrapper
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
DefinitionWrapper.add_definitions('''
|
DefinitionWrapper.add_definitions('''
|
||||||
|
|
||||||
|
|
@ -173,7 +173,7 @@ all nodes in a tree with this function:
|
||||||
|
|
||||||
sumtree == [pop 0] [] [sum +] treestep
|
sumtree == [pop 0] [] [sum +] treestep
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('sumtree == [pop 0] [] [sum +] treestep')
|
define('sumtree == [pop 0] [] [sum +] treestep')
|
||||||
|
|
||||||
|
|
@ -185,7 +185,7 @@ Running this function on an empty tree value gives zero:
|
||||||
------------------------------------
|
------------------------------------
|
||||||
0
|
0
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] sumtree') # Empty tree.
|
J('[] sumtree') # Empty tree.
|
||||||
|
|
||||||
|
|
@ -205,7 +205,7 @@ Running it on a non-empty node:
|
||||||
n m +
|
n m +
|
||||||
n+m
|
n+m
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23] sumtree') # No child trees.
|
J('[23] sumtree') # No child trees.
|
||||||
|
|
||||||
|
|
@ -215,7 +215,7 @@ Running it on a non-empty node:
|
||||||
23
|
23
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 []] sumtree') # Child tree, empty.
|
J('[23 []] sumtree') # Child tree, empty.
|
||||||
|
|
||||||
|
|
@ -225,7 +225,7 @@ Running it on a non-empty node:
|
||||||
23
|
23
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [4]] [3]] sumtree') # Non-empty child trees.
|
J('[23 [2 [4]] [3]] sumtree') # Non-empty child trees.
|
||||||
|
|
||||||
|
|
@ -235,7 +235,7 @@ Running it on a non-empty node:
|
||||||
32
|
32
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] sumtree') # Etc...
|
J('[23 [2 [8] [9]] [3] [4 []]] sumtree') # Etc...
|
||||||
|
|
||||||
|
|
@ -245,7 +245,7 @@ Running it on a non-empty node:
|
||||||
49
|
49
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [] [cons sum] treestep') # Alternate "spelling".
|
J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [] [cons sum] treestep') # Alternate "spelling".
|
||||||
|
|
||||||
|
|
@ -255,7 +255,7 @@ Running it on a non-empty node:
|
||||||
49
|
49
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 23] [cons] treestep') # Replace each node.
|
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 23] [cons] treestep') # Replace each node.
|
||||||
|
|
||||||
|
|
@ -265,7 +265,7 @@ Running it on a non-empty node:
|
||||||
[23 [23 [23] [23]] [23] [23 []]]
|
[23 [23 [23] [23]] [23] [23 []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep')
|
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep')
|
||||||
|
|
||||||
|
|
@ -275,7 +275,7 @@ Running it on a non-empty node:
|
||||||
[1 [1 [1] [1]] [1] [1 []]]
|
[1 [1 [1] [1]] [1] [1 []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree')
|
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree')
|
||||||
|
|
||||||
|
|
@ -285,7 +285,7 @@ Running it on a non-empty node:
|
||||||
6
|
6
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
||||||
|
|
||||||
|
|
@ -295,7 +295,7 @@ Running it on a non-empty node:
|
||||||
6
|
6
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[4 [3 [] [7]]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
J('[4 [3 [] [7]]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
||||||
|
|
||||||
|
|
@ -339,7 +339,7 @@ Traversal
|
||||||
|
|
||||||
This doesn’t quite work:
|
This doesn’t quite work:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[[3 0] [[2 0] [][]] [[9 0] [[5 0] [[4 0] [][]] [[8 0] [[6 0] [] [[7 0] [][]]][]]][]]] ["B"] [first] [i] treestep')
|
J('[[3 0] [[2 0] [][]] [[9 0] [[5 0] [[4 0] [][]] [[8 0] [[6 0] [] [[7 0] [][]]][]]][]]] ["B"] [first] [i] treestep')
|
||||||
|
|
||||||
|
|
@ -369,7 +369,7 @@ So:
|
||||||
|
|
||||||
[] [first] [flatten cons] treestep
|
[] [first] [flatten cons] treestep
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [first] [flatten cons] treestep')
|
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [first] [flatten cons] treestep')
|
||||||
|
|
||||||
|
|
@ -401,7 +401,7 @@ So:
|
||||||
|
|
||||||
[] [i roll< swons concat] [first] treestep
|
[] [i roll< swons concat] [first] treestep
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [uncons pop] [i roll< swons concat] treestep')
|
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [uncons pop] [i roll< swons concat] treestep')
|
||||||
|
|
||||||
|
|
@ -429,7 +429,7 @@ Plugging in our BTree structure:
|
||||||
|
|
||||||
[key value] N [left right] [K] C
|
[key value] N [left right] [K] C
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind')
|
J('[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind')
|
||||||
|
|
||||||
|
|
@ -444,7 +444,7 @@ Plugging in our BTree structure:
|
||||||
|
|
||||||
Iteration through the nodes
|
Iteration through the nodes
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] ["N"] [step] treegrind')
|
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] ["N"] [step] treegrind')
|
||||||
|
|
||||||
|
|
@ -456,7 +456,7 @@ Iteration through the nodes
|
||||||
|
|
||||||
Sum the nodes’ keys.
|
Sum the nodes’ keys.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('0 [[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] [first +] [step] treegrind')
|
J('0 [[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] [first +] [step] treegrind')
|
||||||
|
|
||||||
|
|
@ -468,7 +468,7 @@ Sum the nodes’ keys.
|
||||||
|
|
||||||
Rebuild the tree using ``map`` (imitating ``treestep``.)
|
Rebuild the tree using ``map`` (imitating ``treestep``.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [[100 +] infra] [map cons] treegrind')
|
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [[100 +] infra] [map cons] treegrind')
|
||||||
|
|
||||||
|
|
@ -574,7 +574,7 @@ Putting it together
|
||||||
|
|
||||||
To me, that seems simpler than the ``genrec`` version.
|
To me, that seems simpler than the ``genrec`` version.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
DefinitionWrapper.add_definitions('''
|
DefinitionWrapper.add_definitions('''
|
||||||
|
|
||||||
|
|
@ -587,7 +587,7 @@ To me, that seems simpler than the ``genrec`` version.
|
||||||
|
|
||||||
''', D)
|
''', D)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('''\
|
J('''\
|
||||||
|
|
||||||
|
|
@ -603,7 +603,7 @@ To me, that seems simpler than the ``genrec`` version.
|
||||||
15
|
15
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('''\
|
J('''\
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
Type Checking
|
Type Checking
|
||||||
=============
|
=============
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
import logging, sys
|
import logging, sys
|
||||||
|
|
||||||
|
|
@ -11,7 +11,7 @@ Type Checking
|
||||||
level=logging.INFO,
|
level=logging.INFO,
|
||||||
)
|
)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from joy.utils.types import (
|
from joy.utils.types import (
|
||||||
doc_from_stack_effect,
|
doc_from_stack_effect,
|
||||||
|
|
@ -22,7 +22,7 @@ Type Checking
|
||||||
JoyTypeError,
|
JoyTypeError,
|
||||||
)
|
)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
D = FUNCTIONS.copy()
|
D = FUNCTIONS.copy()
|
||||||
del D['product']
|
del D['product']
|
||||||
|
|
@ -31,7 +31,7 @@ Type Checking
|
||||||
An Example
|
An Example
|
||||||
----------
|
----------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
fi, fo = infer(pop, swap, rolldown, rrest, ccons)[0]
|
fi, fo = infer(pop, swap, rolldown, rrest, ccons)[0]
|
||||||
|
|
||||||
|
|
@ -46,7 +46,7 @@ An Example
|
||||||
40 ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) ∘
|
40 ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) ∘
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(fi, fo)
|
print doc_from_stack_effect(fi, fo)
|
||||||
|
|
||||||
|
|
@ -56,13 +56,13 @@ An Example
|
||||||
([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1])
|
([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from joy.parser import text_to_expression
|
from joy.parser import text_to_expression
|
||||||
from joy.utils.stack import stack_to_string
|
from joy.utils.stack import stack_to_string
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
e = text_to_expression('0 1 2 [3 4]') # reverse order
|
e = text_to_expression('0 1 2 [3 4]') # reverse order
|
||||||
print stack_to_string(e)
|
print stack_to_string(e)
|
||||||
|
|
@ -73,7 +73,7 @@ An Example
|
||||||
[3 4] 2 1 0
|
[3 4] 2 1 0
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
u = unify(e, fi)[0]
|
u = unify(e, fi)[0]
|
||||||
u
|
u
|
||||||
|
|
@ -87,7 +87,7 @@ An Example
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
g = reify(u, (fi, fo))
|
g = reify(u, (fi, fo))
|
||||||
print doc_from_stack_effect(*g)
|
print doc_from_stack_effect(*g)
|
||||||
|
|
@ -101,11 +101,11 @@ An Example
|
||||||
Unification Works “in Reverse”
|
Unification Works “in Reverse”
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
e = text_to_expression('[2 3]')
|
e = text_to_expression('[2 3]')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
u = unify(e, fo)[0] # output side, not input side
|
u = unify(e, fo)[0] # output side, not input side
|
||||||
u
|
u
|
||||||
|
|
@ -119,7 +119,7 @@ Unification Works “in Reverse”
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
g = reify(u, (fi, fo))
|
g = reify(u, (fi, fo))
|
||||||
print doc_from_stack_effect(*g)
|
print doc_from_stack_effect(*g)
|
||||||
|
|
@ -133,7 +133,7 @@ Unification Works “in Reverse”
|
||||||
Failing a Check
|
Failing a Check
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
fi, fo = infer(dup, mul)[0]
|
fi, fo = infer(dup, mul)[0]
|
||||||
|
|
||||||
|
|
@ -146,7 +146,7 @@ Failing a Check
|
||||||
31 (i1 -- i2) ∘
|
31 (i1 -- i2) ∘
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
e = text_to_expression('"two"')
|
e = text_to_expression('"two"')
|
||||||
print stack_to_string(e)
|
print stack_to_string(e)
|
||||||
|
|
@ -157,7 +157,7 @@ Failing a Check
|
||||||
'two'
|
'two'
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
try:
|
try:
|
||||||
unify(e, fi)
|
unify(e, fi)
|
||||||
|
|
|
||||||
|
|
@ -184,7 +184,7 @@ Compiling ``pop∘swap∘roll<``
|
||||||
|
|
||||||
The simplest way to “compile” this function would be something like:
|
The simplest way to “compile” this function would be something like:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def poswrd(s, e, d):
|
def poswrd(s, e, d):
|
||||||
return rolldown(*swap(*pop(s, e, d)))
|
return rolldown(*swap(*pop(s, e, d)))
|
||||||
|
|
@ -200,7 +200,7 @@ Looking ahead for a moment, from the stack effect comment:
|
||||||
|
|
||||||
We should be able to directly write out a Python function like:
|
We should be able to directly write out a Python function like:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def poswrd(stack):
|
def poswrd(stack):
|
||||||
(_, (a, (b, (c, stack)))) = stack
|
(_, (a, (b, (c, stack)))) = stack
|
||||||
|
|
@ -393,7 +393,7 @@ And there you have it, the stack effect for
|
||||||
From this stack effect comment it should be possible to construct the
|
From this stack effect comment it should be possible to construct the
|
||||||
following Python code:
|
following Python code:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def F(stack):
|
def F(stack):
|
||||||
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
||||||
|
|
@ -408,7 +408,7 @@ Representing Stack Effect Comments in Python
|
||||||
I’m going to use pairs of tuples of type descriptors, which will be
|
I’m going to use pairs of tuples of type descriptors, which will be
|
||||||
integers or tuples of type descriptors:
|
integers or tuples of type descriptors:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
roll_dn = (1, 2, 3), (2, 3, 1)
|
roll_dn = (1, 2, 3), (2, 3, 1)
|
||||||
|
|
||||||
|
|
@ -419,7 +419,7 @@ integers or tuples of type descriptors:
|
||||||
``compose()``
|
``compose()``
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compose(f, g):
|
def compose(f, g):
|
||||||
|
|
||||||
|
|
@ -465,7 +465,7 @@ integers or tuples of type descriptors:
|
||||||
``unify()``
|
``unify()``
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def unify(u, v, s=None):
|
def unify(u, v, s=None):
|
||||||
if s is None:
|
if s is None:
|
||||||
|
|
@ -483,7 +483,7 @@ integers or tuples of type descriptors:
|
||||||
``update()``
|
``update()``
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def update(s, term):
|
def update(s, term):
|
||||||
if not isinstance(term, tuple):
|
if not isinstance(term, tuple):
|
||||||
|
|
@ -493,7 +493,7 @@ integers or tuples of type descriptors:
|
||||||
``relabel()``
|
``relabel()``
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def relabel(left, right):
|
def relabel(left, right):
|
||||||
return left, _1000(right)
|
return left, _1000(right)
|
||||||
|
|
@ -517,7 +517,7 @@ integers or tuples of type descriptors:
|
||||||
``delabel()``
|
``delabel()``
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def delabel(f):
|
def delabel(f):
|
||||||
s = {u: i for i, u in enumerate(sorted(_unique(f)))}
|
s = {u: i for i, u in enumerate(sorted(_unique(f)))}
|
||||||
|
|
@ -551,7 +551,7 @@ At last we put it all together in a function ``C()`` that accepts two
|
||||||
stack effect comments and returns their composition (or raises and
|
stack effect comments and returns their composition (or raises and
|
||||||
exception if they can’t be composed due to type conflicts.)
|
exception if they can’t be composed due to type conflicts.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def C(f, g):
|
def C(f, g):
|
||||||
f, g = relabel(f, g)
|
f, g = relabel(f, g)
|
||||||
|
|
@ -560,7 +560,7 @@ exception if they can’t be composed due to type conflicts.)
|
||||||
|
|
||||||
Let’s try it out.
|
Let’s try it out.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(pop, swap)
|
C(pop, swap)
|
||||||
|
|
||||||
|
|
@ -573,7 +573,7 @@ Let’s try it out.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(C(pop, swap), roll_dn)
|
C(C(pop, swap), roll_dn)
|
||||||
|
|
||||||
|
|
@ -586,7 +586,7 @@ Let’s try it out.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(swap, roll_dn)
|
C(swap, roll_dn)
|
||||||
|
|
||||||
|
|
@ -599,7 +599,7 @@ Let’s try it out.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(pop, C(swap, roll_dn))
|
C(pop, C(swap, roll_dn))
|
||||||
|
|
||||||
|
|
@ -612,7 +612,7 @@ Let’s try it out.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
poswrd = reduce(C, (pop, swap, roll_dn))
|
poswrd = reduce(C, (pop, swap, roll_dn))
|
||||||
poswrd
|
poswrd
|
||||||
|
|
@ -633,13 +633,13 @@ Here’s that trick to represent functions like ``rest`` and ``cons`` that
|
||||||
manipulate stacks. We use a cons-list of tuples and give the tails their
|
manipulate stacks. We use a cons-list of tuples and give the tails their
|
||||||
own numbers. Then everything above already works.
|
own numbers. Then everything above already works.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
rest = ((1, 2),), (2,)
|
rest = ((1, 2),), (2,)
|
||||||
|
|
||||||
cons = (1, 2), ((1, 2),)
|
cons = (1, 2), ((1, 2),)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(poswrd, rest)
|
C(poswrd, rest)
|
||||||
|
|
||||||
|
|
@ -671,7 +671,7 @@ The translation table, if you will, would be:
|
||||||
0: 0,
|
0: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
F = reduce(C, (pop, swap, roll_dn, rest, rest, cons, cons))
|
F = reduce(C, (pop, swap, roll_dn, rest, rest, cons, cons))
|
||||||
|
|
||||||
|
|
@ -699,11 +699,11 @@ Dealing with ``cons`` and ``uncons``
|
||||||
However, if we try to compose e.g. ``cons`` and ``uncons`` it won’t
|
However, if we try to compose e.g. ``cons`` and ``uncons`` it won’t
|
||||||
work:
|
work:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
uncons = ((1, 2),), (1, 2)
|
uncons = ((1, 2),), (1, 2)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
try:
|
try:
|
||||||
C(cons, uncons)
|
C(cons, uncons)
|
||||||
|
|
@ -723,7 +723,7 @@ The problem is that the ``unify()`` function as written doesn’t handle
|
||||||
the case when both terms are tuples. We just have to add a clause to
|
the case when both terms are tuples. We just have to add a clause to
|
||||||
deal with this recursively:
|
deal with this recursively:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def unify(u, v, s=None):
|
def unify(u, v, s=None):
|
||||||
if s is None:
|
if s is None:
|
||||||
|
|
@ -753,7 +753,7 @@ deal with this recursively:
|
||||||
|
|
||||||
return s
|
return s
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(cons, uncons)
|
C(cons, uncons)
|
||||||
|
|
||||||
|
|
@ -771,7 +771,7 @@ Part III: Compiling Yin Functions
|
||||||
|
|
||||||
Now consider the Python function we would like to derive:
|
Now consider the Python function we would like to derive:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def F_python(stack):
|
def F_python(stack):
|
||||||
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
||||||
|
|
@ -779,7 +779,7 @@ Now consider the Python function we would like to derive:
|
||||||
|
|
||||||
And compare it to the input stack effect comment tuple we just computed:
|
And compare it to the input stack effect comment tuple we just computed:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
F[0]
|
F[0]
|
||||||
|
|
||||||
|
|
@ -816,7 +816,7 @@ Eh?
|
||||||
|
|
||||||
And the return tuple
|
And the return tuple
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
F[1]
|
F[1]
|
||||||
|
|
||||||
|
|
@ -848,7 +848,7 @@ Python Identifiers
|
||||||
We want to substitute Python identifiers for the integers. I’m going to
|
We want to substitute Python identifiers for the integers. I’m going to
|
||||||
repurpose ``joy.parser.Symbol`` class for this:
|
repurpose ``joy.parser.Symbol`` class for this:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from joy.parser import Symbol
|
from joy.parser import Symbol
|
||||||
|
|
@ -874,7 +874,7 @@ effect comment tuples to reasonable text format. There are some details
|
||||||
in how this code works that related to stuff later in the notebook, so
|
in how this code works that related to stuff later in the notebook, so
|
||||||
you should skip it for now and read it later if you’re interested.
|
you should skip it for now and read it later if you’re interested.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def doc_from_stack_effect(inputs, outputs):
|
def doc_from_stack_effect(inputs, outputs):
|
||||||
return '(%s--%s)' % (
|
return '(%s--%s)' % (
|
||||||
|
|
@ -914,7 +914,7 @@ Now we can write a compiler function to emit Python source code. (The
|
||||||
underscore suffix distiguishes it from the built-in ``compile()``
|
underscore suffix distiguishes it from the built-in ``compile()``
|
||||||
function.)
|
function.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compile_(name, f, doc=None):
|
def compile_(name, f, doc=None):
|
||||||
if doc is None:
|
if doc is None:
|
||||||
|
|
@ -932,7 +932,7 @@ function.)
|
||||||
|
|
||||||
Here it is in action:
|
Here it is in action:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
source = compile_('F', F)
|
source = compile_('F', F)
|
||||||
|
|
||||||
|
|
@ -949,7 +949,7 @@ Here it is in action:
|
||||||
|
|
||||||
Compare:
|
Compare:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def F_python(stack):
|
def F_python(stack):
|
||||||
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
||||||
|
|
@ -957,7 +957,7 @@ Compare:
|
||||||
|
|
||||||
Next steps:
|
Next steps:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
L = {}
|
L = {}
|
||||||
|
|
||||||
|
|
@ -976,16 +976,16 @@ Next steps:
|
||||||
|
|
||||||
Let’s try it out:
|
Let’s try it out:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import D, J, V
|
from notebook_preamble import D, J, V
|
||||||
from joy.library import SimpleFunctionWrapper
|
from joy.library import SimpleFunctionWrapper
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
D['F'] = SimpleFunctionWrapper(L['F'])
|
D['F'] = SimpleFunctionWrapper(L['F'])
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[4 5 ...] 2 3 1 F')
|
J('[4 5 ...] 2 3 1 F')
|
||||||
|
|
||||||
|
|
@ -1012,7 +1012,7 @@ Compiling Library Functions
|
||||||
We can use ``compile_()`` to generate many primitives in the library
|
We can use ``compile_()`` to generate many primitives in the library
|
||||||
from their stack effect comments:
|
from their stack effect comments:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def defs():
|
def defs():
|
||||||
|
|
||||||
|
|
@ -1036,7 +1036,7 @@ from their stack effect comments:
|
||||||
|
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for name, stack_effect_comment in sorted(defs().items()):
|
for name, stack_effect_comment in sorted(defs().items()):
|
||||||
print
|
print
|
||||||
|
|
@ -1205,7 +1205,7 @@ Python class hierarchy of Joy types and use the ``issubclass()`` method
|
||||||
to establish domain ordering, as well as other handy behaviour that will
|
to establish domain ordering, as well as other handy behaviour that will
|
||||||
make it fairly easy to reuse most of the code above.
|
make it fairly easy to reuse most of the code above.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class AnyJoyType(object):
|
class AnyJoyType(object):
|
||||||
|
|
||||||
|
|
@ -1251,14 +1251,14 @@ make it fairly easy to reuse most of the code above.
|
||||||
|
|
||||||
Mess with it a little:
|
Mess with it a little:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from itertools import permutations
|
from itertools import permutations
|
||||||
|
|
||||||
“Any” types can be specialized to numbers and stacks, but not vice
|
“Any” types can be specialized to numbers and stacks, but not vice
|
||||||
versa:
|
versa:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for a, b in permutations((A[0], N[0], S[0]), 2):
|
for a, b in permutations((A[0], N[0], S[0]), 2):
|
||||||
print a, '>=', b, '->', a >= b
|
print a, '>=', b, '->', a >= b
|
||||||
|
|
@ -1278,7 +1278,7 @@ Our crude `Numerical
|
||||||
Tower <https://en.wikipedia.org/wiki/Numerical_tower>`__ of *numbers* >
|
Tower <https://en.wikipedia.org/wiki/Numerical_tower>`__ of *numbers* >
|
||||||
*floats* > *integers* works as well (but we’re not going to use it yet):
|
*floats* > *integers* works as well (but we’re not going to use it yet):
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for a, b in permutations((A[0], N[0], FloatJoyType(0), IntJoyType(0)), 2):
|
for a, b in permutations((A[0], N[0], FloatJoyType(0), IntJoyType(0)), 2):
|
||||||
print a, '>=', b, '->', a >= b
|
print a, '>=', b, '->', a >= b
|
||||||
|
|
@ -1303,13 +1303,13 @@ Tower <https://en.wikipedia.org/wiki/Numerical_tower>`__ of *numbers* >
|
||||||
Typing ``sqr``
|
Typing ``sqr``
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
dup = (A[1],), (A[1], A[1])
|
dup = (A[1],), (A[1], A[1])
|
||||||
|
|
||||||
mul = (N[1], N[2]), (N[3],)
|
mul = (N[1], N[2]), (N[3],)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
dup
|
dup
|
||||||
|
|
||||||
|
|
@ -1322,7 +1322,7 @@ Typing ``sqr``
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
mul
|
mul
|
||||||
|
|
||||||
|
|
@ -1340,7 +1340,7 @@ Modifying the Inferencer
|
||||||
|
|
||||||
Re-labeling still works fine:
|
Re-labeling still works fine:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
foo = relabel(dup, mul)
|
foo = relabel(dup, mul)
|
||||||
|
|
||||||
|
|
@ -1361,7 +1361,7 @@ Re-labeling still works fine:
|
||||||
The ``delabel()`` function needs an overhaul. It now has to keep track
|
The ``delabel()`` function needs an overhaul. It now has to keep track
|
||||||
of how many labels of each domain it has “seen”.
|
of how many labels of each domain it has “seen”.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from collections import Counter
|
from collections import Counter
|
||||||
|
|
||||||
|
|
@ -1383,7 +1383,7 @@ of how many labels of each domain it has “seen”.
|
||||||
|
|
||||||
return tuple(delabel(inner, seen, c) for inner in f)
|
return tuple(delabel(inner, seen, c) for inner in f)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
delabel(foo)
|
delabel(foo)
|
||||||
|
|
||||||
|
|
@ -1399,7 +1399,7 @@ of how many labels of each domain it has “seen”.
|
||||||
``unify()`` version 3
|
``unify()`` version 3
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def unify(u, v, s=None):
|
def unify(u, v, s=None):
|
||||||
if s is None:
|
if s is None:
|
||||||
|
|
@ -1449,7 +1449,7 @@ of how many labels of each domain it has “seen”.
|
||||||
|
|
||||||
Rewrite the stack effect comments:
|
Rewrite the stack effect comments:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def defs():
|
def defs():
|
||||||
|
|
||||||
|
|
@ -1503,11 +1503,11 @@ Rewrite the stack effect comments:
|
||||||
|
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
DEFS = defs()
|
DEFS = defs()
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for name, stack_effect_comment in sorted(DEFS.items()):
|
for name, stack_effect_comment in sorted(DEFS.items()):
|
||||||
print name, '=', doc_from_stack_effect(*stack_effect_comment)
|
print name, '=', doc_from_stack_effect(*stack_effect_comment)
|
||||||
|
|
@ -1543,14 +1543,14 @@ Rewrite the stack effect comments:
|
||||||
uncons = ([a1 .1.] -- a1 [.1.])
|
uncons = ([a1 .1.] -- a1 [.1.])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
globals().update(DEFS)
|
globals().update(DEFS)
|
||||||
|
|
||||||
Compose ``dup`` and ``mul``
|
Compose ``dup`` and ``mul``
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(dup, mul)
|
C(dup, mul)
|
||||||
|
|
||||||
|
|
@ -1565,7 +1565,7 @@ Compose ``dup`` and ``mul``
|
||||||
|
|
||||||
Revisit the ``F`` function, works fine.
|
Revisit the ``F`` function, works fine.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))
|
F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))
|
||||||
F
|
F
|
||||||
|
|
@ -1579,7 +1579,7 @@ Revisit the ``F`` function, works fine.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*F)
|
print doc_from_stack_effect(*F)
|
||||||
|
|
||||||
|
|
@ -1592,12 +1592,12 @@ Revisit the ``F`` function, works fine.
|
||||||
Some otherwise inefficient functions are no longer to be feared. We can
|
Some otherwise inefficient functions are no longer to be feared. We can
|
||||||
also get the effect of combinators in some limited cases.
|
also get the effect of combinators in some limited cases.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def neato(*funcs):
|
def neato(*funcs):
|
||||||
print doc_from_stack_effect(*reduce(C, funcs))
|
print doc_from_stack_effect(*reduce(C, funcs))
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
# e.g. [swap] dip
|
# e.g. [swap] dip
|
||||||
neato(rollup, swap, rolldown)
|
neato(rollup, swap, rolldown)
|
||||||
|
|
@ -1608,7 +1608,7 @@ also get the effect of combinators in some limited cases.
|
||||||
(a1 a2 a3 -- a2 a1 a3)
|
(a1 a2 a3 -- a2 a1 a3)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
# e.g. [popop] dipd
|
# e.g. [popop] dipd
|
||||||
neato(popdd, rolldown, pop)
|
neato(popdd, rolldown, pop)
|
||||||
|
|
@ -1619,7 +1619,7 @@ also get the effect of combinators in some limited cases.
|
||||||
(a1 a2 a3 a4 -- a3 a4)
|
(a1 a2 a3 a4 -- a3 a4)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
# Reverse the order of the top three items.
|
# Reverse the order of the top three items.
|
||||||
neato(rollup, swap)
|
neato(rollup, swap)
|
||||||
|
|
@ -1636,7 +1636,7 @@ also get the effect of combinators in some limited cases.
|
||||||
Because the type labels represent themselves as valid Python identifiers
|
Because the type labels represent themselves as valid Python identifiers
|
||||||
the ``compile_()`` function doesn’t need to generate them anymore:
|
the ``compile_()`` function doesn’t need to generate them anymore:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compile_(name, f, doc=None):
|
def compile_(name, f, doc=None):
|
||||||
inputs, outputs = f
|
inputs, outputs = f
|
||||||
|
|
@ -1652,7 +1652,7 @@ the ``compile_()`` function doesn’t need to generate them anymore:
|
||||||
%s = stack
|
%s = stack
|
||||||
return %s''' % (name, doc, i, o)
|
return %s''' % (name, doc, i, o)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print compile_('F', F)
|
print compile_('F', F)
|
||||||
|
|
||||||
|
|
@ -1668,7 +1668,7 @@ the ``compile_()`` function doesn’t need to generate them anymore:
|
||||||
But it cannot magically create new functions that involve e.g. math and
|
But it cannot magically create new functions that involve e.g. math and
|
||||||
such. Note that this is *not* a ``sqr`` function implementation:
|
such. Note that this is *not* a ``sqr`` function implementation:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print compile_('sqr', C(dup, mul))
|
print compile_('sqr', C(dup, mul))
|
||||||
|
|
||||||
|
|
@ -1696,7 +1696,7 @@ The functions that *can* be compiled are the ones that have only
|
||||||
``AnyJoyType`` and ``StackJoyType`` labels in their stack effect
|
``AnyJoyType`` and ``StackJoyType`` labels in their stack effect
|
||||||
comments. We can write a function to check that:
|
comments. We can write a function to check that:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from itertools import imap
|
from itertools import imap
|
||||||
|
|
||||||
|
|
@ -1704,7 +1704,7 @@ comments. We can write a function to check that:
|
||||||
def compilable(f):
|
def compilable(f):
|
||||||
return isinstance(f, tuple) and all(imap(compilable, f)) or stacky(f)
|
return isinstance(f, tuple) and all(imap(compilable, f)) or stacky(f)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for name, stack_effect_comment in sorted(defs().items()):
|
for name, stack_effect_comment in sorted(defs().items()):
|
||||||
if compilable(stack_effect_comment):
|
if compilable(stack_effect_comment):
|
||||||
|
|
@ -1828,7 +1828,7 @@ the “truthiness” of ``StackJoyType`` to false to let e.g.
|
||||||
``joy.utils.stack.concat`` work with our stack effect comment cons-list
|
``joy.utils.stack.concat`` work with our stack effect comment cons-list
|
||||||
tuples.)
|
tuples.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compose(f, g):
|
def compose(f, g):
|
||||||
(f_in, f_out), (g_in, g_out) = f, g
|
(f_in, f_out), (g_in, g_out) = f, g
|
||||||
|
|
@ -1840,7 +1840,7 @@ tuples.)
|
||||||
I don’t want to rewrite all the defs myself, so I’ll write a little
|
I don’t want to rewrite all the defs myself, so I’ll write a little
|
||||||
conversion function instead. This is programmer’s laziness.
|
conversion function instead. This is programmer’s laziness.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def sequence_to_stack(seq, stack=StackJoyType(23)):
|
def sequence_to_stack(seq, stack=StackJoyType(23)):
|
||||||
for item in seq: stack = item, stack
|
for item in seq: stack = item, stack
|
||||||
|
|
@ -1854,7 +1854,7 @@ conversion function instead. This is programmer’s laziness.
|
||||||
NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1])
|
NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1])
|
||||||
globals().update(NEW_DEFS)
|
globals().update(NEW_DEFS)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(stack, uncons)
|
C(stack, uncons)
|
||||||
|
|
||||||
|
|
@ -1867,7 +1867,7 @@ conversion function instead. This is programmer’s laziness.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
reduce(C, (stack, uncons, uncons))
|
reduce(C, (stack, uncons, uncons))
|
||||||
|
|
||||||
|
|
@ -1887,7 +1887,7 @@ The display function should be changed too.
|
||||||
|
|
||||||
Clunky junk, but it will suffice for now.
|
Clunky junk, but it will suffice for now.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def doc_from_stack_effect(inputs, outputs):
|
def doc_from_stack_effect(inputs, outputs):
|
||||||
switch = [False] # Do we need to display the '...' for the rest of the main stack?
|
switch = [False] # Do we need to display the '...' for the rest of the main stack?
|
||||||
|
|
@ -1935,7 +1935,7 @@ Clunky junk, but it will suffice for now.
|
||||||
a.append(end)
|
a.append(end)
|
||||||
return '[%s]' % ' '.join(a)
|
return '[%s]' % ' '.join(a)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for name, stack_effect_comment in sorted(NEW_DEFS.items()):
|
for name, stack_effect_comment in sorted(NEW_DEFS.items()):
|
||||||
print name, '=', doc_from_stack_effect(*stack_effect_comment)
|
print name, '=', doc_from_stack_effect(*stack_effect_comment)
|
||||||
|
|
@ -1973,7 +1973,7 @@ Clunky junk, but it will suffice for now.
|
||||||
uncons = ([a1 .1.] -- a1 [.1.])
|
uncons = ([a1 .1.] -- a1 [.1.])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print ; print doc_from_stack_effect(*stack)
|
print ; print doc_from_stack_effect(*stack)
|
||||||
print ; print doc_from_stack_effect(*C(stack, uncons))
|
print ; print doc_from_stack_effect(*C(stack, uncons))
|
||||||
|
|
@ -1993,7 +1993,7 @@ Clunky junk, but it will suffice for now.
|
||||||
(... a1 -- ... a1 [a1 ...])
|
(... a1 -- ... a1 [a1 ...])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*C(ccons, stack))
|
print doc_from_stack_effect(*C(ccons, stack))
|
||||||
|
|
||||||
|
|
@ -2003,7 +2003,7 @@ Clunky junk, but it will suffice for now.
|
||||||
(... a2 a1 [.1.] -- ... [a2 a1 .1.] [[a2 a1 .1.] ...])
|
(... a2 a1 [.1.] -- ... [a2 a1 .1.] [[a2 a1 .1.] ...])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
Q = C(ccons, stack)
|
Q = C(ccons, stack)
|
||||||
|
|
||||||
|
|
@ -2024,7 +2024,7 @@ Clunky junk, but it will suffice for now.
|
||||||
This makes the ``compile_()`` function pretty simple as the stack effect
|
This makes the ``compile_()`` function pretty simple as the stack effect
|
||||||
comments are now already in the form needed for the Python code:
|
comments are now already in the form needed for the Python code:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compile_(name, f, doc=None):
|
def compile_(name, f, doc=None):
|
||||||
i, o = f
|
i, o = f
|
||||||
|
|
@ -2035,7 +2035,7 @@ comments are now already in the form needed for the Python code:
|
||||||
%s = stack
|
%s = stack
|
||||||
return %s''' % (name, doc, i, o)
|
return %s''' % (name, doc, i, o)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print compile_('Q', Q)
|
print compile_('Q', Q)
|
||||||
|
|
||||||
|
|
@ -2053,12 +2053,12 @@ comments are now already in the form needed for the Python code:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
unstack = (S[1], S[0]), S[1]
|
unstack = (S[1], S[0]), S[1]
|
||||||
enstacken = S[0], (S[0], S[1])
|
enstacken = S[0], (S[0], S[1])
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*unstack)
|
print doc_from_stack_effect(*unstack)
|
||||||
|
|
||||||
|
|
@ -2068,7 +2068,7 @@ comments are now already in the form needed for the Python code:
|
||||||
([.1.] --)
|
([.1.] --)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*enstacken)
|
print doc_from_stack_effect(*enstacken)
|
||||||
|
|
||||||
|
|
@ -2078,7 +2078,7 @@ comments are now already in the form needed for the Python code:
|
||||||
(-- [.0.])
|
(-- [.0.])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*C(cons, unstack))
|
print doc_from_stack_effect(*C(cons, unstack))
|
||||||
|
|
||||||
|
|
@ -2088,7 +2088,7 @@ comments are now already in the form needed for the Python code:
|
||||||
(a1 [.1.] -- a1)
|
(a1 [.1.] -- a1)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*C(cons, enstacken))
|
print doc_from_stack_effect(*C(cons, enstacken))
|
||||||
|
|
||||||
|
|
@ -2098,7 +2098,7 @@ comments are now already in the form needed for the Python code:
|
||||||
(a1 [.1.] -- [[a1 .1.] .2.])
|
(a1 [.1.] -- [[a1 .1.] .2.])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(cons, unstack)
|
C(cons, unstack)
|
||||||
|
|
||||||
|
|
@ -2117,7 +2117,7 @@ Part VI: Multiple Stack Effects
|
||||||
|
|
||||||
…
|
…
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class IntJoyType(NumberJoyType): prefix = 'i'
|
class IntJoyType(NumberJoyType): prefix = 'i'
|
||||||
|
|
||||||
|
|
@ -2125,7 +2125,7 @@ Part VI: Multiple Stack Effects
|
||||||
F = map(FloatJoyType, _R)
|
F = map(FloatJoyType, _R)
|
||||||
I = map(IntJoyType, _R)
|
I = map(IntJoyType, _R)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
muls = [
|
muls = [
|
||||||
((I[2], (I[1], S[0])), (I[3], S[0])),
|
((I[2], (I[1], S[0])), (I[3], S[0])),
|
||||||
|
|
@ -2134,7 +2134,7 @@ Part VI: Multiple Stack Effects
|
||||||
((F[2], (F[1], S[0])), (F[3], S[0])),
|
((F[2], (F[1], S[0])), (F[3], S[0])),
|
||||||
]
|
]
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for f in muls:
|
for f in muls:
|
||||||
print doc_from_stack_effect(*f)
|
print doc_from_stack_effect(*f)
|
||||||
|
|
@ -2148,7 +2148,7 @@ Part VI: Multiple Stack Effects
|
||||||
(f1 f2 -- f3)
|
(f1 f2 -- f3)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for f in muls:
|
for f in muls:
|
||||||
try:
|
try:
|
||||||
|
|
@ -2164,7 +2164,7 @@ Part VI: Multiple Stack Effects
|
||||||
(a1 -- a1 a1) (f1 f2 -- f3) (f1 -- f2)
|
(a1 -- a1 a1) (f1 f2 -- f3) (f1 -- f2)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from itertools import product
|
from itertools import product
|
||||||
|
|
||||||
|
|
@ -2180,7 +2180,7 @@ Part VI: Multiple Stack Effects
|
||||||
def MC(F, G):
|
def MC(F, G):
|
||||||
return sorted(set(meta_compose(F, G)))
|
return sorted(set(meta_compose(F, G)))
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for f in MC([dup], [mul]):
|
for f in MC([dup], [mul]):
|
||||||
print doc_from_stack_effect(*f)
|
print doc_from_stack_effect(*f)
|
||||||
|
|
@ -2191,7 +2191,7 @@ Part VI: Multiple Stack Effects
|
||||||
(n1 -- n2)
|
(n1 -- n2)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for f in MC([dup], muls):
|
for f in MC([dup], muls):
|
||||||
print doc_from_stack_effect(*f)
|
print doc_from_stack_effect(*f)
|
||||||
|
|
@ -2264,7 +2264,7 @@ Giving us two unifiers:
|
||||||
{c: a, d: b, .1.: .0.}
|
{c: a, d: b, .1.: .0.}
|
||||||
{c: a, d: e, .1.: A* b .0.}
|
{c: a, d: e, .1.: A* b .0.}
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class KleeneStar(object):
|
class KleeneStar(object):
|
||||||
|
|
||||||
|
|
@ -2314,7 +2314,7 @@ Giving us two unifiers:
|
||||||
|
|
||||||
Can now return multiple results…
|
Can now return multiple results…
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def unify(u, v, s=None):
|
def unify(u, v, s=None):
|
||||||
if s is None:
|
if s is None:
|
||||||
|
|
@ -2386,7 +2386,7 @@ Can now return multiple results…
|
||||||
def stacky(thing):
|
def stacky(thing):
|
||||||
return thing.__class__ in {AnyJoyType, StackJoyType}
|
return thing.__class__ in {AnyJoyType, StackJoyType}
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
a = (As[1], S[1])
|
a = (As[1], S[1])
|
||||||
a
|
a
|
||||||
|
|
@ -2400,7 +2400,7 @@ Can now return multiple results…
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
b = (A[1], S[2])
|
b = (A[1], S[2])
|
||||||
b
|
b
|
||||||
|
|
@ -2414,7 +2414,7 @@ Can now return multiple results…
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for result in unify(b, a):
|
for result in unify(b, a):
|
||||||
print result, '->', update(result, a), update(result, b)
|
print result, '->', update(result, a), update(result, b)
|
||||||
|
|
@ -2426,7 +2426,7 @@ Can now return multiple results…
|
||||||
{a1: a10001, s2: (a1*, s1)} -> (a1*, s1) (a10001, (a1*, s1))
|
{a1: a10001, s2: (a1*, s1)} -> (a1*, s1) (a10001, (a1*, s1))
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for result in unify(a, b):
|
for result in unify(a, b):
|
||||||
print result, '->', update(result, a), update(result, b)
|
print result, '->', update(result, a), update(result, b)
|
||||||
|
|
@ -2446,7 +2446,7 @@ Can now return multiple results…
|
||||||
|
|
||||||
(a1*, s1) [a1*] (a2, (a1*, s1)) [a2 a1*]
|
(a1*, s1) [a1*] (a2, (a1*, s1)) [a2 a1*]
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
sum_ = ((Ns[1], S[1]), S[0]), (N[0], S[0])
|
sum_ = ((Ns[1], S[1]), S[0]), (N[0], S[0])
|
||||||
|
|
||||||
|
|
@ -2458,7 +2458,7 @@ Can now return multiple results…
|
||||||
([n1* .1.] -- n0)
|
([n1* .1.] -- n0)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
f = (N[1], (N[2], (N[3], S[1]))), S[0]
|
f = (N[1], (N[2], (N[3], S[1]))), S[0]
|
||||||
|
|
||||||
|
|
@ -2470,7 +2470,7 @@ Can now return multiple results…
|
||||||
(-- [n1 n2 n3 .1.])
|
(-- [n1 n2 n3 .1.])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for result in unify(sum_[0], f):
|
for result in unify(sum_[0], f):
|
||||||
print result, '->', update(result, sum_[1])
|
print result, '->', update(result, sum_[1])
|
||||||
|
|
@ -2489,7 +2489,7 @@ Can now return multiple results…
|
||||||
|
|
||||||
This function has to be modified to yield multiple results.
|
This function has to be modified to yield multiple results.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compose(f, g):
|
def compose(f, g):
|
||||||
(f_in, f_out), (g_in, g_out) = f, g
|
(f_in, f_out), (g_in, g_out) = f, g
|
||||||
|
|
@ -2501,7 +2501,7 @@ This function has to be modified to yield multiple results.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def meta_compose(F, G):
|
def meta_compose(F, G):
|
||||||
for f, g in product(F, G):
|
for f, g in product(F, G):
|
||||||
|
|
@ -2517,7 +2517,7 @@ This function has to be modified to yield multiple results.
|
||||||
for fg in compose(f, g):
|
for fg in compose(f, g):
|
||||||
yield delabel(fg)
|
yield delabel(fg)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for f in MC([dup], muls):
|
for f in MC([dup], muls):
|
||||||
print doc_from_stack_effect(*f)
|
print doc_from_stack_effect(*f)
|
||||||
|
|
@ -2529,7 +2529,7 @@ This function has to be modified to yield multiple results.
|
||||||
(i1 -- i2)
|
(i1 -- i2)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2542,7 +2542,7 @@ This function has to be modified to yield multiple results.
|
||||||
([n1* .1.] -- [n1* .1.] n1)
|
([n1* .1.] -- [n1* .1.] n1)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2556,7 +2556,7 @@ This function has to be modified to yield multiple results.
|
||||||
(n1 [n1* .1.] -- n2)
|
(n1 [n1* .1.] -- n2)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
sum_ = (((N[1], (Ns[1], S[1])), S[0]), (N[0], S[0]))
|
sum_ = (((N[1], (Ns[1], S[1])), S[0]), (N[0], S[0]))
|
||||||
print doc_from_stack_effect(*cons),
|
print doc_from_stack_effect(*cons),
|
||||||
|
|
@ -2571,7 +2571,7 @@ This function has to be modified to yield multiple results.
|
||||||
(a1 [.1.] -- [a1 .1.]) ([n1 n1* .1.] -- n0) (n1 [n1* .1.] -- n2)
|
(a1 [.1.] -- [a1 .1.]) ([n1 n1* .1.] -- n0) (n1 [n1* .1.] -- n2)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
a = (A[4], (As[1], (A[3], S[1])))
|
a = (A[4], (As[1], (A[3], S[1])))
|
||||||
a
|
a
|
||||||
|
|
@ -2585,7 +2585,7 @@ This function has to be modified to yield multiple results.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
b = (A[1], (A[2], S[2]))
|
b = (A[1], (A[2], S[2]))
|
||||||
b
|
b
|
||||||
|
|
@ -2599,7 +2599,7 @@ This function has to be modified to yield multiple results.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for result in unify(b, a):
|
for result in unify(b, a):
|
||||||
print result
|
print result
|
||||||
|
|
@ -2611,7 +2611,7 @@ This function has to be modified to yield multiple results.
|
||||||
{a1: a4, s2: (a1*, (a3, s1)), a2: a10003}
|
{a1: a4, s2: (a1*, (a3, s1)), a2: a10003}
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for result in unify(a, b):
|
for result in unify(a, b):
|
||||||
print result
|
print result
|
||||||
|
|
@ -2681,7 +2681,7 @@ We need a type variable for Joy functions that can go in our expressions
|
||||||
and be used by the hybrid inferencer/interpreter. They have to store a
|
and be used by the hybrid inferencer/interpreter. They have to store a
|
||||||
name and a list of stack effects.
|
name and a list of stack effects.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class FunctionJoyType(AnyJoyType):
|
class FunctionJoyType(AnyJoyType):
|
||||||
|
|
||||||
|
|
@ -2703,14 +2703,14 @@ Specialized for Simple Functions and Combinators
|
||||||
For non-combinator functions the stack effects list contains stack
|
For non-combinator functions the stack effects list contains stack
|
||||||
effect comments (represented by pairs of cons-lists as described above.)
|
effect comments (represented by pairs of cons-lists as described above.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class SymbolJoyType(FunctionJoyType):
|
class SymbolJoyType(FunctionJoyType):
|
||||||
prefix = 'F'
|
prefix = 'F'
|
||||||
|
|
||||||
For combinators the list contains Python functions.
|
For combinators the list contains Python functions.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class CombinatorJoyType(FunctionJoyType):
|
class CombinatorJoyType(FunctionJoyType):
|
||||||
|
|
||||||
|
|
@ -2731,7 +2731,7 @@ For combinators the list contains Python functions.
|
||||||
For simple combinators that have only one effect (like ``dip``) you only
|
For simple combinators that have only one effect (like ``dip``) you only
|
||||||
need one function and it can be the combinator itself.
|
need one function and it can be the combinator itself.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
import joy.library
|
import joy.library
|
||||||
|
|
||||||
|
|
@ -2741,7 +2741,7 @@ For combinators that can have more than one effect (like ``branch``) you
|
||||||
have to write functions that each implement the action of one of the
|
have to write functions that each implement the action of one of the
|
||||||
effects.
|
effects.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def branch_true(stack, expression, dictionary):
|
def branch_true(stack, expression, dictionary):
|
||||||
(then, (else_, (flag, stack))) = stack
|
(then, (else_, (flag, stack))) = stack
|
||||||
|
|
@ -2771,7 +2771,7 @@ updated along with the stack effects after doing unification or we risk
|
||||||
losing useful information. This was a straightforward, if awkward,
|
losing useful information. This was a straightforward, if awkward,
|
||||||
modification to the call structure of ``meta_compose()`` et. al.
|
modification to the call structure of ``meta_compose()`` et. al.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
ID = S[0], S[0] # Identity function.
|
ID = S[0], S[0] # Identity function.
|
||||||
|
|
||||||
|
|
@ -2833,7 +2833,7 @@ cruft to convert the definitions in ``DEFS`` to the new
|
||||||
``SymbolJoyType`` objects, and some combinators. Here is an example of
|
``SymbolJoyType`` objects, and some combinators. Here is an example of
|
||||||
output from the current code :
|
output from the current code :
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
1/0 # (Don't try to run this cell! It's not going to work. This is "read only" code heh..)
|
1/0 # (Don't try to run this cell! It's not going to work. This is "read only" code heh..)
|
||||||
|
|
||||||
|
|
@ -2956,7 +2956,7 @@ module. But if you’re interested in all that you should just use Prolog!
|
||||||
|
|
||||||
Anyhow, type *checking* is a few easy steps away.
|
Anyhow, type *checking* is a few easy steps away.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def _ge(self, other):
|
def _ge(self, other):
|
||||||
return (issubclass(other.__class__, self.__class__)
|
return (issubclass(other.__class__, self.__class__)
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ Huet <https://www.st.cs.uni-saarland.de/edu/seminare/2005/advanced-fp/docs/huet-
|
||||||
Given a datastructure on the stack we can navigate through it, modify
|
Given a datastructure on the stack we can navigate through it, modify
|
||||||
it, and rebuild it using the “zipper” technique.
|
it, and rebuild it using the “zipper” technique.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import J, V, define
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
|
@ -23,7 +23,7 @@ strings, Symbols (strings that are names of functions) and sequences
|
||||||
`trees <https://en.wikipedia.org/wiki/Tree_%28data_structure%29>`__ out
|
`trees <https://en.wikipedia.org/wiki/Tree_%28data_structure%29>`__ out
|
||||||
of sequences.
|
of sequences.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 [2 [3 4 25 6] 7] 8]')
|
J('[1 [2 [3 4 25 6] 7] 8]')
|
||||||
|
|
||||||
|
|
@ -54,14 +54,14 @@ show the trace so you can see how it works. If we were going to use
|
||||||
these a lot it would make sense to write Python versions for efficiency,
|
these a lot it would make sense to write Python versions for efficiency,
|
||||||
but see below.
|
but see below.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('z-down == [] swap uncons swap')
|
define('z-down == [] swap uncons swap')
|
||||||
define('z-up == swons swap shunt')
|
define('z-up == swons swap shunt')
|
||||||
define('z-right == [swons] cons dip uncons swap')
|
define('z-right == [swons] cons dip uncons swap')
|
||||||
define('z-left == swons [uncons swap] dip swap')
|
define('z-left == swons [uncons swap] dip swap')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[1 [2 [3 4 25 6] 7] 8] z-down')
|
V('[1 [2 [3 4 25 6] 7] 8] z-down')
|
||||||
|
|
||||||
|
|
@ -77,7 +77,7 @@ but see below.
|
||||||
[] [[2 [3 4 25 6] 7] 8] 1 .
|
[] [[2 [3 4 25 6] 7] 8] 1 .
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[] [[2 [3 4 25 6] 7] 8] 1 z-right')
|
V('[] [[2 [3 4 25 6] 7] 8] 1 z-right')
|
||||||
|
|
||||||
|
|
@ -101,7 +101,7 @@ but see below.
|
||||||
[1] [8] [2 [3 4 25 6] 7] .
|
[1] [8] [2 [3 4 25 6] 7] .
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2 [3 4 25 6] 7] z-down')
|
J('[1] [8] [2 [3 4 25 6] 7] z-down')
|
||||||
|
|
||||||
|
|
@ -111,7 +111,7 @@ but see below.
|
||||||
[1] [8] [] [[3 4 25 6] 7] 2
|
[1] [8] [] [[3 4 25 6] 7] 2
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [] [[3 4 25 6] 7] 2 z-right')
|
J('[1] [8] [] [[3 4 25 6] 7] 2 z-right')
|
||||||
|
|
||||||
|
|
@ -121,7 +121,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [3 4 25 6]
|
[1] [8] [2] [7] [3 4 25 6]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2] [7] [3 4 25 6] z-down')
|
J('[1] [8] [2] [7] [3 4 25 6] z-down')
|
||||||
|
|
||||||
|
|
@ -131,7 +131,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [] [4 25 6] 3
|
[1] [8] [2] [7] [] [4 25 6] 3
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2] [7] [] [4 25 6] 3 z-right')
|
J('[1] [8] [2] [7] [] [4 25 6] 3 z-right')
|
||||||
|
|
||||||
|
|
@ -141,7 +141,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [3] [25 6] 4
|
[1] [8] [2] [7] [3] [25 6] 4
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2] [7] [3] [25 6] 4 z-right')
|
J('[1] [8] [2] [7] [3] [25 6] 4 z-right')
|
||||||
|
|
||||||
|
|
@ -151,7 +151,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [4 3] [6] 25
|
[1] [8] [2] [7] [4 3] [6] 25
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2] [7] [4 3] [6] 25 sqr')
|
J('[1] [8] [2] [7] [4 3] [6] 25 sqr')
|
||||||
|
|
||||||
|
|
@ -161,7 +161,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [4 3] [6] 625
|
[1] [8] [2] [7] [4 3] [6] 625
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[1] [8] [2] [7] [4 3] [6] 625 z-up')
|
V('[1] [8] [2] [7] [4 3] [6] 625 z-up')
|
||||||
|
|
||||||
|
|
@ -184,7 +184,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [3 4 625 6] .
|
[1] [8] [2] [7] [3 4 625 6] .
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2] [7] [3 4 625 6] z-up')
|
J('[1] [8] [2] [7] [3 4 625 6] z-up')
|
||||||
|
|
||||||
|
|
@ -194,7 +194,7 @@ but see below.
|
||||||
[1] [8] [2 [3 4 625 6] 7]
|
[1] [8] [2 [3 4 625 6] 7]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2 [3 4 625 6] 7] z-up')
|
J('[1] [8] [2 [3 4 625 6] 7] z-up')
|
||||||
|
|
||||||
|
|
@ -210,7 +210,7 @@ but see below.
|
||||||
In Joy we have the ``dip`` and ``infra`` combinators which can “target”
|
In Joy we have the ``dip`` and ``infra`` combinators which can “target”
|
||||||
or “address” any particular item in a Joy tree structure.
|
or “address” any particular item in a Joy tree structure.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra')
|
V('[1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra')
|
||||||
|
|
||||||
|
|
@ -270,13 +270,13 @@ been embedded in a nested series of quoted programs, e.g.:
|
||||||
|
|
||||||
The ``Z`` function isn’t hard to make.
|
The ``Z`` function isn’t hard to make.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Z == [[] cons cons] step i')
|
define('Z == [[] cons cons] step i')
|
||||||
|
|
||||||
Here it is in action in a simplified scenario.
|
Here it is in action in a simplified scenario.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('1 [2 3 4] Z')
|
V('1 [2 3 4] Z')
|
||||||
|
|
||||||
|
|
@ -314,7 +314,7 @@ Here it is in action in a simplified scenario.
|
||||||
|
|
||||||
And here it is doing the main thing.
|
And here it is doing the main thing.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 [2 [3 4 25 6] 7] 8] [sqr] [dip dip infra dip infra dip infra] Z')
|
J('[1 [2 [3 4 25 6] 7] 8] [sqr] [dip dip infra dip infra dip infra] Z')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ These essays are adapted from Jupyter notebooks. I hope to have those hosted so
|
||||||
Treestep
|
Treestep
|
||||||
Generator_Programs
|
Generator_Programs
|
||||||
Newton-Raphson
|
Newton-Raphson
|
||||||
|
Square_Spiral
|
||||||
Zipper
|
Zipper
|
||||||
Types
|
Types
|
||||||
TypeChecking
|
TypeChecking
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,29 @@ additional joy interpreter (the binary in the archive from La Trobe seems
|
||||||
to run just fine on my modern Linux machine!) But I also hope that you
|
to run just fine on my modern Linux machine!) But I also hope that you
|
||||||
can read and understand the Python code and play with the implementation
|
can read and understand the Python code and play with the implementation
|
||||||
itself.</p>
|
itself.</p>
|
||||||
|
<section id="example-code">
|
||||||
|
<h2>Example Code<a class="headerlink" href="#example-code" title="Permalink to this headline">¶</a></h2>
|
||||||
|
<p>Here is an example of Joy code:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>[[[abs]ii <=][[<>][pop !-]||]&&][[!-][[++]][[--]]ifte dip][[pop !-][--][++]ifte]ifte
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>It might seem unreadable but with a little familiarity it becomes just as
|
||||||
|
legible as any other notation. Some layout helps:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>[ [[abs] ii <=]
|
||||||
|
[
|
||||||
|
[<>] [pop !-] ||
|
||||||
|
] &&
|
||||||
|
]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>This function accepts two integers on the stack and increments or
|
||||||
|
decrements one of them such that the new pair of numbers is the next
|
||||||
|
coordinate pair in a square spiral (like the kind used to construct an
|
||||||
|
Ulam Spiral). For more information see <a class="reference internal" href="notebooks/Square_Spiral.html"><span class="doc">Square Spiral Example Joy Code</span></a></p>
|
||||||
|
</section>
|
||||||
<section id="quick-start">
|
<section id="quick-start">
|
||||||
<h2>Quick Start<a class="headerlink" href="#quick-start" title="Permalink to this headline">¶</a></h2>
|
<h2>Quick Start<a class="headerlink" href="#quick-start" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>Install from <a class="reference external" href="https://pypi.org/project/Thun/">PyPI</a> in the usual way:</p>
|
<p>Install from <a class="reference external" href="https://pypi.org/project/Thun/">PyPI</a> in the usual way:</p>
|
||||||
|
|
@ -145,6 +168,7 @@ interesting aspects. It’s quite a treasure trove.</p>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="notebooks/Treestep.html">Treating Trees II: <code class="docutils literal notranslate"><span class="pre">treestep</span></code></a></li>
|
<li class="toctree-l2"><a class="reference internal" href="notebooks/Treestep.html">Treating Trees II: <code class="docutils literal notranslate"><span class="pre">treestep</span></code></a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="notebooks/Generator_Programs.html">Using <code class="docutils literal notranslate"><span class="pre">x</span></code> to Generate Values</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="notebooks/Generator_Programs.html">Using <code class="docutils literal notranslate"><span class="pre">x</span></code> to Generate Values</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="notebooks/Newton-Raphson.html">Newton’s method</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="notebooks/Newton-Raphson.html">Newton’s method</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="notebooks/Square_Spiral.html">Square Spiral Example Joy Code</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="notebooks/Zipper.html">Traversing Datastructures with Zippers</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="notebooks/Zipper.html">Traversing Datastructures with Zippers</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="notebooks/Types.html">The Blissful Elegance of Typing Joy</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="notebooks/Types.html">The Blissful Elegance of Typing Joy</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="notebooks/TypeChecking.html">Type Checking</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="notebooks/TypeChecking.html">Type Checking</a></li>
|
||||||
|
|
|
||||||
|
|
@ -96,14 +96,14 @@ R∘λ = λ∘R = R
|
||||||
</section>
|
</section>
|
||||||
<section id="implementation">
|
<section id="implementation">
|
||||||
<h2>Implementation<a class="headerlink" href="#implementation" title="Permalink to this headline">¶</a></h2>
|
<h2>Implementation<a class="headerlink" href="#implementation" title="Permalink to this headline">¶</a></h2>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">partial</span> <span class="k">as</span> <span class="n">curry</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">partial</span> <span class="k">as</span> <span class="n">curry</span>
|
||||||
<span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">product</span>
|
<span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">product</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<section id="and">
|
<section id="and">
|
||||||
<h3><code class="docutils literal notranslate"><span class="pre">ϕ</span></code> and <code class="docutils literal notranslate"><span class="pre">λ</span></code><a class="headerlink" href="#and" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal notranslate"><span class="pre">ϕ</span></code> and <code class="docutils literal notranslate"><span class="pre">λ</span></code><a class="headerlink" href="#and" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>The empty set and the set of just the empty string.</p>
|
<p>The empty set and the set of just the empty string.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">phi</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">()</span> <span class="c1"># ϕ</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">phi</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">()</span> <span class="c1"># ϕ</span>
|
||||||
<span class="n">y</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">({</span><span class="s1">''</span><span class="p">})</span> <span class="c1"># λ</span>
|
<span class="n">y</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">({</span><span class="s1">''</span><span class="p">})</span> <span class="c1"># λ</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -115,7 +115,7 @@ illustrate the algorithm and because you can represent any other
|
||||||
alphabet with two symbols (if you had to.)</p>
|
alphabet with two symbols (if you had to.)</p>
|
||||||
<p>I chose the names <code class="docutils literal notranslate"><span class="pre">O</span></code> and <code class="docutils literal notranslate"><span class="pre">l</span></code> (uppercase “o” and lowercase “L”) to
|
<p>I chose the names <code class="docutils literal notranslate"><span class="pre">O</span></code> and <code class="docutils literal notranslate"><span class="pre">l</span></code> (uppercase “o” and lowercase “L”) to
|
||||||
look like <code class="docutils literal notranslate"><span class="pre">0</span></code> and <code class="docutils literal notranslate"><span class="pre">1</span></code> (zero and one) respectively.</p>
|
look like <code class="docutils literal notranslate"><span class="pre">0</span></code> and <code class="docutils literal notranslate"><span class="pre">1</span></code> (zero and one) respectively.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">syms</span> <span class="o">=</span> <span class="n">O</span><span class="p">,</span> <span class="n">l</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">({</span><span class="s1">'0'</span><span class="p">}),</span> <span class="nb">frozenset</span><span class="p">({</span><span class="s1">'1'</span><span class="p">})</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">syms</span> <span class="o">=</span> <span class="n">O</span><span class="p">,</span> <span class="n">l</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">({</span><span class="s1">'0'</span><span class="p">}),</span> <span class="nb">frozenset</span><span class="p">({</span><span class="s1">'1'</span><span class="p">})</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
@ -133,7 +133,7 @@ expression</em> is one of:</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Where <code class="docutils literal notranslate"><span class="pre">R</span></code> and <code class="docutils literal notranslate"><span class="pre">S</span></code> stand for <em>regular expressions</em>.</p>
|
<p>Where <code class="docutils literal notranslate"><span class="pre">R</span></code> and <code class="docutils literal notranslate"><span class="pre">S</span></code> stand for <em>regular expressions</em>.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">AND</span><span class="p">,</span> <span class="n">CONS</span><span class="p">,</span> <span class="n">KSTAR</span><span class="p">,</span> <span class="n">NOT</span><span class="p">,</span> <span class="n">OR</span> <span class="o">=</span> <span class="s1">'and cons * not or'</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> <span class="c1"># Tags are just strings.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">AND</span><span class="p">,</span> <span class="n">CONS</span><span class="p">,</span> <span class="n">KSTAR</span><span class="p">,</span> <span class="n">NOT</span><span class="p">,</span> <span class="n">OR</span> <span class="o">=</span> <span class="s1">'and cons * not or'</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> <span class="c1"># Tags are just strings.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Because they are formed of <code class="docutils literal notranslate"><span class="pre">frozenset</span></code>, <code class="docutils literal notranslate"><span class="pre">tuple</span></code> and <code class="docutils literal notranslate"><span class="pre">str</span></code> objects
|
<p>Because they are formed of <code class="docutils literal notranslate"><span class="pre">frozenset</span></code>, <code class="docutils literal notranslate"><span class="pre">tuple</span></code> and <code class="docutils literal notranslate"><span class="pre">str</span></code> objects
|
||||||
|
|
@ -141,7 +141,7 @@ only, these datastructures are immutable.</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="string-representation-of-re-datastructures">
|
<section id="string-representation-of-re-datastructures">
|
||||||
<h3>String Representation of RE Datastructures<a class="headerlink" href="#string-representation-of-re-datastructures" title="Permalink to this headline">¶</a></h3>
|
<h3>String Representation of RE Datastructures<a class="headerlink" href="#string-representation-of-re-datastructures" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">stringy</span><span class="p">(</span><span class="n">re</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">stringy</span><span class="p">(</span><span class="n">re</span><span class="p">):</span>
|
||||||
<span class="sd">'''</span>
|
<span class="sd">'''</span>
|
||||||
<span class="sd"> Return a nice string repr for a regular expression datastructure.</span>
|
<span class="sd"> Return a nice string repr for a regular expression datastructure.</span>
|
||||||
<span class="sd"> '''</span>
|
<span class="sd"> '''</span>
|
||||||
|
|
@ -180,10 +180,10 @@ only, these datastructures are immutable.</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">I</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="o">|</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">I</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="o">|</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">I</span> <span class="o">=</span> <span class="p">(</span><span class="n">KSTAR</span><span class="p">,</span> <span class="p">(</span><span class="n">OR</span><span class="p">,</span> <span class="n">O</span><span class="p">,</span> <span class="n">l</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">I</span> <span class="o">=</span> <span class="p">(</span><span class="n">KSTAR</span><span class="p">,</span> <span class="p">(</span><span class="n">OR</span><span class="p">,</span> <span class="n">O</span><span class="p">,</span> <span class="n">l</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">stringy</span><span class="p">(</span><span class="n">I</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">stringy</span><span class="p">(</span><span class="n">I</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">.</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">.</span>
|
||||||
|
|
@ -198,13 +198,13 @@ only, these datastructures are immutable.</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Note that it contains one of everything.</p>
|
<p>Note that it contains one of everything.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">I</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">I</span><span class="p">))))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">I</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">I</span><span class="p">))))</span>
|
||||||
<span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">I</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">O</span><span class="p">,</span> <span class="n">l</span><span class="p">))</span>
|
<span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">I</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">O</span><span class="p">,</span> <span class="n">l</span><span class="p">))</span>
|
||||||
<span class="n">c</span> <span class="o">=</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="n">KSTAR</span><span class="p">,</span> <span class="n">l</span><span class="p">))</span>
|
<span class="n">c</span> <span class="o">=</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="n">KSTAR</span><span class="p">,</span> <span class="n">l</span><span class="p">))</span>
|
||||||
<span class="n">it</span> <span class="o">=</span> <span class="p">(</span><span class="n">AND</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">NOT</span><span class="p">,</span> <span class="p">(</span><span class="n">OR</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)))</span>
|
<span class="n">it</span> <span class="o">=</span> <span class="p">(</span><span class="n">AND</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">NOT</span><span class="p">,</span> <span class="p">(</span><span class="n">OR</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">stringy</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">stringy</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">.</span><span class="mf">111.</span><span class="p">)</span> <span class="o">&</span> <span class="p">((</span><span class="o">.</span><span class="mi">01</span> <span class="o">|</span> <span class="mi">11</span><span class="o">*</span><span class="p">)</span><span class="s1">')</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">.</span><span class="mf">111.</span><span class="p">)</span> <span class="o">&</span> <span class="p">((</span><span class="o">.</span><span class="mi">01</span> <span class="o">|</span> <span class="mi">11</span><span class="o">*</span><span class="p">)</span><span class="s1">')</span>
|
||||||
|
|
@ -214,7 +214,7 @@ only, these datastructures are immutable.</p>
|
||||||
<section id="nully">
|
<section id="nully">
|
||||||
<h3><code class="docutils literal notranslate"><span class="pre">nully()</span></code><a class="headerlink" href="#nully" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal notranslate"><span class="pre">nully()</span></code><a class="headerlink" href="#nully" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>Let’s get that auxiliary predicate function <code class="docutils literal notranslate"><span class="pre">δ</span></code> out of the way.</p>
|
<p>Let’s get that auxiliary predicate function <code class="docutils literal notranslate"><span class="pre">δ</span></code> out of the way.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">nully</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">nully</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
|
||||||
<span class="sd">'''</span>
|
<span class="sd">'''</span>
|
||||||
<span class="sd"> δ - Return λ if λ ⊆ R otherwise ϕ.</span>
|
<span class="sd"> δ - Return λ if λ ⊆ R otherwise ϕ.</span>
|
||||||
<span class="sd"> '''</span>
|
<span class="sd"> '''</span>
|
||||||
|
|
@ -252,7 +252,7 @@ only, these datastructures are immutable.</p>
|
||||||
<p>This is the straightforward version with no “compaction”. It works fine,
|
<p>This is the straightforward version with no “compaction”. It works fine,
|
||||||
but does waaaay too much work because the expressions grow each
|
but does waaaay too much work because the expressions grow each
|
||||||
derivation.</p>
|
derivation.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">D</span><span class="p">(</span><span class="n">symbol</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">D</span><span class="p">(</span><span class="n">symbol</span><span class="p">):</span>
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">derv</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
|
<span class="k">def</span> <span class="nf">derv</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
|
||||||
|
|
||||||
|
|
@ -296,7 +296,7 @@ derivation.</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="compaction-rules">
|
<section id="compaction-rules">
|
||||||
<h3>Compaction Rules<a class="headerlink" href="#compaction-rules" title="Permalink to this headline">¶</a></h3>
|
<h3>Compaction Rules<a class="headerlink" href="#compaction-rules" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">_compaction_rule</span><span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="n">one</span><span class="p">,</span> <span class="n">zero</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">_compaction_rule</span><span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="n">one</span><span class="p">,</span> <span class="n">zero</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
||||||
<span class="k">return</span> <span class="p">(</span>
|
<span class="k">return</span> <span class="p">(</span>
|
||||||
<span class="n">b</span> <span class="k">if</span> <span class="n">a</span> <span class="o">==</span> <span class="n">one</span> <span class="k">else</span> <span class="c1"># R*1 = 1*R = R</span>
|
<span class="n">b</span> <span class="k">if</span> <span class="n">a</span> <span class="o">==</span> <span class="n">one</span> <span class="k">else</span> <span class="c1"># R*1 = 1*R = R</span>
|
||||||
<span class="n">a</span> <span class="k">if</span> <span class="n">b</span> <span class="o">==</span> <span class="n">one</span> <span class="k">else</span>
|
<span class="n">a</span> <span class="k">if</span> <span class="n">b</span> <span class="o">==</span> <span class="n">one</span> <span class="k">else</span>
|
||||||
|
|
@ -306,7 +306,7 @@ derivation.</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>An elegant symmetry.</p>
|
<p>An elegant symmetry.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># R ∧ I = I ∧ R = R</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="c1"># R ∧ I = I ∧ R = R</span>
|
||||||
<span class="c1"># R ∧ ϕ = ϕ ∧ R = ϕ</span>
|
<span class="c1"># R ∧ ϕ = ϕ ∧ R = ϕ</span>
|
||||||
<span class="n">_and</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="n">_compaction_rule</span><span class="p">,</span> <span class="n">AND</span><span class="p">,</span> <span class="n">I</span><span class="p">,</span> <span class="n">phi</span><span class="p">)</span>
|
<span class="n">_and</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="n">_compaction_rule</span><span class="p">,</span> <span class="n">AND</span><span class="p">,</span> <span class="n">I</span><span class="p">,</span> <span class="n">phi</span><span class="p">)</span>
|
||||||
|
|
||||||
|
|
@ -325,7 +325,7 @@ derivation.</p>
|
||||||
<p>We can save re-processing by remembering results we have already
|
<p>We can save re-processing by remembering results we have already
|
||||||
computed. RE datastructures are immutable and the <code class="docutils literal notranslate"><span class="pre">derv()</span></code> functions
|
computed. RE datastructures are immutable and the <code class="docutils literal notranslate"><span class="pre">derv()</span></code> functions
|
||||||
are <em>pure</em> so this is fine.</p>
|
are <em>pure</em> so this is fine.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Memo</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Memo</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
||||||
|
|
||||||
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
|
||||||
<span class="bp">self</span><span class="o">.</span><span class="n">f</span> <span class="o">=</span> <span class="n">f</span>
|
<span class="bp">self</span><span class="o">.</span><span class="n">f</span> <span class="o">=</span> <span class="n">f</span>
|
||||||
|
|
@ -347,7 +347,7 @@ are <em>pure</em> so this is fine.</p>
|
||||||
<h3>With “Compaction”<a class="headerlink" href="#with-compaction" title="Permalink to this headline">¶</a></h3>
|
<h3>With “Compaction”<a class="headerlink" href="#with-compaction" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>This version uses the rules above to perform compaction. It keeps the
|
<p>This version uses the rules above to perform compaction. It keeps the
|
||||||
expressions from growing too large.</p>
|
expressions from growing too large.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">D_compaction</span><span class="p">(</span><span class="n">symbol</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">D_compaction</span><span class="p">(</span><span class="n">symbol</span><span class="p">):</span>
|
||||||
|
|
||||||
<span class="nd">@Memo</span>
|
<span class="nd">@Memo</span>
|
||||||
<span class="k">def</span> <span class="nf">derv</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
|
<span class="k">def</span> <span class="nf">derv</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
|
||||||
|
|
@ -395,7 +395,7 @@ expressions from growing too large.</p>
|
||||||
<section id="lets-try-it-out">
|
<section id="lets-try-it-out">
|
||||||
<h2>Let’s try it out…<a class="headerlink" href="#lets-try-it-out" title="Permalink to this headline">¶</a></h2>
|
<h2>Let’s try it out…<a class="headerlink" href="#lets-try-it-out" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>(FIXME: redo.)</p>
|
<p>(FIXME: redo.)</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">o</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'0'</span><span class="p">),</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'1'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">o</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'0'</span><span class="p">),</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'1'</span><span class="p">)</span>
|
||||||
<span class="n">REs</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
|
<span class="n">REs</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
|
||||||
<span class="n">N</span> <span class="o">=</span> <span class="mi">5</span>
|
<span class="n">N</span> <span class="o">=</span> <span class="mi">5</span>
|
||||||
<span class="n">names</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">product</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)])))</span>
|
<span class="n">names</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">product</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)])))</span>
|
||||||
|
|
@ -500,8 +500,8 @@ machine transition table.</p>
|
||||||
</div>
|
</div>
|
||||||
<p>Says, “Three or more 1’s and not ending in 01 nor composed of all 1’s.”</p>
|
<p>Says, “Three or more 1’s and not ending in 01 nor composed of all 1’s.”</p>
|
||||||
<figure class="align-default" id="id2">
|
<figure class="align-default" id="id2">
|
||||||
<img alt="State Machine Graph" src="../_images/omg.svg" /><figcaption>
|
<img alt="omg.svg" src="notebooks/attachment:omg.svg" /><figcaption>
|
||||||
<p><span class="caption-text">State Machine Graph</span><a class="headerlink" href="#id2" title="Permalink to this image">¶</a></p>
|
<p><span class="caption-text">omg.svg</span><a class="headerlink" href="#id2" title="Permalink to this image">¶</a></p>
|
||||||
</figcaption>
|
</figcaption>
|
||||||
</figure>
|
</figure>
|
||||||
<p>Start at <code class="docutils literal notranslate"><span class="pre">a</span></code> and follow the transition arrows according to their
|
<p>Start at <code class="docutils literal notranslate"><span class="pre">a</span></code> and follow the transition arrows according to their
|
||||||
|
|
@ -555,18 +555,18 @@ a --1--> ∂1(a)
|
||||||
<p>You can see the one-way nature of the <code class="docutils literal notranslate"><span class="pre">g</span></code> state and the <code class="docutils literal notranslate"><span class="pre">hij</span></code> “trap”
|
<p>You can see the one-way nature of the <code class="docutils literal notranslate"><span class="pre">g</span></code> state and the <code class="docutils literal notranslate"><span class="pre">hij</span></code> “trap”
|
||||||
in the way that the <code class="docutils literal notranslate"><span class="pre">.111.</span></code> on the left-hand side of the <code class="docutils literal notranslate"><span class="pre">&</span></code>
|
in the way that the <code class="docutils literal notranslate"><span class="pre">.111.</span></code> on the left-hand side of the <code class="docutils literal notranslate"><span class="pre">&</span></code>
|
||||||
disappears once it has been matched.</p>
|
disappears once it has been matched.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
|
||||||
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>
|
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>
|
||||||
<span class="kn">from</span> <span class="nn">string</span> <span class="kn">import</span> <span class="n">ascii_lowercase</span>
|
<span class="kn">from</span> <span class="nn">string</span> <span class="kn">import</span> <span class="n">ascii_lowercase</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">d0</span><span class="p">,</span> <span class="n">d1</span> <span class="o">=</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'0'</span><span class="p">),</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'1'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">d0</span><span class="p">,</span> <span class="n">d1</span> <span class="o">=</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'0'</span><span class="p">),</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'1'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section id="explore">
|
<section id="explore">
|
||||||
<h3><code class="docutils literal notranslate"><span class="pre">explore()</span></code><a class="headerlink" href="#explore" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal notranslate"><span class="pre">explore()</span></code><a class="headerlink" href="#explore" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">explore</span><span class="p">(</span><span class="n">re</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">explore</span><span class="p">(</span><span class="n">re</span><span class="p">):</span>
|
||||||
|
|
||||||
<span class="c1"># Don't have more than 26 states...</span>
|
<span class="c1"># Don't have more than 26 states...</span>
|
||||||
<span class="n">names</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="n">ascii_lowercase</span><span class="p">)</span><span class="o">.</span><span class="n">next</span><span class="p">)</span>
|
<span class="n">names</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="n">ascii_lowercase</span><span class="p">)</span><span class="o">.</span><span class="n">next</span><span class="p">)</span>
|
||||||
|
|
@ -592,7 +592,7 @@ disappears once it has been matched.</p>
|
||||||
<span class="k">return</span> <span class="n">table</span><span class="p">,</span> <span class="n">accepting</span>
|
<span class="k">return</span> <span class="n">table</span><span class="p">,</span> <span class="n">accepting</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">table</span><span class="p">,</span> <span class="n">accepting</span> <span class="o">=</span> <span class="n">explore</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">table</span><span class="p">,</span> <span class="n">accepting</span> <span class="o">=</span> <span class="n">explore</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
|
||||||
<span class="n">table</span>
|
<span class="n">table</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -618,7 +618,7 @@ disappears once it has been matched.</p>
|
||||||
<span class="p">(</span><span class="s1">'j'</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span> <span class="s1">'h'</span><span class="p">}</span>
|
<span class="p">(</span><span class="s1">'j'</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span> <span class="s1">'h'</span><span class="p">}</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">accepting</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">accepting</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'h'</span><span class="p">,</span> <span class="s1">'i'</span><span class="p">}</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'h'</span><span class="p">,</span> <span class="s1">'i'</span><span class="p">}</span>
|
||||||
|
|
@ -629,7 +629,7 @@ disappears once it has been matched.</p>
|
||||||
<h3>Generate Diagram<a class="headerlink" href="#generate-diagram" title="Permalink to this headline">¶</a></h3>
|
<h3>Generate Diagram<a class="headerlink" href="#generate-diagram" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>Once we have the FSM table and the set of accepting states we can
|
<p>Once we have the FSM table and the set of accepting states we can
|
||||||
generate the diagram above.</p>
|
generate the diagram above.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">_template</span> <span class="o">=</span> <span class="s1">'''</span><span class="se">\</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">_template</span> <span class="o">=</span> <span class="s1">'''</span><span class="se">\</span>
|
||||||
<span class="s1">digraph finite_state_machine {</span>
|
<span class="s1">digraph finite_state_machine {</span>
|
||||||
<span class="s1"> rankdir=LR;</span>
|
<span class="s1"> rankdir=LR;</span>
|
||||||
<span class="s1"> size="8,5"</span>
|
<span class="s1"> size="8,5"</span>
|
||||||
|
|
@ -653,7 +653,7 @@ generate the diagram above.</p>
|
||||||
<span class="p">)</span>
|
<span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">make_graph</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="n">accepting</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">make_graph</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="n">accepting</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">digraph</span> <span class="n">finite_state_machine</span> <span class="p">{</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">digraph</span> <span class="n">finite_state_machine</span> <span class="p">{</span>
|
||||||
|
|
@ -699,7 +699,7 @@ hard-code the information in the table into a little patch of branches.</p>
|
||||||
<h4>Trampoline Function<a class="headerlink" href="#trampoline-function" title="Permalink to this headline">¶</a></h4>
|
<h4>Trampoline Function<a class="headerlink" href="#trampoline-function" title="Permalink to this headline">¶</a></h4>
|
||||||
<p>Python has no GOTO statement but we can fake it with a “trampoline”
|
<p>Python has no GOTO statement but we can fake it with a “trampoline”
|
||||||
function.</p>
|
function.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">trampoline</span><span class="p">(</span><span class="n">input_</span><span class="p">,</span> <span class="n">jump_from</span><span class="p">,</span> <span class="n">accepting</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">trampoline</span><span class="p">(</span><span class="n">input_</span><span class="p">,</span> <span class="n">jump_from</span><span class="p">,</span> <span class="n">accepting</span><span class="p">):</span>
|
||||||
<span class="n">I</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">input_</span><span class="p">)</span>
|
<span class="n">I</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">input_</span><span class="p">)</span>
|
||||||
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
||||||
<span class="k">try</span><span class="p">:</span>
|
<span class="k">try</span><span class="p">:</span>
|
||||||
|
|
@ -714,7 +714,7 @@ function.</p>
|
||||||
<h4>Stream Functions<a class="headerlink" href="#stream-functions" title="Permalink to this headline">¶</a></h4>
|
<h4>Stream Functions<a class="headerlink" href="#stream-functions" title="Permalink to this headline">¶</a></h4>
|
||||||
<p>Little helpers to process the iterator of our data (a “stream” of “1”
|
<p>Little helpers to process the iterator of our data (a “stream” of “1”
|
||||||
and “0” characters, not bits.)</p>
|
and “0” characters, not bits.)</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">getch</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="nb">next</span><span class="p">(</span><span class="n">I</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">getch</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="nb">next</span><span class="p">(</span><span class="n">I</span><span class="p">))</span>
|
||||||
|
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">_1</span><span class="p">(</span><span class="n">I</span><span class="p">):</span>
|
<span class="k">def</span> <span class="nf">_1</span><span class="p">(</span><span class="n">I</span><span class="p">):</span>
|
||||||
|
|
@ -735,7 +735,7 @@ and “0” characters, not bits.)</p>
|
||||||
code. (You have to imagine that these are GOTO statements in C or
|
code. (You have to imagine that these are GOTO statements in C or
|
||||||
branches in assembly and that the state names are branch destination
|
branches in assembly and that the state names are branch destination
|
||||||
labels.)</p>
|
labels.)</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">c</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">c</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
||||||
<span class="n">b</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">_0</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="ow">or</span> <span class="n">d</span>
|
<span class="n">b</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">_0</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="ow">or</span> <span class="n">d</span>
|
||||||
<span class="n">c</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">e</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
<span class="n">c</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">e</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
||||||
<span class="n">d</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">f</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
<span class="n">d</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">f</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
||||||
|
|
@ -750,11 +750,11 @@ labels.)</p>
|
||||||
<p>Note that the implementations of <code class="docutils literal notranslate"><span class="pre">h</span></code> and <code class="docutils literal notranslate"><span class="pre">g</span></code> are identical ergo
|
<p>Note that the implementations of <code class="docutils literal notranslate"><span class="pre">h</span></code> and <code class="docutils literal notranslate"><span class="pre">g</span></code> are identical ergo
|
||||||
<code class="docutils literal notranslate"><span class="pre">h</span> <span class="pre">=</span> <span class="pre">g</span></code> and we could eliminate one in the code but <code class="docutils literal notranslate"><span class="pre">h</span></code> is an
|
<code class="docutils literal notranslate"><span class="pre">h</span> <span class="pre">=</span> <span class="pre">g</span></code> and we could eliminate one in the code but <code class="docutils literal notranslate"><span class="pre">h</span></code> is an
|
||||||
accepting state and <code class="docutils literal notranslate"><span class="pre">g</span></code> isn’t.</p>
|
accepting state and <code class="docutils literal notranslate"><span class="pre">g</span></code> isn’t.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">acceptable</span><span class="p">(</span><span class="n">input_</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">acceptable</span><span class="p">(</span><span class="n">input_</span><span class="p">):</span>
|
||||||
<span class="k">return</span> <span class="n">trampoline</span><span class="p">(</span><span class="n">input_</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="p">{</span><span class="n">h</span><span class="p">,</span> <span class="n">i</span><span class="p">})</span>
|
<span class="k">return</span> <span class="n">trampoline</span><span class="p">(</span><span class="n">input_</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="p">{</span><span class="n">h</span><span class="p">,</span> <span class="n">i</span><span class="p">})</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">5</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">5</span><span class="p">):</span>
|
||||||
<span class="n">s</span> <span class="o">=</span> <span class="nb">bin</span><span class="p">(</span><span class="n">n</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>
|
<span class="n">s</span> <span class="o">=</span> <span class="nb">bin</span><span class="p">(</span><span class="n">n</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>
|
||||||
<span class="nb">print</span> <span class="s1">'</span><span class="si">%05s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">s</span><span class="p">,</span> <span class="n">acceptable</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="s1">'</span><span class="si">%05s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">s</span><span class="p">,</span> <span class="n">acceptable</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -878,6 +878,7 @@ derivative-with-respect-to-N of some other state/RE:</p>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Treestep.html">Treating Trees II: <code class="docutils literal notranslate"><span class="pre">treestep</span></code></a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Treestep.html">Treating Trees II: <code class="docutils literal notranslate"><span class="pre">treestep</span></code></a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Generator_Programs.html">Using <code class="docutils literal notranslate"><span class="pre">x</span></code> to Generate Values</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Generator_Programs.html">Using <code class="docutils literal notranslate"><span class="pre">x</span></code> to Generate Values</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Newton-Raphson.html">Newton’s method</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Newton-Raphson.html">Newton’s method</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Square_Spiral.html">Square Spiral Example Joy Code</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Zipper.html">Traversing Datastructures with Zippers</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Zipper.html">Traversing Datastructures with Zippers</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Types.html">The Blissful Elegance of Typing Joy</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Types.html">The Blissful Elegance of Typing Joy</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="TypeChecking.html">Type Checking</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="TypeChecking.html">Type Checking</a></li>
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -40,7 +40,7 @@
|
||||||
to write a function that can compute the square root of a number.</p>
|
to write a function that can compute the square root of a number.</p>
|
||||||
<p>Cf. <a class="reference external" href="https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf">“Why Functional Programming Matters” by John
|
<p>Cf. <a class="reference external" href="https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf">“Why Functional Programming Matters” by John
|
||||||
Hughes</a></p>
|
Hughes</a></p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<section id="a-generator-for-approximations">
|
<section id="a-generator-for-approximations">
|
||||||
|
|
@ -92,10 +92,10 @@ function we’re writing. If we let 1 be the initial approximation:</p>
|
||||||
<span class="mi">1</span> <span class="p">[</span><span class="n">dup</span> <span class="mi">23</span> <span class="n">over</span> <span class="o">/</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">/</span><span class="p">]</span> <span class="n">make_generator</span>
|
<span class="mi">1</span> <span class="p">[</span><span class="n">dup</span> <span class="mi">23</span> <span class="n">over</span> <span class="o">/</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">/</span><span class="p">]</span> <span class="n">make_generator</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'gsra 1 swap [over / + 2 /] cons [dup] swoncat make_generator'</span><span class="p">)</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'gsra 1 swap [over / + 2 /] cons [dup] swoncat make_generator'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 gsra'</span><span class="p">)</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 gsra'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="n">dup</span> <span class="mi">23</span> <span class="n">over</span> <span class="o">/</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">/</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="n">dup</span> <span class="mi">23</span> <span class="n">over</span> <span class="o">/</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">/</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span>
|
||||||
|
|
@ -103,7 +103,7 @@ function we’re writing. If we let 1 be the initial approximation:</p>
|
||||||
</div>
|
</div>
|
||||||
<p>Let’s drive the generator a few time (with the <code class="docutils literal notranslate"><span class="pre">x</span></code> combinator) and
|
<p>Let’s drive the generator a few time (with the <code class="docutils literal notranslate"><span class="pre">x</span></code> combinator) and
|
||||||
square the approximation to see how well it works…</p>
|
square the approximation to see how well it works…</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 gsra 6 [x popd] times first sqr'</span><span class="p">)</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 gsra 6 [x popd] times first sqr'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">23.0000000001585</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">23.0000000001585</span>
|
||||||
|
|
@ -145,7 +145,7 @@ generated already and epsilon ε is handy on the stack…</p>
|
||||||
<span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">a</span><span class="o">-</span><span class="n">b</span><span class="p">)</span><span class="o"><=</span><span class="n">ε</span><span class="p">)</span>
|
<span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">a</span><span class="o">-</span><span class="n">b</span><span class="p">)</span><span class="o"><=</span><span class="n">ε</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'_within_P [first - abs] dip <='</span><span class="p">)</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'_within_P [first - abs] dip <='</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
@ -157,7 +157,7 @@ generated already and epsilon ε is handy on the stack…</p>
|
||||||
<span class="n">b</span>
|
<span class="n">b</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'_within_B roll< popop first'</span><span class="p">)</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'_within_B roll< popop first'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
@ -182,7 +182,7 @@ generated already and epsilon ε is handy on the stack…</p>
|
||||||
<span class="n">b</span> <span class="p">[</span><span class="n">c</span> <span class="n">G</span><span class="p">]</span> <span class="n">ε</span> <span class="n">within</span>
|
<span class="n">b</span> <span class="p">[</span><span class="n">c</span> <span class="n">G</span><span class="p">]</span> <span class="n">ε</span> <span class="n">within</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'_within_R [popd x] dip'</span><span class="p">)</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'_within_R [popd x] dip'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
@ -194,31 +194,31 @@ generated already and epsilon ε is handy on the stack…</p>
|
||||||
<span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">G</span><span class="p">]</span> <span class="n">ε</span> <span class="o">...</span>
|
<span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">G</span><span class="p">]</span> <span class="n">ε</span> <span class="o">...</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'within x 0.000000001 [_within_P] [_within_B] [_within_R] tailrec'</span><span class="p">)</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'within x 0.000000001 [_within_P] [_within_B] [_within_R] tailrec'</span><span class="p">)</span>
|
||||||
<span class="n">define</span><span class="p">(</span><span class="s1">'sqrt gsra within'</span><span class="p">)</span>
|
<span class="n">define</span><span class="p">(</span><span class="s1">'sqrt gsra within'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Try it out…</p>
|
<p>Try it out…</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'36 sqrt'</span><span class="p">)</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'36 sqrt'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">6.0</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">6.0</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 sqrt'</span><span class="p">)</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 sqrt'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">4.795831523312719</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">4.795831523312719</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Check it.</p>
|
<p>Check it.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="mf">4.795831523312719</span><span class="o">**</span><span class="mi">2</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="mf">4.795831523312719</span><span class="o">**</span><span class="mi">2</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">22.999999999999996</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">22.999999999999996</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">sqrt</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">sqrt</span>
|
||||||
|
|
||||||
<span class="n">sqrt</span><span class="p">(</span><span class="mi">23</span><span class="p">)</span>
|
<span class="n">sqrt</span><span class="p">(</span><span class="mi">23</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ the Sufficiently Smart Compiler can be modified to use an optimized
|
||||||
implementation under the hood. (Where does the “type” come from? It has
|
implementation under the hood. (Where does the “type” come from? It has
|
||||||
a contingent existence predicated on the disciplined use of these
|
a contingent existence predicated on the disciplined use of these
|
||||||
functions on otherwise undistinguished Joy datastructures.)</p>
|
functions on otherwise undistinguished Joy datastructures.)</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span><span class="p">,</span> <span class="n">DefinitionWrapper</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span><span class="p">,</span> <span class="n">DefinitionWrapper</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<section id="adding-nodes-to-the-tree">
|
<section id="adding-nodes-to-the-tree">
|
||||||
|
|
@ -100,10 +100,10 @@ functions on otherwise undistinguished Joy datastructures.)</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tree</span><span class="o">-</span><span class="n">new</span> <span class="o">==</span> <span class="n">swap</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons</span> <span class="n">cons</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tree</span><span class="o">-</span><span class="n">new</span> <span class="o">==</span> <span class="n">swap</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons</span> <span class="n">cons</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-new == swap [[] []] cons cons'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-new == swap [[] []] cons cons'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'"v" "k" Tree-new'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'"v" "k" Tree-new'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'k'</span> <span class="s1">'v'</span> <span class="p">[]</span> <span class="p">[]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'k'</span> <span class="s1">'v'</span> <span class="p">[]</span> <span class="p">[]]</span>
|
||||||
|
|
@ -159,10 +159,10 @@ comparison operator:</p>
|
||||||
<span class="n">P</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">roll</span><span class="o">></span> <span class="n">pop</span> <span class="n">first</span>
|
<span class="n">P</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">roll</span><span class="o">></span> <span class="n">pop</span> <span class="n">first</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'P == pop roll> pop first'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'P == pop roll> pop first'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["old_key" 23 [] []] 17 "new_key" ["..."] P'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["old_key" 23 [] []] 17 "new_key" ["..."] P'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'new_key'</span> <span class="s1">'old_key'</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'new_key'</span> <span class="s1">'old_key'</span>
|
||||||
|
|
@ -217,10 +217,10 @@ stack:</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">T</span> <span class="o">==</span> <span class="n">cons</span> <span class="n">cons</span> <span class="p">[</span><span class="n">dipdd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">infra</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">T</span> <span class="o">==</span> <span class="n">cons</span> <span class="n">cons</span> <span class="p">[</span><span class="n">dipdd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">infra</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'T == cons cons [dipdd] cons infra'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'T == cons cons [dipdd] cons infra'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] T'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] T'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'old_k'</span> <span class="s1">'old_value'</span> <span class="s1">'left'</span> <span class="s1">'Tree-add'</span> <span class="s1">'new_key'</span> <span class="s1">'new_value'</span> <span class="s1">'right'</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'old_k'</span> <span class="s1">'old_value'</span> <span class="s1">'left'</span> <span class="s1">'Tree-add'</span> <span class="s1">'new_key'</span> <span class="s1">'new_value'</span> <span class="s1">'right'</span><span class="p">]</span>
|
||||||
|
|
@ -234,7 +234,7 @@ stack:</p>
|
||||||
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">Tree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="p">[</span><span class="n">P</span> <span class="o"><</span><span class="p">]</span> <span class="p">[</span><span class="n">Te</span><span class="p">]</span> <span class="p">[</span><span class="n">Ee</span><span class="p">]</span> <span class="n">ifte</span>
|
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">Tree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="p">[</span><span class="n">P</span> <span class="o"><</span><span class="p">]</span> <span class="p">[</span><span class="n">Te</span><span class="p">]</span> <span class="p">[</span><span class="n">Ee</span><span class="p">]</span> <span class="n">ifte</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'E == [P <] [Te] [Ee] ifte'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'E == [P <] [Te] [Ee] ifte'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>In this case <code class="docutils literal notranslate"><span class="pre">Te</span></code> works that same as <code class="docutils literal notranslate"><span class="pre">T</span></code> but on the left child tree
|
<p>In this case <code class="docutils literal notranslate"><span class="pre">Te</span></code> works that same as <code class="docutils literal notranslate"><span class="pre">T</span></code> but on the left child tree
|
||||||
|
|
@ -243,10 +243,10 @@ instead of the right, so the only difference is that it must use
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Te</span> <span class="o">==</span> <span class="n">cons</span> <span class="n">cons</span> <span class="p">[</span><span class="n">dipd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">infra</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Te</span> <span class="o">==</span> <span class="n">cons</span> <span class="n">cons</span> <span class="p">[</span><span class="n">dipd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">infra</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Te == cons cons [dipd] cons infra'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Te == cons cons [dipd] cons infra'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] Te'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] Te'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'old_k'</span> <span class="s1">'old_value'</span> <span class="s1">'Tree-add'</span> <span class="s1">'new_key'</span> <span class="s1">'new_value'</span> <span class="s1">'left'</span> <span class="s1">'right'</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'old_k'</span> <span class="s1">'old_value'</span> <span class="s1">'Tree-add'</span> <span class="s1">'new_key'</span> <span class="s1">'new_value'</span> <span class="s1">'left'</span> <span class="s1">'right'</span><span class="p">]</span>
|
||||||
|
|
@ -274,10 +274,10 @@ instead of the right, so the only difference is that it must use
|
||||||
<span class="p">[</span><span class="n">key</span> <span class="n">new_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span>
|
<span class="p">[</span><span class="n">key</span> <span class="n">new_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Ee == pop swap roll< rest rest cons cons'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Ee == pop swap roll< rest rest cons cons'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'k'</span> <span class="s1">'new_value'</span> <span class="s1">'left'</span> <span class="s1">'right'</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'k'</span> <span class="s1">'new_value'</span> <span class="s1">'left'</span> <span class="s1">'right'</span><span class="p">]</span>
|
||||||
|
|
@ -302,43 +302,43 @@ instead of the right, so the only difference is that it must use
|
||||||
<span class="n">Tree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="p">[</span><span class="n">popop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[[</span><span class="n">pop</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">Tree</span><span class="o">-</span><span class="n">new</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="n">R</span><span class="p">]</span> <span class="n">genrec</span>
|
<span class="n">Tree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="p">[</span><span class="n">popop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[[</span><span class="n">pop</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">Tree</span><span class="o">-</span><span class="n">new</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="n">R</span><span class="p">]</span> <span class="n">genrec</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-add == [popop not] [[pop] dipd Tree-new] [] [[P >] [T] [E] ifte] genrec'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-add == [popop not] [[pop] dipd Tree-new] [] [[P >] [T] [E] ifte] genrec'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section id="examples">
|
<section id="examples">
|
||||||
<h3>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h3>
|
<h3>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] 23 "b" Tree-add'</span><span class="p">)</span> <span class="c1"># Initial</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] 23 "b" Tree-add'</span><span class="p">)</span> <span class="c1"># Initial</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["b" 23 [] []] 88 "c" Tree-add'</span><span class="p">)</span> <span class="c1"># Greater than</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["b" 23 [] []] 88 "c" Tree-add'</span><span class="p">)</span> <span class="c1"># Greater than</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["b" 23 [] []] 88 "a" Tree-add'</span><span class="p">)</span> <span class="c1"># Less than</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["b" 23 [] []] 88 "a" Tree-add'</span><span class="p">)</span> <span class="c1"># Less than</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["b" 23 [] []] 88 "b" Tree-add'</span><span class="p">)</span> <span class="c1"># Equal to</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["b" 23 [] []] 88 "b" Tree-add'</span><span class="p">)</span> <span class="c1"># Equal to</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add'</span><span class="p">)</span> <span class="c1"># Series.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add'</span><span class="p">)</span> <span class="c1"># Series.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||||
|
|
@ -365,19 +365,19 @@ values:</p>
|
||||||
<span class="n">L</span>
|
<span class="n">L</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"1 0 ['G'] ['E'] ['L'] cmp"</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"1 0 ['G'] ['E'] ['L'] cmp"</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'G'</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'G'</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"1 1 ['G'] ['E'] ['L'] cmp"</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"1 1 ['G'] ['E'] ['L'] cmp"</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'E'</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'E'</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"0 1 ['G'] ['E'] ['L'] cmp"</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"0 1 ['G'] ['E'] ['L'] cmp"</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'L'</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'L'</span>
|
||||||
|
|
@ -414,7 +414,7 @@ node key (by throwing everything else away):</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">P</span> <span class="o">==</span> <span class="n">over</span> <span class="p">[</span><span class="n">popop</span> <span class="n">popop</span> <span class="n">first</span><span class="p">]</span> <span class="n">nullary</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">P</span> <span class="o">==</span> <span class="n">over</span> <span class="p">[</span><span class="n">popop</span> <span class="n">popop</span> <span class="n">first</span><span class="p">]</span> <span class="n">nullary</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'P == over [popop popop first] nullary'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'P == over [popop popop first] nullary'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Using <code class="docutils literal notranslate"><span class="pre">cmp</span></code> to simplify <cite>our code above at
|
<p>Using <code class="docutils literal notranslate"><span class="pre">cmp</span></code> to simplify <cite>our code above at
|
||||||
|
|
@ -434,10 +434,10 @@ to understand:</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="p">[</span><span class="n">popop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[[</span><span class="n">pop</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">Tree</span><span class="o">-</span><span class="n">new</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="n">P</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">Ee</span><span class="p">]</span> <span class="p">[</span><span class="n">Te</span><span class="p">]</span> <span class="n">cmp</span><span class="p">]</span> <span class="n">genrec</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="p">[</span><span class="n">popop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[[</span><span class="n">pop</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">Tree</span><span class="o">-</span><span class="n">new</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="n">P</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">Ee</span><span class="p">]</span> <span class="p">[</span><span class="n">Te</span><span class="p">]</span> <span class="n">cmp</span><span class="p">]</span> <span class="n">genrec</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add'</span><span class="p">)</span> <span class="c1"># Still works.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add'</span><span class="p">)</span> <span class="c1"># Still works.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||||
|
|
@ -545,22 +545,22 @@ with an interesting situation:</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">roll</span><span class="o"><</span> <span class="p">[</span><span class="n">dupdip</span> <span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="n">genrec</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">roll</span><span class="o"><</span> <span class="p">[</span><span class="n">dupdip</span> <span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="n">genrec</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section id="id1">
|
<section id="id1">
|
||||||
<h3>Examples<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3>
|
<h3>Examples<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [foo] Tree-iter'</span><span class="p">)</span> <span class="c1"># It doesn't matter what F is as it won't be used.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [foo] Tree-iter'</span><span class="p">)</span> <span class="c1"># It doesn't matter what F is as it won't be used.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter"</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter"</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'b'</span> <span class="s1">'a'</span> <span class="s1">'c'</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'b'</span> <span class="s1">'a'</span> <span class="s1">'c'</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter"</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter"</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span> <span class="mi">88</span> <span class="mi">44</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span> <span class="mi">88</span> <span class="mi">44</span>
|
||||||
|
|
@ -575,16 +575,16 @@ to e.g. 0 and ignoring them. It’s set-like in that duplicate items added
|
||||||
to it will only occur once within it, and we can query it in
|
to it will only occur once within it, and we can query it in
|
||||||
<cite>:math:`O(log_2 N)</cite> <<a class="reference external" href="https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2">https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2</a>>`__
|
<cite>:math:`O(log_2 N)</cite> <<a class="reference external" href="https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2">https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2</a>>`__
|
||||||
time.</p>
|
time.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [3 9 5 2 8 6 7 8 4] [0 swap Tree-add] step'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [3 9 5 2 8 6 7 8 4] [0 swap Tree-add] step'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'to_set == [] swap [0 swap Tree-add] step'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'to_set == [] swap [0 swap Tree-add] step'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[3 9 5 2 8 6 7 8 4] to_set'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[3 9 5 2 8 6 7 8 4] to_set'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
|
||||||
|
|
@ -592,10 +592,10 @@ time.</p>
|
||||||
</div>
|
</div>
|
||||||
<p>And with that we can write a little program <code class="docutils literal notranslate"><span class="pre">unique</span></code> to remove
|
<p>And with that we can write a little program <code class="docutils literal notranslate"><span class="pre">unique</span></code> to remove
|
||||||
duplicate items from a list.</p>
|
duplicate items from a list.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'unique == [to_set [first] Tree-iter] cons run'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'unique == [to_set [first] Tree-iter] cons run'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique'</span><span class="p">)</span> <span class="c1"># Filter duplicate items.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique'</span><span class="p">)</span> <span class="c1"># Filter duplicate items.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">7</span> <span class="mi">6</span> <span class="mi">8</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">9</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">7</span> <span class="mi">6</span> <span class="mi">8</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">9</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
|
||||||
|
|
@ -679,7 +679,7 @@ right side:</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Now we can sort sequences.</p>
|
<p>Now we can sort sequences.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1">#define('Tree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec')</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="c1">#define('Tree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec')</span>
|
||||||
|
|
||||||
|
|
||||||
<span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
<span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
||||||
|
|
@ -695,7 +695,7 @@ right side:</p>
|
||||||
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[3 9 5 2 8 6 7 8 4] to_set Tree-iter-order'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[3 9 5 2 8 6 7 8 4] to_set Tree-iter-order'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span>
|
||||||
|
|
@ -835,7 +835,7 @@ because there’s no value to discard.</p>
|
||||||
<span class="n">Tree</span><span class="o">-</span><span class="n">get</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="n">swap</span> <span class="p">[]</span> <span class="p">[</span><span class="n">P</span> <span class="p">[</span><span class="n">T</span><span class="o">></span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="o"><</span><span class="p">]</span> <span class="n">cmp</span><span class="p">]</span> <span class="n">genrec</span>
|
<span class="n">Tree</span><span class="o">-</span><span class="n">get</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="n">swap</span> <span class="p">[]</span> <span class="p">[</span><span class="n">P</span> <span class="p">[</span><span class="n">T</span><span class="o">></span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="o"><</span><span class="p">]</span> <span class="n">cmp</span><span class="p">]</span> <span class="n">genrec</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># I don't want to deal with name conflicts with the above so I'm inlining everything here.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="c1"># I don't want to deal with name conflicts with the above so I'm inlining everything here.</span>
|
||||||
<span class="c1"># The original Joy system has "hide" which is a meta-command which allows you to use named</span>
|
<span class="c1"># The original Joy system has "hide" which is a meta-command which allows you to use named</span>
|
||||||
<span class="c1"># definitions that are only in scope for a given definition. I don't want to implement</span>
|
<span class="c1"># definitions that are only in scope for a given definition. I don't want to implement</span>
|
||||||
<span class="c1"># that (yet) so...</span>
|
<span class="c1"># that (yet) so...</span>
|
||||||
|
|
@ -852,19 +852,19 @@ because there’s no value to discard.</p>
|
||||||
<span class="s1">'''</span><span class="p">)</span>
|
<span class="s1">'''</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'mike not in tree'</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'mike not in tree'</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["gary" 23 [] []] "gary" [popop "err"] Tree-get'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["gary" 23 [] []] "gary" [popop "err"] Tree-get'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span>
|
||||||
|
|
||||||
<span class="s1"> [] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step</span>
|
<span class="s1"> [] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step</span>
|
||||||
|
|
||||||
|
|
@ -876,7 +876,7 @@ because there’s no value to discard.</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span>
|
||||||
|
|
||||||
<span class="s1"> [] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step</span>
|
<span class="s1"> [] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step</span>
|
||||||
|
|
||||||
|
|
@ -1175,7 +1175,7 @@ E == [
|
||||||
</div>
|
</div>
|
||||||
<p>By the standards of the code I’ve written so far, this is a <em>huge</em> Joy
|
<p>By the standards of the code I’ve written so far, this is a <em>huge</em> Joy
|
||||||
program.</p>
|
program.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
||||||
<span class="s1">first_two == uncons uncons pop</span>
|
<span class="s1">first_two == uncons uncons pop</span>
|
||||||
<span class="s1">fourth == rest rest rest first</span>
|
<span class="s1">fourth == rest rest rest first</span>
|
||||||
<span class="s1">?fourth == [] [fourth] [] ifte</span>
|
<span class="s1">?fourth == [] [fourth] [] ifte</span>
|
||||||
|
|
@ -1193,43 +1193,43 @@ program.</p>
|
||||||
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete "</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete "</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'a'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'a'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete "</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete "</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'a'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'a'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete "</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete "</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete "</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete "</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'a'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'a'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [4 2 3 1 6 7 5 ] [0 swap Tree-add] step'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [4 2 3 1 6 7 5 ] [0 swap Tree-add] step'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 3 Tree-Delete "</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 3 Tree-Delete "</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 4 Tree-Delete "</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 4 Tree-Delete "</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
<div class="body" role="main">
|
<div class="body" role="main">
|
||||||
|
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<section id="quadratic-formula">
|
<section id="quadratic-formula">
|
||||||
|
|
@ -100,11 +100,11 @@ the variables:</p>
|
||||||
</div>
|
</div>
|
||||||
<p>The three arguments are to the left, so we can “chop off” everything to
|
<p>The three arguments are to the left, so we can “chop off” everything to
|
||||||
the right and say it’s the definition of the <code class="docutils literal notranslate"><span class="pre">quadratic</span></code> function:</p>
|
the right and say it’s the definition of the <code class="docutils literal notranslate"><span class="pre">quadratic</span></code> function:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Let’s try it out:</p>
|
<p>Let’s try it out:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'3 1 1 quadratic'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'3 1 1 quadratic'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="mf">0.3819660112501051</span> <span class="o">-</span><span class="mf">2.618033988749895</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="mf">0.3819660112501051</span> <span class="o">-</span><span class="mf">2.618033988749895</span>
|
||||||
|
|
@ -114,7 +114,7 @@ the right and say it’s the definition of the <code class="docutils literal not
|
||||||
lines are the <code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">dipd</span></code> combinators building the main program
|
lines are the <code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">dipd</span></code> combinators building the main program
|
||||||
by incorporating the values on the stack. Then that program runs and you
|
by incorporating the values on the stack. Then that program runs and you
|
||||||
get the results. This is pretty typical of Joy code.</p>
|
get the results. This is pretty typical of Joy code.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'-5 1 4 quadratic'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'-5 1 4 quadratic'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="o">-</span><span class="mi">5</span> <span class="mi">1</span> <span class="mi">4</span> <span class="n">quadratic</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="o">-</span><span class="mi">5</span> <span class="mi">1</span> <span class="mi">4</span> <span class="n">quadratic</span>
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
<div class="body" role="main">
|
<div class="body" role="main">
|
||||||
|
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">DefinitionWrapper</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">DefinitionWrapper</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<section id="recursion-combinators">
|
<section id="recursion-combinators">
|
||||||
|
|
@ -101,7 +101,7 @@ cons list”.</p></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>It may be helpful to see this function implemented in imperative Python
|
<p>It may be helpful to see this function implemented in imperative Python
|
||||||
code.</p>
|
code.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">hylomorphism</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">F</span><span class="p">,</span> <span class="n">P</span><span class="p">,</span> <span class="n">G</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">hylomorphism</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">F</span><span class="p">,</span> <span class="n">P</span><span class="p">,</span> <span class="n">G</span><span class="p">):</span>
|
||||||
<span class="sd">'''Return a hylomorphism function H.'''</span>
|
<span class="sd">'''Return a hylomorphism function H.'''</span>
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">H</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
<span class="k">def</span> <span class="nf">H</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
||||||
|
|
@ -185,7 +185,7 @@ the left so we have a definition for <code class="docutils literal notranslate">
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">hylomorphism</span> <span class="o">==</span> <span class="p">[</span><span class="n">unit</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">swoncat</span><span class="p">]</span> <span class="n">dipd</span> <span class="p">[</span><span class="n">dip</span><span class="p">]</span> <span class="n">swoncat</span> <span class="n">genrec</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">hylomorphism</span> <span class="o">==</span> <span class="p">[</span><span class="n">unit</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">swoncat</span><span class="p">]</span> <span class="n">dipd</span> <span class="p">[</span><span class="n">dip</span><span class="p">]</span> <span class="n">swoncat</span> <span class="n">genrec</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<section id="example-finding-triangular-numbers">
|
<section id="example-finding-triangular-numbers">
|
||||||
|
|
@ -200,17 +200,17 @@ of all positive integers less than that one. (In this case the types
|
||||||
<li><p><code class="docutils literal notranslate"><span class="pre">[G]</span></code> is <code class="docutils literal notranslate"><span class="pre">[--</span> <span class="pre">dup]</span></code></p></li>
|
<li><p><code class="docutils literal notranslate"><span class="pre">[G]</span></code> is <code class="docutils literal notranslate"><span class="pre">[--</span> <span class="pre">dup]</span></code></p></li>
|
||||||
<li><p><code class="docutils literal notranslate"><span class="pre">[F]</span></code> is <code class="docutils literal notranslate"><span class="pre">[+]</span></code></p></li>
|
<li><p><code class="docutils literal notranslate"><span class="pre">[F]</span></code> is <code class="docutils literal notranslate"><span class="pre">[+]</span></code></p></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Let’s try it:</p>
|
<p>Let’s try it:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 triangular_number'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 triangular_number'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">10</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">10</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[0 1 2 3 4 5 6] [triangular_number] map'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[0 1 2 3 4 5 6] [triangular_number] map'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">3</span> <span class="mi">6</span> <span class="mi">10</span> <span class="mi">15</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">3</span> <span class="mi">6</span> <span class="mi">10</span> <span class="mi">15</span><span class="p">]</span>
|
||||||
|
|
@ -362,9 +362,8 @@ values.</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">A</span> <span class="o">==</span> <span class="p">[</span><span class="n">P</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="p">[</span><span class="n">swons</span><span class="p">]</span> <span class="n">hylomorphism</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">A</span> <span class="o">==</span> <span class="p">[</span><span class="n">P</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="p">[</span><span class="n">swons</span><span class="p">]</span> <span class="n">hylomorphism</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<section id="range-et-al">
|
<section id="range-et-al-an-example-of-an-anamorphism-is-the-range-function-which-generates-the-list-of-integers-from-0-to-n-1-given-n">
|
||||||
<h3><code class="docutils literal notranslate"><span class="pre">range</span></code> et. al.<a class="headerlink" href="#range-et-al" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal notranslate"><span class="pre">range</span></code> et. al. An example of an anamorphism is the <code class="docutils literal notranslate"><span class="pre">range</span></code> function which generates the list of integers from 0 to <em>n</em> - 1 given <em>n</em>.<a class="headerlink" href="#range-et-al-an-example-of-an-anamorphism-is-the-range-function-which-generates-the-list-of-integers-from-0-to-n-1-given-n" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>An example of an anamorphism is the <code class="docutils literal notranslate"><span class="pre">range</span></code> function which generates the list of integers from 0 to <em>n</em> - 1 given <em>n</em>.</p>
|
|
||||||
<p>Each of the above variations can be used to make four slightly different
|
<p>Each of the above variations can be used to make four slightly different
|
||||||
<code class="docutils literal notranslate"><span class="pre">range</span></code> functions.</p>
|
<code class="docutils literal notranslate"><span class="pre">range</span></code> functions.</p>
|
||||||
<section id="range-with-h1">
|
<section id="range-with-h1">
|
||||||
|
|
@ -373,10 +372,10 @@ values.</p>
|
||||||
<span class="o">==</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="p">[]]</span> <span class="p">[</span><span class="o">--</span> <span class="n">dup</span><span class="p">]</span> <span class="p">[</span><span class="n">dip</span> <span class="n">swons</span><span class="p">]</span> <span class="n">genrec</span>
|
<span class="o">==</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="p">[]]</span> <span class="p">[</span><span class="o">--</span> <span class="n">dup</span><span class="p">]</span> <span class="p">[</span><span class="n">dip</span> <span class="n">swons</span><span class="p">]</span> <span class="n">genrec</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'range == [0 <=] [] [-- dup] [swons] hylomorphism'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'range == [0 <=] [] [-- dup] [swons] hylomorphism'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 range'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 range'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span><span class="p">]</span>
|
||||||
|
|
@ -389,10 +388,10 @@ values.</p>
|
||||||
<span class="o">==</span> <span class="p">[]</span> <span class="n">swap</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[</span><span class="o">--</span> <span class="n">dup</span> <span class="p">[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">primrec</span>
|
<span class="o">==</span> <span class="p">[]</span> <span class="n">swap</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[</span><span class="o">--</span> <span class="n">dup</span> <span class="p">[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">primrec</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 range_reverse'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 range_reverse'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span>
|
||||||
|
|
@ -405,10 +404,10 @@ values.</p>
|
||||||
<span class="o">==</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="p">[]]</span> <span class="p">[[</span><span class="o">--</span><span class="p">]</span> <span class="n">dupdip</span><span class="p">]</span> <span class="p">[</span><span class="n">dip</span> <span class="n">swons</span><span class="p">]</span> <span class="n">genrec</span>
|
<span class="o">==</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="p">[]]</span> <span class="p">[[</span><span class="o">--</span><span class="p">]</span> <span class="n">dupdip</span><span class="p">]</span> <span class="p">[</span><span class="n">dip</span> <span class="n">swons</span><span class="p">]</span> <span class="n">genrec</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 ranger'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 ranger'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">5</span> <span class="mi">4</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">5</span> <span class="mi">4</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">]</span>
|
||||||
|
|
@ -421,10 +420,10 @@ values.</p>
|
||||||
<span class="o">==</span> <span class="p">[]</span> <span class="n">swap</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dupdip</span> <span class="o">--</span><span class="p">]</span> <span class="n">primrec</span>
|
<span class="o">==</span> <span class="p">[]</span> <span class="n">swap</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dupdip</span> <span class="o">--</span><span class="p">]</span> <span class="n">primrec</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 ranger_reverse'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 ranger_reverse'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">]</span>
|
||||||
|
|
@ -445,17 +444,17 @@ and makes some new value.</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">C</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="n">c</span> <span class="p">[</span><span class="n">uncons</span> <span class="n">swap</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">hylomorphism</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">C</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="n">c</span> <span class="p">[</span><span class="n">uncons</span> <span class="n">swap</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">hylomorphism</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'swuncons == uncons swap'</span><span class="p">)</span> <span class="c1"># Awkward name.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'swuncons == uncons swap'</span><span class="p">)</span> <span class="c1"># Awkward name.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>An example of a catamorphism is the sum function.</p>
|
<p>An example of a catamorphism is the sum function.</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nb">sum</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="mi">0</span> <span class="p">[</span><span class="n">swuncons</span><span class="p">]</span> <span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">hylomorphism</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nb">sum</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="mi">0</span> <span class="p">[</span><span class="n">swuncons</span><span class="p">]</span> <span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">hylomorphism</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'sum == [not] 0 [swuncons] [+] hylomorphism'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'sum == [not] 0 [swuncons] [+] hylomorphism'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[5 4 3 2 1] sum'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[5 4 3 2 1] sum'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
||||||
|
|
@ -465,7 +464,7 @@ and makes some new value.</p>
|
||||||
<h3>The <code class="docutils literal notranslate"><span class="pre">step</span></code> combinator<a class="headerlink" href="#the-step-combinator" title="Permalink to this headline">¶</a></h3>
|
<h3>The <code class="docutils literal notranslate"><span class="pre">step</span></code> combinator<a class="headerlink" href="#the-step-combinator" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>The <code class="docutils literal notranslate"><span class="pre">step</span></code> combinator will usually be better to use than
|
<p>The <code class="docutils literal notranslate"><span class="pre">step</span></code> combinator will usually be better to use than
|
||||||
<code class="docutils literal notranslate"><span class="pre">catamorphism</span></code>.</p>
|
<code class="docutils literal notranslate"><span class="pre">catamorphism</span></code>.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[step] help'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[step] help'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Run</span> <span class="n">a</span> <span class="n">quoted</span> <span class="n">program</span> <span class="n">on</span> <span class="n">each</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">a</span> <span class="n">sequence</span><span class="o">.</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Run</span> <span class="n">a</span> <span class="n">quoted</span> <span class="n">program</span> <span class="n">on</span> <span class="n">each</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">a</span> <span class="n">sequence</span><span class="o">.</span>
|
||||||
|
|
@ -489,10 +488,10 @@ and makes some new value.</p>
|
||||||
<span class="n">on</span> <span class="n">top</span> <span class="n">of</span> <span class="n">the</span> <span class="n">stack</span><span class="o">.</span>
|
<span class="n">on</span> <span class="n">top</span> <span class="n">of</span> <span class="n">the</span> <span class="n">stack</span><span class="o">.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'sum == 0 swap [+] step'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'sum == 0 swap [+] step'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[5 4 3 2 1] sum'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[5 4 3 2 1] sum'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
||||||
|
|
@ -513,10 +512,10 @@ and makes some new value.</p>
|
||||||
<span class="n">P</span> <span class="o">==</span> <span class="mi">1</span> <span class="o"><=</span>
|
<span class="n">P</span> <span class="o">==</span> <span class="mi">1</span> <span class="o"><=</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 factorial'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 factorial'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">120</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">120</span>
|
||||||
|
|
@ -545,10 +544,10 @@ pattern <code class="docutils literal notranslate"><span class="pre">H2</span></
|
||||||
<span class="n">P</span> <span class="o">==</span> <span class="ow">not</span>
|
<span class="n">P</span> <span class="o">==</span> <span class="ow">not</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'tails == [] swap [not] [pop] [rest dup [swons] dip] primrec'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'tails == [] swap [not] [pop] [rest dup [swons] dip] primrec'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3] tails'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3] tails'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[]</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span><span class="p">]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[]</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span><span class="p">]]</span>
|
||||||
|
|
|
||||||
|
|
@ -42,12 +42,12 @@ we can implement e.g. a function that adds new functions to the
|
||||||
dictionary. However, there’s no function that does that. Adding a new
|
dictionary. However, there’s no function that does that. Adding a new
|
||||||
function to the dictionary is a meta-interpreter action, you have to do
|
function to the dictionary is a meta-interpreter action, you have to do
|
||||||
it in Python, not Joy.</p>
|
it in Python, not Joy.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<section id="a-long-trace">
|
<section id="a-long-trace">
|
||||||
<h2>A long trace<a class="headerlink" href="#a-long-trace" title="Permalink to this headline">¶</a></h2>
|
<h2>A long trace<a class="headerlink" href="#a-long-trace" title="Permalink to this headline">¶</a></h2>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[23 18] average'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[23 18] average'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">23</span> <span class="mi">18</span><span class="p">]</span> <span class="n">average</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">23</span> <span class="mi">18</span><span class="p">]</span> <span class="n">average</span>
|
||||||
|
|
@ -105,7 +105,7 @@ it in Python, not Joy.</p>
|
||||||
<p>An efficient <code class="docutils literal notranslate"><span class="pre">sum</span></code> function is already in the library. But for
|
<p>An efficient <code class="docutils literal notranslate"><span class="pre">sum</span></code> function is already in the library. But for
|
||||||
<code class="docutils literal notranslate"><span class="pre">size</span></code> we can use a “compiled” version hand-written in Python to speed
|
<code class="docutils literal notranslate"><span class="pre">size</span></code> we can use a “compiled” version hand-written in Python to speed
|
||||||
up evaluation and make the trace more readable.</p>
|
up evaluation and make the trace more readable.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.library</span> <span class="kn">import</span> <span class="n">SimpleFunctionWrapper</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.library</span> <span class="kn">import</span> <span class="n">SimpleFunctionWrapper</span>
|
||||||
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="kn">import</span> <span class="n">iter_stack</span>
|
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="kn">import</span> <span class="n">iter_stack</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -121,14 +121,14 @@ up evaluation and make the trace more readable.</p>
|
||||||
</div>
|
</div>
|
||||||
<p>Now we replace the old version in the dictionary with the new version,
|
<p>Now we replace the old version in the dictionary with the new version,
|
||||||
and re-evaluate the expression.</p>
|
and re-evaluate the expression.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">D</span><span class="p">[</span><span class="s1">'size'</span><span class="p">]</span> <span class="o">=</span> <span class="n">size</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">D</span><span class="p">[</span><span class="s1">'size'</span><span class="p">]</span> <span class="o">=</span> <span class="n">size</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section id="a-shorter-trace">
|
<section id="a-shorter-trace">
|
||||||
<h2>A shorter trace<a class="headerlink" href="#a-shorter-trace" title="Permalink to this headline">¶</a></h2>
|
<h2>A shorter trace<a class="headerlink" href="#a-shorter-trace" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>You can see that <code class="docutils literal notranslate"><span class="pre">size</span></code> now executes in a single step.</p>
|
<p>You can see that <code class="docutils literal notranslate"><span class="pre">size</span></code> now executes in a single step.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[23 18] average'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[23 18] average'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">23</span> <span class="mi">18</span><span class="p">]</span> <span class="n">average</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">23</span> <span class="mi">18</span><span class="p">]</span> <span class="n">average</span>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,463 @@
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
|
||||||
|
|
||||||
|
<title>Square Spiral Example Joy Code — Thun 0.4.1 documentation</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css" />
|
||||||
|
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
|
||||||
|
<script src="../_static/jquery.js"></script>
|
||||||
|
<script src="../_static/underscore.js"></script>
|
||||||
|
<script src="../_static/doctools.js"></script>
|
||||||
|
<link rel="index" title="Index" href="../genindex.html" />
|
||||||
|
<link rel="search" title="Search" href="../search.html" />
|
||||||
|
<link rel="next" title="Traversing Datastructures with Zippers" href="Zipper.html" />
|
||||||
|
<link rel="prev" title="Newton’s method" href="Newton-Raphson.html" />
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
||||||
|
|
||||||
|
</head><body>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="document">
|
||||||
|
<div class="documentwrapper">
|
||||||
|
<div class="bodywrapper">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="body" role="main">
|
||||||
|
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<section id="square-spiral-example-joy-code">
|
||||||
|
<h1>Square Spiral Example Joy Code<a class="headerlink" href="#square-spiral-example-joy-code" title="Permalink to this headline">¶</a></h1>
|
||||||
|
<p>Here is the example of Joy code from the <code class="docutils literal notranslate"><span class="pre">README</span></code> file:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>[[[abs]ii <=][[<>][pop !-]||]&&][[!-][[++]][[--]]ifte dip][[pop !-][--][++]ifte]ifte
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>It might seem unreadable but with a little familiarity it becomes just
|
||||||
|
as legible as any other notation. Some layout helps:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>[ [[abs] ii <=]
|
||||||
|
[
|
||||||
|
[<>] [pop !-] ||
|
||||||
|
] &&
|
||||||
|
]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>This function accepts two integers on the stack and increments or
|
||||||
|
decrements one of them such that the new pair of numbers is the next
|
||||||
|
coordinate pair in a square spiral (like the kind used to construct an
|
||||||
|
Ulam Spiral).</p>
|
||||||
|
<section id="original-form">
|
||||||
|
<h2>Original Form<a class="headerlink" href="#original-form" title="Permalink to this headline">¶</a></h2>
|
||||||
|
<p>It’s adapted from <a class="reference external" href="https://stackoverflow.com/questions/398299/looping-in-a-spiral/31864777#31864777">the original code on
|
||||||
|
StackOverflow</a>:</p>
|
||||||
|
<blockquote>
|
||||||
|
<div><p>If all you’re trying to do is generate the first N points in the
|
||||||
|
spiral (without the original problem’s constraint of masking to an N
|
||||||
|
x M region), the code becomes very simple:</p>
|
||||||
|
</div></blockquote>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>void spiral(const int N)
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
for(int i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
cout << x << '\t' << y << '\n';
|
||||||
|
if(abs(x) <= abs(y) && (x != y || x >= 0))
|
||||||
|
x += ((y >= 0) ? 1 : -1);
|
||||||
|
else
|
||||||
|
y += ((x >= 0) ? -1 : 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="translation-to-joy">
|
||||||
|
<h2>Translation to Joy<a class="headerlink" href="#translation-to-joy" title="Permalink to this headline">¶</a></h2>
|
||||||
|
<p>I’m going to make a function that take two ints (<code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code>) and
|
||||||
|
generates the next pair, we’ll turn it into a generator later using the
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">x</span></code> combinator.</p>
|
||||||
|
<section id="first-boolean-predicate">
|
||||||
|
<h3>First Boolean Predicate<a class="headerlink" href="#first-boolean-predicate" title="Permalink to this headline">¶</a></h3>
|
||||||
|
<p>We need a function that computes <code class="docutils literal notranslate"><span class="pre">abs(x)</span> <span class="pre"><=</span> <span class="pre">abs(y)</span></code>, we can use <code class="docutils literal notranslate"><span class="pre">ii</span></code>
|
||||||
|
to apply <code class="docutils literal notranslate"><span class="pre">abs</span></code> to both values and then compare them with <code class="docutils literal notranslate"><span class="pre"><=</span></code>:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="nb">abs</span><span class="p">]</span> <span class="n">ii</span> <span class="o"><=</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>I’ve defined two short-circuiting Boolean combinators <code class="docutils literal notranslate"><span class="pre">&&</span></code> and <code class="docutils literal notranslate"><span class="pre">||</span></code>
|
||||||
|
that each accept two quoted predicate programs, run the first, and
|
||||||
|
conditionally run the second only if required (to compute the final
|
||||||
|
Boolean value). They run their predicate arguments <code class="docutils literal notranslate"><span class="pre">nullary</span></code>.</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'&& [nullary] cons [nullary [0]] dip branch'</span><span class="p">)</span>
|
||||||
|
<span class="n">define</span><span class="p">(</span><span class="s1">'|| [nullary] cons [nullary] dip [1] branch'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Given those, we can define <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">!=</span> <span class="pre">y</span> <span class="pre">||</span> <span class="pre">x</span> <span class="pre">>=</span> <span class="pre">0</span></code> as:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="o"><></span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="mi">0</span> <span class="o">>=</span><span class="p">]</span> <span class="o">||</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>And <code class="docutils literal notranslate"><span class="pre">(abs(x)</span> <span class="pre"><=</span> <span class="pre">abs(y)</span> <span class="pre">&&</span> <span class="pre">(x</span> <span class="pre">!=</span> <span class="pre">y</span> <span class="pre">||</span> <span class="pre">x</span> <span class="pre">>=</span> <span class="pre">0))</span></code> as:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="nb">abs</span><span class="p">]</span> <span class="n">ii</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[[</span><span class="o"><></span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="mi">0</span> <span class="o">>=</span><span class="p">]</span> <span class="o">||</span><span class="p">]</span> <span class="o">&&</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>It’s a little rough, but, as I say, with a little familiarity it becomes
|
||||||
|
legible.</p>
|
||||||
|
</section>
|
||||||
|
<section id="the-increment-decrement-branches">
|
||||||
|
<h3>The Increment / Decrement Branches<a class="headerlink" href="#the-increment-decrement-branches" title="Permalink to this headline">¶</a></h3>
|
||||||
|
<p>Turning to the branches of the main <code class="docutils literal notranslate"><span class="pre">if</span></code> statement:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>x += ((y >= 0) ? 1 : -1);
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Rewrite as a hybrid (pseudo-code) <code class="docutils literal notranslate"><span class="pre">ifte</span></code> expression:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">y</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="n">X</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">]</span> <span class="n">ifte</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Change each C phrase to Joy code:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="o">>=</span><span class="p">]</span> <span class="p">[[</span><span class="o">++</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[[</span><span class="o">--</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">ifte</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Factor out the dip from each branch:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="o">>=</span><span class="p">]</span> <span class="p">[[</span><span class="o">++</span><span class="p">]]</span> <span class="p">[[</span><span class="o">--</span><span class="p">]]</span> <span class="n">ifte</span> <span class="n">dip</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Similar logic applies to the other branch:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>y += ((x >= 0) ? -1 : 1);
|
||||||
|
|
||||||
|
[x >= 0] [y -= 1] [y += 1] ifte
|
||||||
|
|
||||||
|
[pop 0 >=] [--] [++] ifte
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="not-negative">
|
||||||
|
<h3>“Not Negative”<a class="headerlink" href="#not-negative" title="Permalink to this headline">¶</a></h3>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'!- 0 >='</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<section id="putting-the-pieces-together">
|
||||||
|
<h2>Putting the Pieces Together<a class="headerlink" href="#putting-the-pieces-together" title="Permalink to this headline">¶</a></h2>
|
||||||
|
<p>We can assemble the three functions we just defined in quotes and give
|
||||||
|
them them to the <code class="docutils literal notranslate"><span class="pre">ifte</span></code> combinator. With some arrangement to show off
|
||||||
|
the symmetry of the two branches, we have:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>[[[abs] ii <=] [[<>] [pop !-] ||] &&]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>As I was writing this up I realized that, since the <code class="docutils literal notranslate"><span class="pre">&&</span></code> combinator
|
||||||
|
doesn’t consume the stack (below its quoted args), I can unquote the
|
||||||
|
predicate, swap the branches, and use the <code class="docutils literal notranslate"><span class="pre">branch</span></code> combinator instead
|
||||||
|
of <code class="docutils literal notranslate"><span class="pre">ifte</span></code>:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>[[abs] ii <=] [[<>] [pop !-] ||] &&
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
branch
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Let’s try it out:</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'0 0 spiral_next'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">0</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 0 spiral_next'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 -1 spiral_next'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span> <span class="o">-</span><span class="mi">1</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'0 -1 spiral_next'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="turning-it-into-a-generator-with-x">
|
||||||
|
<h2>Turning it into a Generator with <code class="docutils literal notranslate"><span class="pre">x</span></code><a class="headerlink" href="#turning-it-into-a-generator-with-x" title="Permalink to this headline">¶</a></h2>
|
||||||
|
<p>It can be used with the x combinator to make a kind of generator for
|
||||||
|
spiral square coordinates.</p>
|
||||||
|
<p>We can use <code class="docutils literal notranslate"><span class="pre">codireco</span></code> to make a generator</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">codireco</span> <span class="p">:</span><span class="o">:=</span> <span class="n">cons</span> <span class="n">dip</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>It will look like this:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">value</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Here’s a trace of how it works:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="o">.</span> <span class="n">x</span>
|
||||||
|
<span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="o">.</span> <span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span>
|
||||||
|
<span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="mi">0</span> <span class="o">.</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span>
|
||||||
|
<span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="o">.</span> <span class="n">codireco</span>
|
||||||
|
<span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">dip</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||||
|
<span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="p">[</span><span class="mi">0</span> <span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="o">.</span> <span class="n">dip</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||||
|
<span class="o">.</span> <span class="mi">0</span> <span class="n">dup</span> <span class="o">++</span> <span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||||
|
<span class="mi">0</span> <span class="o">.</span> <span class="n">dup</span> <span class="o">++</span> <span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||||
|
<span class="mi">0</span> <span class="mi">0</span> <span class="o">.</span> <span class="o">++</span> <span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||||
|
<span class="mi">0</span> <span class="mi">1</span> <span class="o">.</span> <span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||||
|
<span class="mi">0</span> <span class="mi">1</span> <span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="o">.</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||||
|
<span class="mi">0</span> <span class="mi">1</span> <span class="p">[[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span>
|
||||||
|
<span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="n">dup</span> <span class="o">++</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span> <span class="o">.</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>But first we have to change the <code class="docutils literal notranslate"><span class="pre">spiral_next</span></code> function to work on a
|
||||||
|
quoted pair of integers, and leave a copy of the pair on the stack.
|
||||||
|
From:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">y</span> <span class="n">x</span> <span class="n">spiral_next</span>
|
||||||
|
<span class="o">---------------------</span>
|
||||||
|
<span class="n">y</span><span class="s1">' x'</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>to:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="n">x</span> <span class="n">y</span><span class="p">]</span> <span class="p">[</span><span class="n">spiral_next</span><span class="p">]</span> <span class="n">infra</span>
|
||||||
|
<span class="o">-------------------------------</span>
|
||||||
|
<span class="p">[</span><span class="n">x</span><span class="s1">' y'</span><span class="p">]</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[0 0] [spiral_next] infra'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="mi">1</span><span class="p">]</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>So our generator is:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="n">x</span> <span class="n">y</span><span class="p">]</span> <span class="p">[</span><span class="n">dup</span> <span class="p">[</span><span class="n">spiral_next</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Or rather:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">0</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">dup</span> <span class="p">[</span><span class="n">spiral_next</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>There is a function <code class="docutils literal notranslate"><span class="pre">make_generator</span></code> that will build the generator for
|
||||||
|
us out of the value and stepper function:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="mi">0</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">dup</span> <span class="p">[</span><span class="n">spiral_next</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">make_generator</span>
|
||||||
|
<span class="o">----------------------------------------------------</span>
|
||||||
|
<span class="p">[[</span><span class="mi">0</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">dup</span> <span class="p">[</span><span class="n">spiral_next</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">codireco</span><span class="p">]</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Here it is in action:</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[0 0] [dup [spiral_next] infra] make_generator x x x x pop'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span> <span class="mi">0</span><span class="p">]</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Four <code class="docutils literal notranslate"><span class="pre">x</span></code> combinators, four pairs of coordinates.</p>
|
||||||
|
</section>
|
||||||
|
<section id="conclusion">
|
||||||
|
<h2>Conclusion<a class="headerlink" href="#conclusion" title="Permalink to this headline">¶</a></h2>
|
||||||
|
<p>So that’s an example of Joy code. It’s a straightforward translation of
|
||||||
|
the original. It’s a little long for a single definition, you might
|
||||||
|
break it up like so:</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> _spn_P ::= [[abs] ii <=] [[<>] [pop !-] ||] &&
|
||||||
|
|
||||||
|
_spn_T ::= [ !-] [[++]] [[--]] ifte dip
|
||||||
|
_spn_E ::= [pop !-] [--] [++] ifte
|
||||||
|
|
||||||
|
spiral_next ::= _spn_P [_spn_E] [_spn_T] branch
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>This way it’s easy to see that the function is a branch with two
|
||||||
|
quasi-symmetrical paths.</p>
|
||||||
|
<p>We then used this function to make a simple generator of coordinate
|
||||||
|
pairs, where the next pair in the series can be generated at any time by
|
||||||
|
using the <code class="docutils literal notranslate"><span class="pre">x</span></code> combinator on the generator (which is just a quoted
|
||||||
|
expression containing a copy of the current pair and the “stepper
|
||||||
|
function” to generate the next pair from that.)</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'_spn_P [[abs] ii <=] [[<>] [pop !-] ||] &&'</span><span class="p">)</span>
|
||||||
|
<span class="n">define</span><span class="p">(</span><span class="s1">'_spn_T [!-] [[++]] [[--]] ifte dip'</span><span class="p">)</span>
|
||||||
|
<span class="n">define</span><span class="p">(</span><span class="s1">'_spn_E [pop !-] [--] [++] ifte'</span><span class="p">)</span>
|
||||||
|
<span class="n">define</span><span class="p">(</span><span class="s1">'spiral_next _spn_P [_spn_E] [_spn_T] branch'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'23 18 spiral_next'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> . 23 18 spiral_next
|
||||||
|
23 . 18 spiral_next
|
||||||
|
23 18 . spiral_next
|
||||||
|
23 18 . _spn_P [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [[abs] ii <=] [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] . && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] . [nullary] cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] [nullary] . cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] . [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] [nullary [0]] . dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . nullary [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . [stack] dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [stack] . dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [stack] . dip infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . stack [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [18 23] . [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [18 23] [[abs] ii <=] . infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [abs] ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . [dip] dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] [dip] . dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . dip [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 . abs 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 . 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . abs <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
False . [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
False [18 23] . swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [False] . first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False . [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False [0] . [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False [0] [[[<>] [pop !-] ||] nullary] . branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . 0 [_spn_E] [_spn_T] branch
|
||||||
|
23 18 0 . [_spn_E] [_spn_T] branch
|
||||||
|
23 18 0 [_spn_E] . [_spn_T] branch
|
||||||
|
23 18 0 [_spn_E] [_spn_T] . branch
|
||||||
|
23 18 . _spn_E
|
||||||
|
23 18 . [pop !-] [--] [++] ifte
|
||||||
|
23 18 [pop !-] . [--] [++] ifte
|
||||||
|
23 18 [pop !-] [--] . [++] ifte
|
||||||
|
23 18 [pop !-] [--] [++] . ifte
|
||||||
|
23 18 [pop !-] [--] [++] . [nullary not] dipd branch
|
||||||
|
23 18 [pop !-] [--] [++] [nullary not] . dipd branch
|
||||||
|
23 18 [pop !-] . nullary not [--] [++] branch
|
||||||
|
23 18 [pop !-] . [stack] dinfrirst not [--] [++] branch
|
||||||
|
23 18 [pop !-] [stack] . dinfrirst not [--] [++] branch
|
||||||
|
23 18 [pop !-] [stack] . dip infra first not [--] [++] branch
|
||||||
|
23 18 . stack [pop !-] infra first not [--] [++] branch
|
||||||
|
23 18 [18 23] . [pop !-] infra first not [--] [++] branch
|
||||||
|
23 18 [18 23] [pop !-] . infra first not [--] [++] branch
|
||||||
|
23 18 . pop !- [18 23] swaack first not [--] [++] branch
|
||||||
|
23 . !- [18 23] swaack first not [--] [++] branch
|
||||||
|
23 . 0 >= [18 23] swaack first not [--] [++] branch
|
||||||
|
23 0 . >= [18 23] swaack first not [--] [++] branch
|
||||||
|
True . [18 23] swaack first not [--] [++] branch
|
||||||
|
True [18 23] . swaack first not [--] [++] branch
|
||||||
|
23 18 [True] . first not [--] [++] branch
|
||||||
|
23 18 True . not [--] [++] branch
|
||||||
|
23 18 False . [--] [++] branch
|
||||||
|
23 18 False [--] . [++] branch
|
||||||
|
23 18 False [--] [++] . branch
|
||||||
|
23 18 . --
|
||||||
|
23 17 .
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||||||
|
<div class="sphinxsidebarwrapper">
|
||||||
|
<h1 class="logo"><a href="../index.html">Thun</a></h1>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h3>Navigation</h3>
|
||||||
|
<ul class="current">
|
||||||
|
<li class="toctree-l1"><a class="reference internal" href="Intro.html">Thun: Joy in Python</a></li>
|
||||||
|
<li class="toctree-l1"><a class="reference internal" href="../joy.html">Joy Interpreter</a></li>
|
||||||
|
<li class="toctree-l1"><a class="reference internal" href="../stack.html">Stack or Quote or Sequence or List…</a></li>
|
||||||
|
<li class="toctree-l1"><a class="reference internal" href="../parser.html">Parsing Text into Joy Expressions</a></li>
|
||||||
|
<li class="toctree-l1"><a class="reference internal" href="../pretty.html">Tracing Joy Execution</a></li>
|
||||||
|
<li class="toctree-l1"><a class="reference internal" href="../library.html">Function Reference</a></li>
|
||||||
|
<li class="toctree-l1"><a class="reference internal" href="../lib.html">Functions Grouped by, er, Function with Examples</a></li>
|
||||||
|
<li class="toctree-l1"><a class="reference internal" href="../types.html">Type Inference of Joy Expressions</a></li>
|
||||||
|
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Essays about Programming in Joy</a><ul class="current">
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Developing.html">Developing a Program in Joy</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Quadratic.html">Quadratic formula</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Replacing.html">Replacing Functions in the Dictionary</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Recursion_Combinators.html">Recursion Combinators</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Ordered_Binary_Trees.html">Treating Trees I: Ordered Binary Trees</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Treestep.html">Treating Trees II: <code class="docutils literal notranslate"><span class="pre">treestep</span></code></a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Generator_Programs.html">Using <code class="docutils literal notranslate"><span class="pre">x</span></code> to Generate Values</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Newton-Raphson.html">Newton’s method</a></li>
|
||||||
|
<li class="toctree-l2 current"><a class="current reference internal" href="#">Square Spiral Example Joy Code</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Zipper.html">Traversing Datastructures with Zippers</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Types.html">The Blissful Elegance of Typing Joy</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="TypeChecking.html">Type Checking</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="NoUpdates.html">No Updates</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Categorical.html">Categorical Programming</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="The_Four_Operations.html">The Four Fundamental Operations of Definite Action</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Derivatives_of_Regular_Expressions.html">∂RE</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div class="relations">
|
||||||
|
<h3>Related Topics</h3>
|
||||||
|
<ul>
|
||||||
|
<li><a href="../index.html">Documentation overview</a><ul>
|
||||||
|
<li><a href="index.html">Essays about Programming in Joy</a><ul>
|
||||||
|
<li>Previous: <a href="Newton-Raphson.html" title="previous chapter">Newton’s method</a></li>
|
||||||
|
<li>Next: <a href="Zipper.html" title="next chapter">Traversing Datastructures with Zippers</a></li>
|
||||||
|
</ul></li>
|
||||||
|
</ul></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="searchbox" style="display: none" role="search">
|
||||||
|
<h3 id="searchlabel">Quick search</h3>
|
||||||
|
<div class="searchformwrapper">
|
||||||
|
<form class="search" action="../search.html" method="get">
|
||||||
|
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
||||||
|
<input type="submit" value="Go" />
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>$('#searchbox').show(0);</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clearer"></div>
|
||||||
|
</div>
|
||||||
|
<div class="footer" role="contentinfo">
|
||||||
|
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">
|
||||||
|
<img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" />
|
||||||
|
</a>
|
||||||
|
<br />
|
||||||
|
<span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Thun Documentation</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="https://joypy.osdn.io/" property="cc:attributionName" rel="cc:attributionURL">Simon Forman</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.<br />Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://osdn.net/projects/joypy/" rel="dct:source">https://osdn.net/projects/joypy/</a>.
|
||||||
|
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 4.3.0.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -148,10 +148,10 @@ the desired outcome.</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="define-treestep">
|
<section id="define-treestep">
|
||||||
<h2>Define <code class="docutils literal notranslate"><span class="pre">treestep</span></code><a class="headerlink" href="#define-treestep" title="Permalink to this headline">¶</a></h2>
|
<h2>Define <code class="docutils literal notranslate"><span class="pre">treestep</span></code><a class="headerlink" href="#define-treestep" title="Permalink to this headline">¶</a></h2>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span><span class="p">,</span> <span class="n">DefinitionWrapper</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span><span class="p">,</span> <span class="n">DefinitionWrapper</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
||||||
|
|
||||||
<span class="s1"> _treestep_0 == [[not] swap] dip</span>
|
<span class="s1"> _treestep_0 == [[not] swap] dip</span>
|
||||||
<span class="s1"> _treestep_1 == [dip] cons [uncons] swoncat</span>
|
<span class="s1"> _treestep_1 == [dip] cons [uncons] swoncat</span>
|
||||||
|
|
@ -169,7 +169,7 @@ all nodes in a tree with this function:</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sumtree</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="nb">sum</span> <span class="o">+</span><span class="p">]</span> <span class="n">treestep</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sumtree</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="nb">sum</span> <span class="o">+</span><span class="p">]</span> <span class="n">treestep</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'sumtree == [pop 0] [] [sum +] treestep'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'sumtree == [pop 0] [] [sum +] treestep'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Running this function on an empty tree value gives zero:</p>
|
<p>Running this function on an empty tree value gives zero:</p>
|
||||||
|
|
@ -178,7 +178,7 @@ all nodes in a tree with this function:</p>
|
||||||
<span class="mi">0</span>
|
<span class="mi">0</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] sumtree'</span><span class="p">)</span> <span class="c1"># Empty tree.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] sumtree'</span><span class="p">)</span> <span class="c1"># Empty tree.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span>
|
||||||
|
|
@ -192,61 +192,61 @@ all nodes in a tree with this function:</p>
|
||||||
<span class="n">n</span><span class="o">+</span><span class="n">m</span>
|
<span class="n">n</span><span class="o">+</span><span class="n">m</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23] sumtree'</span><span class="p">)</span> <span class="c1"># No child trees.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23] sumtree'</span><span class="p">)</span> <span class="c1"># No child trees.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 []] sumtree'</span><span class="p">)</span> <span class="c1"># Child tree, empty.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 []] sumtree'</span><span class="p">)</span> <span class="c1"># Child tree, empty.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [4]] [3]] sumtree'</span><span class="p">)</span> <span class="c1"># Non-empty child trees.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [4]] [3]] sumtree'</span><span class="p">)</span> <span class="c1"># Non-empty child trees.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">32</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">32</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] sumtree'</span><span class="p">)</span> <span class="c1"># Etc...</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] sumtree'</span><span class="p">)</span> <span class="c1"># Etc...</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">49</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">49</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [pop 0] [] [cons sum] treestep'</span><span class="p">)</span> <span class="c1"># Alternate "spelling".</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [pop 0] [] [cons sum] treestep'</span><span class="p">)</span> <span class="c1"># Alternate "spelling".</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">49</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">49</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [] [pop 23] [cons] treestep'</span><span class="p">)</span> <span class="c1"># Replace each node.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [] [pop 23] [cons] treestep'</span><span class="p">)</span> <span class="c1"># Replace each node.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">23</span> <span class="p">[</span><span class="mi">23</span> <span class="p">[</span><span class="mi">23</span><span class="p">]</span> <span class="p">[</span><span class="mi">23</span><span class="p">]]</span> <span class="p">[</span><span class="mi">23</span><span class="p">]</span> <span class="p">[</span><span class="mi">23</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">23</span> <span class="p">[</span><span class="mi">23</span> <span class="p">[</span><span class="mi">23</span><span class="p">]</span> <span class="p">[</span><span class="mi">23</span><span class="p">]]</span> <span class="p">[</span><span class="mi">23</span><span class="p">]</span> <span class="p">[</span><span class="mi">23</span> <span class="p">[]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[]]]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">6</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">6</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [pop 0] [pop 1] [sum +] treestep'</span><span class="p">)</span> <span class="c1"># Combine replace and sum into one function.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [pop 0] [pop 1] [sum +] treestep'</span><span class="p">)</span> <span class="c1"># Combine replace and sum into one function.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">6</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">6</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[4 [3 [] [7]]] [pop 0] [pop 1] [sum +] treestep'</span><span class="p">)</span> <span class="c1"># Combine replace and sum into one function.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[4 [3 [] [7]]] [pop 0] [pop 1] [sum +] treestep'</span><span class="p">)</span> <span class="c1"># Combine replace and sum into one function.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span>
|
||||||
|
|
@ -277,7 +277,7 @@ all nodes in a tree with this function:</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>This doesn’t quite work:</p>
|
<p>This doesn’t quite work:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [][]] [[9 0] [[5 0] [[4 0] [][]] [[8 0] [[6 0] [] [[7 0] [][]]][]]][]]] ["B"] [first] [i] treestep'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [][]] [[9 0] [[5 0] [[4 0] [][]] [[8 0] [[6 0] [] [[7 0] [][]]][]]][]]] ["B"] [first] [i] treestep'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="s1">'B'</span> <span class="s1">'B'</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="s1">'B'</span> <span class="s1">'B'</span>
|
||||||
|
|
@ -299,7 +299,7 @@ depositing our results directly on the stack.</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="n">first</span><span class="p">]</span> <span class="p">[</span><span class="n">flatten</span> <span class="n">cons</span><span class="p">]</span> <span class="n">treestep</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="n">first</span><span class="p">]</span> <span class="p">[</span><span class="n">flatten</span> <span class="n">cons</span><span class="p">]</span> <span class="n">treestep</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [first] [flatten cons] treestep'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [first] [flatten cons] treestep'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">2</span> <span class="mi">9</span> <span class="mi">5</span> <span class="mi">4</span> <span class="mi">8</span> <span class="mi">6</span> <span class="mi">7</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">2</span> <span class="mi">9</span> <span class="mi">5</span> <span class="mi">4</span> <span class="mi">8</span> <span class="mi">6</span> <span class="mi">7</span><span class="p">]</span>
|
||||||
|
|
@ -322,7 +322,7 @@ depositing our results directly on the stack.</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="n">i</span> <span class="n">roll</span><span class="o"><</span> <span class="n">swons</span> <span class="n">concat</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span><span class="p">]</span> <span class="n">treestep</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="n">i</span> <span class="n">roll</span><span class="o"><</span> <span class="n">swons</span> <span class="n">concat</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span><span class="p">]</span> <span class="n">treestep</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [uncons pop] [i roll< swons concat] treestep'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [uncons pop] [i roll< swons concat] treestep'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span><span class="p">]</span>
|
||||||
|
|
@ -343,7 +343,7 @@ non-empty node is:</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span><span class="p">]</span> <span class="n">N</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="n">C</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span><span class="p">]</span> <span class="n">N</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="n">C</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'key'</span> <span class="s1">'value'</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[[</span><span class="s1">'left'</span><span class="p">]</span> <span class="p">[</span><span class="s1">'right'</span><span class="p">]]</span> <span class="p">[[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="s1">'B'</span><span class="p">]</span> <span class="p">[</span><span class="n">uncons</span> <span class="p">[</span><span class="s1">'N'</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="s1">'C'</span><span class="p">]</span> <span class="n">genrec</span><span class="p">]</span> <span class="s1">'C'</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'key'</span> <span class="s1">'value'</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[[</span><span class="s1">'left'</span><span class="p">]</span> <span class="p">[</span><span class="s1">'right'</span><span class="p">]]</span> <span class="p">[[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="s1">'B'</span><span class="p">]</span> <span class="p">[</span><span class="n">uncons</span> <span class="p">[</span><span class="s1">'N'</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="s1">'C'</span><span class="p">]</span> <span class="n">genrec</span><span class="p">]</span> <span class="s1">'C'</span>
|
||||||
|
|
@ -353,21 +353,21 @@ non-empty node is:</p>
|
||||||
<section id="treegrind-with-step">
|
<section id="treegrind-with-step">
|
||||||
<h2><code class="docutils literal notranslate"><span class="pre">treegrind</span></code> with <code class="docutils literal notranslate"><span class="pre">step</span></code><a class="headerlink" href="#treegrind-with-step" title="Permalink to this headline">¶</a></h2>
|
<h2><code class="docutils literal notranslate"><span class="pre">treegrind</span></code> with <code class="docutils literal notranslate"><span class="pre">step</span></code><a class="headerlink" href="#treegrind-with-step" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>Iteration through the nodes</p>
|
<p>Iteration through the nodes</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] ["N"] [step] treegrind'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] ["N"] [step] treegrind'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Sum the nodes’ keys.</p>
|
<p>Sum the nodes’ keys.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'0 [[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] [first +] [step] treegrind'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'0 [[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] [first +] [step] treegrind'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">44</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">44</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Rebuild the tree using <code class="docutils literal notranslate"><span class="pre">map</span></code> (imitating <code class="docutils literal notranslate"><span class="pre">treestep</span></code>.)</p>
|
<p>Rebuild the tree using <code class="docutils literal notranslate"><span class="pre">map</span></code> (imitating <code class="docutils literal notranslate"><span class="pre">treestep</span></code>.)</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [[100 +] infra] [map cons] treegrind'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [[100 +] infra] [map cons] treegrind'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">103</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">102</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[[</span><span class="mi">109</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">105</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">104</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[[</span><span class="mi">108</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">106</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">107</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">103</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">102</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[[</span><span class="mi">109</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">105</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">104</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[[</span><span class="mi">108</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">106</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">107</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
|
||||||
|
|
@ -449,7 +449,7 @@ equal):</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>To me, that seems simpler than the <code class="docutils literal notranslate"><span class="pre">genrec</span></code> version.</p>
|
<p>To me, that seems simpler than the <code class="docutils literal notranslate"><span class="pre">genrec</span></code> version.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
||||||
|
|
||||||
<span class="s1"> T> == pop [first] dip i</span>
|
<span class="s1"> T> == pop [first] dip i</span>
|
||||||
<span class="s1"> T< == pop [second] dip i</span>
|
<span class="s1"> T< == pop [second] dip i</span>
|
||||||
|
|
@ -461,7 +461,7 @@ equal):</p>
|
||||||
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span><span class="se">\</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span><span class="se">\</span>
|
||||||
|
|
||||||
<span class="s1">[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]</span>
|
<span class="s1">[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]</span>
|
||||||
|
|
||||||
|
|
@ -473,7 +473,7 @@ equal):</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span><span class="se">\</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span><span class="se">\</span>
|
||||||
|
|
||||||
<span class="s1">[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]</span>
|
<span class="s1">[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]</span>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
<section id="type-checking">
|
<section id="type-checking">
|
||||||
<h1>Type Checking<a class="headerlink" href="#type-checking" title="Permalink to this headline">¶</a></h1>
|
<h1>Type Checking<a class="headerlink" href="#type-checking" title="Permalink to this headline">¶</a></h1>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">sys</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">sys</span>
|
||||||
|
|
||||||
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span>
|
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span>
|
||||||
<span class="nb">format</span><span class="o">=</span><span class="s1">'</span><span class="si">%(message)s</span><span class="s1">'</span><span class="p">,</span>
|
<span class="nb">format</span><span class="o">=</span><span class="s1">'</span><span class="si">%(message)s</span><span class="s1">'</span><span class="p">,</span>
|
||||||
|
|
@ -44,7 +44,7 @@
|
||||||
<span class="p">)</span>
|
<span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.utils.types</span> <span class="kn">import</span> <span class="p">(</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.utils.types</span> <span class="kn">import</span> <span class="p">(</span>
|
||||||
<span class="n">doc_from_stack_effect</span><span class="p">,</span>
|
<span class="n">doc_from_stack_effect</span><span class="p">,</span>
|
||||||
<span class="n">infer</span><span class="p">,</span>
|
<span class="n">infer</span><span class="p">,</span>
|
||||||
<span class="n">reify</span><span class="p">,</span>
|
<span class="n">reify</span><span class="p">,</span>
|
||||||
|
|
@ -54,14 +54,14 @@
|
||||||
<span class="p">)</span>
|
<span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">D</span> <span class="o">=</span> <span class="n">FUNCTIONS</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">D</span> <span class="o">=</span> <span class="n">FUNCTIONS</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||||||
<span class="k">del</span> <span class="n">D</span><span class="p">[</span><span class="s1">'product'</span><span class="p">]</span>
|
<span class="k">del</span> <span class="n">D</span><span class="p">[</span><span class="s1">'product'</span><span class="p">]</span>
|
||||||
<span class="nb">globals</span><span class="p">()</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">D</span><span class="p">)</span>
|
<span class="nb">globals</span><span class="p">()</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">D</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<section id="an-example">
|
<section id="an-example">
|
||||||
<h2>An Example<a class="headerlink" href="#an-example" title="Permalink to this headline">¶</a></h2>
|
<h2>An Example<a class="headerlink" href="#an-example" title="Permalink to this headline">¶</a></h2>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span> <span class="o">=</span> <span class="n">infer</span><span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">rolldown</span><span class="p">,</span> <span class="n">rrest</span><span class="p">,</span> <span class="n">ccons</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span> <span class="o">=</span> <span class="n">infer</span><span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">rolldown</span><span class="p">,</span> <span class="n">rrest</span><span class="p">,</span> <span class="n">ccons</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>25 (--) ∘ pop swap rolldown rrest ccons
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>25 (--) ∘ pop swap rolldown rrest ccons
|
||||||
|
|
@ -72,31 +72,31 @@
|
||||||
40 ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) ∘
|
40 ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) ∘
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="n">a4</span> <span class="n">a5</span> <span class="o">...</span><span class="mi">1</span><span class="p">]</span> <span class="n">a3</span> <span class="n">a2</span> <span class="n">a1</span> <span class="o">--</span> <span class="p">[</span><span class="n">a2</span> <span class="n">a3</span> <span class="o">...</span><span class="mi">1</span><span class="p">])</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="n">a4</span> <span class="n">a5</span> <span class="o">...</span><span class="mi">1</span><span class="p">]</span> <span class="n">a3</span> <span class="n">a2</span> <span class="n">a1</span> <span class="o">--</span> <span class="p">[</span><span class="n">a2</span> <span class="n">a3</span> <span class="o">...</span><span class="mi">1</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.parser</span> <span class="kn">import</span> <span class="n">text_to_expression</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.parser</span> <span class="kn">import</span> <span class="n">text_to_expression</span>
|
||||||
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="kn">import</span> <span class="n">stack_to_string</span>
|
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="kn">import</span> <span class="n">stack_to_string</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'0 1 2 [3 4]'</span><span class="p">)</span> <span class="c1"># reverse order</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'0 1 2 [3 4]'</span><span class="p">)</span> <span class="c1"># reverse order</span>
|
||||||
<span class="nb">print</span> <span class="n">stack_to_string</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">stack_to_string</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">u</span> <span class="o">=</span> <span class="n">unify</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">fi</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">u</span> <span class="o">=</span> <span class="n">unify</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">fi</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
<span class="n">u</span>
|
<span class="n">u</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="n">a1</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">a2</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">a3</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">a4</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">a5</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="p">(),</span> <span class="n">s1</span><span class="p">:</span> <span class="p">()}</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="n">a1</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">a2</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">a3</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">a4</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">a5</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="p">(),</span> <span class="n">s1</span><span class="p">:</span> <span class="p">()}</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">g</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="p">(</span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">g</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="p">(</span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span><span class="p">))</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">g</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">g</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -106,17 +106,17 @@
|
||||||
</section>
|
</section>
|
||||||
<section id="unification-works-in-reverse">
|
<section id="unification-works-in-reverse">
|
||||||
<h2>Unification Works “in Reverse”<a class="headerlink" href="#unification-works-in-reverse" title="Permalink to this headline">¶</a></h2>
|
<h2>Unification Works “in Reverse”<a class="headerlink" href="#unification-works-in-reverse" title="Permalink to this headline">¶</a></h2>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'[2 3]'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'[2 3]'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">u</span> <span class="o">=</span> <span class="n">unify</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">fo</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># output side, not input side</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">u</span> <span class="o">=</span> <span class="n">unify</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">fo</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># output side, not input side</span>
|
||||||
<span class="n">u</span>
|
<span class="n">u</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="n">a2</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">a3</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="p">(),</span> <span class="n">s1</span><span class="p">:</span> <span class="p">()}</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="n">a2</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">a3</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="p">(),</span> <span class="n">s1</span><span class="p">:</span> <span class="p">()}</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">g</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="p">(</span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">g</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="p">(</span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span><span class="p">))</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">g</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">g</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -126,7 +126,7 @@
|
||||||
</section>
|
</section>
|
||||||
<section id="failing-a-check">
|
<section id="failing-a-check">
|
||||||
<h2>Failing a Check<a class="headerlink" href="#failing-a-check" title="Permalink to this headline">¶</a></h2>
|
<h2>Failing a Check<a class="headerlink" href="#failing-a-check" title="Permalink to this headline">¶</a></h2>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span> <span class="o">=</span> <span class="n">infer</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">mul</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span> <span class="o">=</span> <span class="n">infer</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">mul</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>25 (--) ∘ dup mul
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>25 (--) ∘ dup mul
|
||||||
|
|
@ -135,14 +135,14 @@
|
||||||
31 (i1 -- i2) ∘
|
31 (i1 -- i2) ∘
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'"two"'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'"two"'</span><span class="p">)</span>
|
||||||
<span class="nb">print</span> <span class="n">stack_to_string</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">stack_to_string</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'two'</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'two'</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
|
||||||
<span class="n">unify</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">fi</span><span class="p">)</span>
|
<span class="n">unify</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">fi</span><span class="p">)</span>
|
||||||
<span class="k">except</span> <span class="n">JoyTypeError</span><span class="p">,</span> <span class="n">err</span><span class="p">:</span>
|
<span class="k">except</span> <span class="n">JoyTypeError</span><span class="p">,</span> <span class="n">err</span><span class="p">:</span>
|
||||||
<span class="nb">print</span> <span class="n">err</span>
|
<span class="nb">print</span> <span class="n">err</span>
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ terms in the forms:</p>
|
||||||
<section id="compiling-popswaproll">
|
<section id="compiling-popswaproll">
|
||||||
<h3>Compiling <code class="docutils literal notranslate"><span class="pre">pop∘swap∘roll<</span></code><a class="headerlink" href="#compiling-popswaproll" title="Permalink to this headline">¶</a></h3>
|
<h3>Compiling <code class="docutils literal notranslate"><span class="pre">pop∘swap∘roll<</span></code><a class="headerlink" href="#compiling-popswaproll" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>The simplest way to “compile” this function would be something like:</p>
|
<p>The simplest way to “compile” this function would be something like:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">poswrd</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">poswrd</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span>
|
||||||
<span class="k">return</span> <span class="n">rolldown</span><span class="p">(</span><span class="o">*</span><span class="n">swap</span><span class="p">(</span><span class="o">*</span><span class="n">pop</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">d</span><span class="p">)))</span>
|
<span class="k">return</span> <span class="n">rolldown</span><span class="p">(</span><span class="o">*</span><span class="n">swap</span><span class="p">(</span><span class="o">*</span><span class="n">pop</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">d</span><span class="p">)))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -193,7 +193,7 @@ terms in the forms:</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>We should be able to directly write out a Python function like:</p>
|
<p>We should be able to directly write out a Python function like:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">poswrd</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">poswrd</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||||
<span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">stack</span><span class="p">))))</span> <span class="o">=</span> <span class="n">stack</span>
|
<span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">stack</span><span class="p">))))</span> <span class="o">=</span> <span class="n">stack</span>
|
||||||
<span class="k">return</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">stack</span><span class="p">)))</span>
|
<span class="k">return</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">stack</span><span class="p">)))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -335,7 +335,7 @@ actually pretty easy. I’ll explain below.</p>
|
||||||
</div>
|
</div>
|
||||||
<p>From this stack effect comment it should be possible to construct the
|
<p>From this stack effect comment it should be possible to construct the
|
||||||
following Python code:</p>
|
following Python code:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">F</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">F</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||||
<span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="p">((</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span><span class="p">))))</span> <span class="o">=</span> <span class="n">stack</span>
|
<span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="p">((</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span><span class="p">))))</span> <span class="o">=</span> <span class="n">stack</span>
|
||||||
<span class="k">return</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span>
|
<span class="k">return</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -348,7 +348,7 @@ following Python code:</p>
|
||||||
<h3>Representing Stack Effect Comments in Python<a class="headerlink" href="#representing-stack-effect-comments-in-python" title="Permalink to this headline">¶</a></h3>
|
<h3>Representing Stack Effect Comments in Python<a class="headerlink" href="#representing-stack-effect-comments-in-python" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>I’m going to use pairs of tuples of type descriptors, which will be
|
<p>I’m going to use pairs of tuples of type descriptors, which will be
|
||||||
integers or tuples of type descriptors:</p>
|
integers or tuples of type descriptors:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">roll_dn</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">roll_dn</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="n">pop</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()</span>
|
<span class="n">pop</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()</span>
|
||||||
|
|
||||||
|
|
@ -358,7 +358,7 @@ integers or tuples of type descriptors:</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="compose">
|
<section id="compose">
|
||||||
<h3><code class="docutils literal notranslate"><span class="pre">compose()</span></code><a class="headerlink" href="#compose" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal notranslate"><span class="pre">compose()</span></code><a class="headerlink" href="#compose" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compose</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compose</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
|
||||||
|
|
||||||
<span class="p">(</span><span class="n">f_in</span><span class="p">,</span> <span class="n">f_out</span><span class="p">),</span> <span class="p">(</span><span class="n">g_in</span><span class="p">,</span> <span class="n">g_out</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span><span class="p">,</span> <span class="n">g</span>
|
<span class="p">(</span><span class="n">f_in</span><span class="p">,</span> <span class="n">f_out</span><span class="p">),</span> <span class="p">(</span><span class="n">g_in</span><span class="p">,</span> <span class="n">g_out</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span><span class="p">,</span> <span class="n">g</span>
|
||||||
|
|
||||||
|
|
@ -403,7 +403,7 @@ integers or tuples of type descriptors:</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="unify">
|
<section id="unify">
|
||||||
<h3><code class="docutils literal notranslate"><span class="pre">unify()</span></code><a class="headerlink" href="#unify" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal notranslate"><span class="pre">unify()</span></code><a class="headerlink" href="#unify" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">unify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">unify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||||
<span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
<span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
<span class="n">s</span> <span class="o">=</span> <span class="p">{}</span>
|
<span class="n">s</span> <span class="o">=</span> <span class="p">{}</span>
|
||||||
|
|
||||||
|
|
@ -420,7 +420,7 @@ integers or tuples of type descriptors:</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="update">
|
<section id="update">
|
||||||
<h3><code class="docutils literal notranslate"><span class="pre">update()</span></code><a class="headerlink" href="#update" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal notranslate"><span class="pre">update()</span></code><a class="headerlink" href="#update" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">term</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">term</span><span class="p">):</span>
|
||||||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">term</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">term</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
|
||||||
<span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">term</span><span class="p">,</span> <span class="n">term</span><span class="p">)</span>
|
<span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">term</span><span class="p">,</span> <span class="n">term</span><span class="p">)</span>
|
||||||
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">update</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">inner</span><span class="p">)</span> <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">term</span><span class="p">)</span>
|
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">update</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">inner</span><span class="p">)</span> <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">term</span><span class="p">)</span>
|
||||||
|
|
@ -429,7 +429,7 @@ integers or tuples of type descriptors:</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="relabel">
|
<section id="relabel">
|
||||||
<h3><code class="docutils literal notranslate"><span class="pre">relabel()</span></code><a class="headerlink" href="#relabel" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal notranslate"><span class="pre">relabel()</span></code><a class="headerlink" href="#relabel" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">relabel</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">relabel</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">):</span>
|
||||||
<span class="k">return</span> <span class="n">left</span><span class="p">,</span> <span class="n">_1000</span><span class="p">(</span><span class="n">right</span><span class="p">)</span>
|
<span class="k">return</span> <span class="n">left</span><span class="p">,</span> <span class="n">_1000</span><span class="p">(</span><span class="n">right</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">_1000</span><span class="p">(</span><span class="n">right</span><span class="p">):</span>
|
<span class="k">def</span> <span class="nf">_1000</span><span class="p">(</span><span class="n">right</span><span class="p">):</span>
|
||||||
|
|
@ -446,7 +446,7 @@ integers or tuples of type descriptors:</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="delabel">
|
<section id="delabel">
|
||||||
<h3><code class="docutils literal notranslate"><span class="pre">delabel()</span></code><a class="headerlink" href="#delabel" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal notranslate"><span class="pre">delabel()</span></code><a class="headerlink" href="#delabel" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">delabel</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">delabel</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
|
||||||
<span class="n">s</span> <span class="o">=</span> <span class="p">{</span><span class="n">u</span><span class="p">:</span> <span class="n">i</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">u</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">_unique</span><span class="p">(</span><span class="n">f</span><span class="p">)))}</span>
|
<span class="n">s</span> <span class="o">=</span> <span class="p">{</span><span class="n">u</span><span class="p">:</span> <span class="n">i</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">u</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">_unique</span><span class="p">(</span><span class="n">f</span><span class="p">)))}</span>
|
||||||
<span class="k">return</span> <span class="n">update</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
|
<span class="k">return</span> <span class="n">update</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
|
||||||
|
|
||||||
|
|
@ -472,38 +472,38 @@ integers or tuples of type descriptors:</p>
|
||||||
<p>At last we put it all together in a function <code class="docutils literal notranslate"><span class="pre">C()</span></code> that accepts two
|
<p>At last we put it all together in a function <code class="docutils literal notranslate"><span class="pre">C()</span></code> that accepts two
|
||||||
stack effect comments and returns their composition (or raises and
|
stack effect comments and returns their composition (or raises and
|
||||||
exception if they can’t be composed due to type conflicts.)</p>
|
exception if they can’t be composed due to type conflicts.)</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">C</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">C</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
|
||||||
<span class="n">f</span><span class="p">,</span> <span class="n">g</span> <span class="o">=</span> <span class="n">relabel</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">)</span>
|
<span class="n">f</span><span class="p">,</span> <span class="n">g</span> <span class="o">=</span> <span class="n">relabel</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">)</span>
|
||||||
<span class="n">fg</span> <span class="o">=</span> <span class="n">compose</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">)</span>
|
<span class="n">fg</span> <span class="o">=</span> <span class="n">compose</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">)</span>
|
||||||
<span class="k">return</span> <span class="n">delabel</span><span class="p">(</span><span class="n">fg</span><span class="p">)</span>
|
<span class="k">return</span> <span class="n">delabel</span><span class="p">(</span><span class="n">fg</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Let’s try it out.</p>
|
<p>Let’s try it out.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">C</span><span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">),</span> <span class="n">roll_dn</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">C</span><span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">),</span> <span class="n">roll_dn</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">swap</span><span class="p">,</span> <span class="n">roll_dn</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">swap</span><span class="p">,</span> <span class="n">roll_dn</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">C</span><span class="p">(</span><span class="n">swap</span><span class="p">,</span> <span class="n">roll_dn</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">C</span><span class="p">(</span><span class="n">swap</span><span class="p">,</span> <span class="n">roll_dn</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">poswrd</span> <span class="o">=</span> <span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">roll_dn</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">poswrd</span> <span class="o">=</span> <span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">roll_dn</span><span class="p">))</span>
|
||||||
<span class="n">poswrd</span>
|
<span class="n">poswrd</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -516,12 +516,12 @@ exception if they can’t be composed due to type conflicts.)</p>
|
||||||
<p>Here’s that trick to represent functions like <code class="docutils literal notranslate"><span class="pre">rest</span></code> and <code class="docutils literal notranslate"><span class="pre">cons</span></code> that
|
<p>Here’s that trick to represent functions like <code class="docutils literal notranslate"><span class="pre">rest</span></code> and <code class="docutils literal notranslate"><span class="pre">cons</span></code> that
|
||||||
manipulate stacks. We use a cons-list of tuples and give the tails their
|
manipulate stacks. We use a cons-list of tuples and give the tails their
|
||||||
own numbers. Then everything above already works.</p>
|
own numbers. Then everything above already works.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">rest</span> <span class="o">=</span> <span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">rest</span> <span class="o">=</span> <span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,)</span>
|
||||||
|
|
||||||
<span class="n">cons</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),)</span>
|
<span class="n">cons</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">poswrd</span><span class="p">,</span> <span class="n">rest</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">poswrd</span><span class="p">,</span> <span class="n">rest</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span>
|
||||||
|
|
@ -542,7 +542,7 @@ own numbers. Then everything above already works.</p>
|
||||||
<span class="p">}</span>
|
<span class="p">}</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">F</span> <span class="o">=</span> <span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">roll_dn</span><span class="p">,</span> <span class="n">rest</span><span class="p">,</span> <span class="n">rest</span><span class="p">,</span> <span class="n">cons</span><span class="p">,</span> <span class="n">cons</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">F</span> <span class="o">=</span> <span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">roll_dn</span><span class="p">,</span> <span class="n">rest</span><span class="p">,</span> <span class="n">rest</span><span class="p">,</span> <span class="n">cons</span><span class="p">,</span> <span class="n">cons</span><span class="p">))</span>
|
||||||
|
|
||||||
<span class="n">F</span>
|
<span class="n">F</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -560,10 +560,10 @@ own numbers. Then everything above already works.</p>
|
||||||
<h3>Dealing with <code class="docutils literal notranslate"><span class="pre">cons</span></code> and <code class="docutils literal notranslate"><span class="pre">uncons</span></code><a class="headerlink" href="#dealing-with-cons-and-uncons" title="Permalink to this headline">¶</a></h3>
|
<h3>Dealing with <code class="docutils literal notranslate"><span class="pre">cons</span></code> and <code class="docutils literal notranslate"><span class="pre">uncons</span></code><a class="headerlink" href="#dealing-with-cons-and-uncons" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>However, if we try to compose e.g. <code class="docutils literal notranslate"><span class="pre">cons</span></code> and <code class="docutils literal notranslate"><span class="pre">uncons</span></code> it won’t
|
<p>However, if we try to compose e.g. <code class="docutils literal notranslate"><span class="pre">cons</span></code> and <code class="docutils literal notranslate"><span class="pre">uncons</span></code> it won’t
|
||||||
work:</p>
|
work:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">uncons</span> <span class="o">=</span> <span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">uncons</span> <span class="o">=</span> <span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
|
||||||
<span class="n">C</span><span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="n">uncons</span><span class="p">)</span>
|
<span class="n">C</span><span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="n">uncons</span><span class="p">)</span>
|
||||||
<span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
|
<span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
|
||||||
<span class="nb">print</span> <span class="n">e</span>
|
<span class="nb">print</span> <span class="n">e</span>
|
||||||
|
|
@ -577,7 +577,7 @@ work:</p>
|
||||||
<p>The problem is that the <code class="docutils literal notranslate"><span class="pre">unify()</span></code> function as written doesn’t handle
|
<p>The problem is that the <code class="docutils literal notranslate"><span class="pre">unify()</span></code> function as written doesn’t handle
|
||||||
the case when both terms are tuples. We just have to add a clause to
|
the case when both terms are tuples. We just have to add a clause to
|
||||||
deal with this recursively:</p>
|
deal with this recursively:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">unify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">unify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||||
<span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
<span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
<span class="n">s</span> <span class="o">=</span> <span class="p">{}</span>
|
<span class="n">s</span> <span class="o">=</span> <span class="p">{}</span>
|
||||||
<span class="k">elif</span> <span class="n">s</span><span class="p">:</span>
|
<span class="k">elif</span> <span class="n">s</span><span class="p">:</span>
|
||||||
|
|
@ -606,7 +606,7 @@ deal with this recursively:</p>
|
||||||
<span class="k">return</span> <span class="n">s</span>
|
<span class="k">return</span> <span class="n">s</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="n">uncons</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="n">uncons</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
|
||||||
|
|
@ -618,13 +618,13 @@ deal with this recursively:</p>
|
||||||
<section id="part-iii-compiling-yin-functions">
|
<section id="part-iii-compiling-yin-functions">
|
||||||
<h2>Part III: Compiling Yin Functions<a class="headerlink" href="#part-iii-compiling-yin-functions" title="Permalink to this headline">¶</a></h2>
|
<h2>Part III: Compiling Yin Functions<a class="headerlink" href="#part-iii-compiling-yin-functions" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>Now consider the Python function we would like to derive:</p>
|
<p>Now consider the Python function we would like to derive:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">F_python</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">F_python</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||||
<span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="p">((</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span><span class="p">))))</span> <span class="o">=</span> <span class="n">stack</span>
|
<span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="p">((</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span><span class="p">))))</span> <span class="o">=</span> <span class="n">stack</span>
|
||||||
<span class="k">return</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span>
|
<span class="k">return</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>And compare it to the input stack effect comment tuple we just computed:</p>
|
<p>And compare it to the input stack effect comment tuple we just computed:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">F</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">F</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">)),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">)),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||||
|
|
@ -646,7 +646,7 @@ stack effect comment tuple, just in the reverse order:</p>
|
||||||
</div>
|
</div>
|
||||||
<p>Eh?</p>
|
<p>Eh?</p>
|
||||||
<p>And the return tuple</p>
|
<p>And the return tuple</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">F</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">F</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">)),)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">)),)</span>
|
||||||
|
|
@ -666,7 +666,7 @@ effect.)</p>
|
||||||
<h3>Python Identifiers<a class="headerlink" href="#python-identifiers" title="Permalink to this headline">¶</a></h3>
|
<h3>Python Identifiers<a class="headerlink" href="#python-identifiers" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>We want to substitute Python identifiers for the integers. I’m going to
|
<p>We want to substitute Python identifiers for the integers. I’m going to
|
||||||
repurpose <code class="docutils literal notranslate"><span class="pre">joy.parser.Symbol</span></code> class for this:</p>
|
repurpose <code class="docutils literal notranslate"><span class="pre">joy.parser.Symbol</span></code> class for this:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
|
||||||
<span class="kn">from</span> <span class="nn">joy.parser</span> <span class="kn">import</span> <span class="n">Symbol</span>
|
<span class="kn">from</span> <span class="nn">joy.parser</span> <span class="kn">import</span> <span class="n">Symbol</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -690,7 +690,7 @@ repurpose <code class="docutils literal notranslate"><span class="pre">joy.parse
|
||||||
effect comment tuples to reasonable text format. There are some details
|
effect comment tuples to reasonable text format. There are some details
|
||||||
in how this code works that related to stuff later in the notebook, so
|
in how this code works that related to stuff later in the notebook, so
|
||||||
you should skip it for now and read it later if you’re interested.</p>
|
you should skip it for now and read it later if you’re interested.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">doc_from_stack_effect</span><span class="p">(</span><span class="n">inputs</span><span class="p">,</span> <span class="n">outputs</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">doc_from_stack_effect</span><span class="p">(</span><span class="n">inputs</span><span class="p">,</span> <span class="n">outputs</span><span class="p">):</span>
|
||||||
<span class="k">return</span> <span class="s1">'(</span><span class="si">%s</span><span class="s1">--</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="p">(</span>
|
<span class="k">return</span> <span class="s1">'(</span><span class="si">%s</span><span class="s1">--</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="p">(</span>
|
||||||
<span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">_to_str</span><span class="p">,</span> <span class="n">inputs</span> <span class="o">+</span> <span class="p">(</span><span class="s1">''</span><span class="p">,))),</span>
|
<span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">_to_str</span><span class="p">,</span> <span class="n">inputs</span> <span class="o">+</span> <span class="p">(</span><span class="s1">''</span><span class="p">,))),</span>
|
||||||
<span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">_to_str</span><span class="p">,</span> <span class="p">(</span><span class="s1">''</span><span class="p">,)</span> <span class="o">+</span> <span class="n">outputs</span><span class="p">))</span>
|
<span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">_to_str</span><span class="p">,</span> <span class="p">(</span><span class="s1">''</span><span class="p">,)</span> <span class="o">+</span> <span class="n">outputs</span><span class="p">))</span>
|
||||||
|
|
@ -728,7 +728,7 @@ you should skip it for now and read it later if you’re interested.</p>
|
||||||
<p>Now we can write a compiler function to emit Python source code. (The
|
<p>Now we can write a compiler function to emit Python source code. (The
|
||||||
underscore suffix distiguishes it from the built-in <code class="docutils literal notranslate"><span class="pre">compile()</span></code>
|
underscore suffix distiguishes it from the built-in <code class="docutils literal notranslate"><span class="pre">compile()</span></code>
|
||||||
function.)</p>
|
function.)</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compile_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compile_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||||
<span class="k">if</span> <span class="n">doc</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
<span class="k">if</span> <span class="n">doc</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
<span class="n">doc</span> <span class="o">=</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
<span class="n">doc</span> <span class="o">=</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
||||||
<span class="n">inputs</span><span class="p">,</span> <span class="n">outputs</span> <span class="o">=</span> <span class="n">identifiers</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
<span class="n">inputs</span><span class="p">,</span> <span class="n">outputs</span> <span class="o">=</span> <span class="n">identifiers</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
||||||
|
|
@ -744,7 +744,7 @@ function.)</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Here it is in action:</p>
|
<p>Here it is in action:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">source</span> <span class="o">=</span> <span class="n">compile_</span><span class="p">(</span><span class="s1">'F'</span><span class="p">,</span> <span class="n">F</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">source</span> <span class="o">=</span> <span class="n">compile_</span><span class="p">(</span><span class="s1">'F'</span><span class="p">,</span> <span class="n">F</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="nb">print</span> <span class="n">source</span>
|
<span class="nb">print</span> <span class="n">source</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -756,13 +756,13 @@ function.)</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Compare:</p>
|
<p>Compare:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">F_python</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">F_python</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||||
<span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="p">((</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span><span class="p">))))</span> <span class="o">=</span> <span class="n">stack</span>
|
<span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="p">((</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span><span class="p">))))</span> <span class="o">=</span> <span class="n">stack</span>
|
||||||
<span class="k">return</span> <span class="p">((</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span><span class="p">)</span>
|
<span class="k">return</span> <span class="p">((</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">S0</span><span class="p">)),</span> <span class="n">stack</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Next steps:</p>
|
<p>Next steps:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">L</span> <span class="o">=</span> <span class="p">{}</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">L</span> <span class="o">=</span> <span class="p">{}</span>
|
||||||
|
|
||||||
<span class="nb">eval</span><span class="p">(</span><span class="nb">compile</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="s1">'__main__'</span><span class="p">,</span> <span class="s1">'single'</span><span class="p">),</span> <span class="p">{},</span> <span class="n">L</span><span class="p">)</span>
|
<span class="nb">eval</span><span class="p">(</span><span class="nb">compile</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="s1">'__main__'</span><span class="p">,</span> <span class="s1">'single'</span><span class="p">),</span> <span class="p">{},</span> <span class="n">L</span><span class="p">)</span>
|
||||||
|
|
||||||
|
|
@ -773,14 +773,14 @@ function.)</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Let’s try it out:</p>
|
<p>Let’s try it out:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span>
|
||||||
<span class="kn">from</span> <span class="nn">joy.library</span> <span class="kn">import</span> <span class="n">SimpleFunctionWrapper</span>
|
<span class="kn">from</span> <span class="nn">joy.library</span> <span class="kn">import</span> <span class="n">SimpleFunctionWrapper</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">D</span><span class="p">[</span><span class="s1">'F'</span><span class="p">]</span> <span class="o">=</span> <span class="n">SimpleFunctionWrapper</span><span class="p">(</span><span class="n">L</span><span class="p">[</span><span class="s1">'F'</span><span class="p">])</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">D</span><span class="p">[</span><span class="s1">'F'</span><span class="p">]</span> <span class="o">=</span> <span class="n">SimpleFunctionWrapper</span><span class="p">(</span><span class="n">L</span><span class="p">[</span><span class="s1">'F'</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[4 5 ...] 2 3 1 F'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[4 5 ...] 2 3 1 F'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">2</span> <span class="o">...</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">2</span> <span class="o">...</span><span class="p">]</span>
|
||||||
|
|
@ -800,7 +800,7 @@ this might be less helpful.</p>
|
||||||
<h3>Compiling Library Functions<a class="headerlink" href="#compiling-library-functions" title="Permalink to this headline">¶</a></h3>
|
<h3>Compiling Library Functions<a class="headerlink" href="#compiling-library-functions" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>We can use <code class="docutils literal notranslate"><span class="pre">compile_()</span></code> to generate many primitives in the library
|
<p>We can use <code class="docutils literal notranslate"><span class="pre">compile_()</span></code> to generate many primitives in the library
|
||||||
from their stack effect comments:</p>
|
from their stack effect comments:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">defs</span><span class="p">():</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">defs</span><span class="p">():</span>
|
||||||
|
|
||||||
<span class="n">rolldown</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
<span class="n">rolldown</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||||
|
|
||||||
|
|
@ -823,7 +823,7 @@ from their stack effect comments:</p>
|
||||||
<span class="k">return</span> <span class="nb">locals</span><span class="p">()</span>
|
<span class="k">return</span> <span class="nb">locals</span><span class="p">()</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">stack_effect_comment</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">defs</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">stack_effect_comment</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">defs</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
||||||
<span class="nb">print</span>
|
<span class="nb">print</span>
|
||||||
<span class="nb">print</span> <span class="n">compile_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">stack_effect_comment</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">compile_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">stack_effect_comment</span><span class="p">)</span>
|
||||||
<span class="nb">print</span>
|
<span class="nb">print</span>
|
||||||
|
|
@ -966,7 +966,7 @@ and <code class="docutils literal notranslate"><span class="pre">t</span></code>
|
||||||
Python class hierarchy of Joy types and use the <code class="docutils literal notranslate"><span class="pre">issubclass()</span></code> method
|
Python class hierarchy of Joy types and use the <code class="docutils literal notranslate"><span class="pre">issubclass()</span></code> method
|
||||||
to establish domain ordering, as well as other handy behaviour that will
|
to establish domain ordering, as well as other handy behaviour that will
|
||||||
make it fairly easy to reuse most of the code above.</p>
|
make it fairly easy to reuse most of the code above.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">AnyJoyType</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">AnyJoyType</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
||||||
|
|
||||||
<span class="n">prefix</span> <span class="o">=</span> <span class="s1">'a'</span>
|
<span class="n">prefix</span> <span class="o">=</span> <span class="s1">'a'</span>
|
||||||
|
|
||||||
|
|
@ -1010,12 +1010,12 @@ make it fairly easy to reuse most of the code above.</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Mess with it a little:</p>
|
<p>Mess with it a little:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">permutations</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">permutations</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>“Any” types can be specialized to numbers and stacks, but not vice
|
<p>“Any” types can be specialized to numbers and stacks, but not vice
|
||||||
versa:</p>
|
versa:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">permutations</span><span class="p">((</span><span class="n">A</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">N</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="mi">2</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">permutations</span><span class="p">((</span><span class="n">A</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">N</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="mi">2</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="s1">'>='</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="n">a</span> <span class="o">>=</span> <span class="n">b</span>
|
<span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="s1">'>='</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="n">a</span> <span class="o">>=</span> <span class="n">b</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1030,7 +1030,7 @@ versa:</p>
|
||||||
<p>Our crude <a class="reference external" href="https://en.wikipedia.org/wiki/Numerical_tower">Numerical
|
<p>Our crude <a class="reference external" href="https://en.wikipedia.org/wiki/Numerical_tower">Numerical
|
||||||
Tower</a> of <em>numbers</em> >
|
Tower</a> of <em>numbers</em> >
|
||||||
<em>floats</em> > <em>integers</em> works as well (but we’re not going to use it yet):</p>
|
<em>floats</em> > <em>integers</em> works as well (but we’re not going to use it yet):</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">permutations</span><span class="p">((</span><span class="n">A</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">N</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">FloatJoyType</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="n">IntJoyType</span><span class="p">(</span><span class="mi">0</span><span class="p">)),</span> <span class="mi">2</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">permutations</span><span class="p">((</span><span class="n">A</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">N</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">FloatJoyType</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="n">IntJoyType</span><span class="p">(</span><span class="mi">0</span><span class="p">)),</span> <span class="mi">2</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="s1">'>='</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="n">a</span> <span class="o">>=</span> <span class="n">b</span>
|
<span class="nb">print</span> <span class="n">a</span><span class="p">,</span> <span class="s1">'>='</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="n">a</span> <span class="o">>=</span> <span class="n">b</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1051,18 +1051,18 @@ Tower</a> of <em>numbers</em> >
|
||||||
</section>
|
</section>
|
||||||
<section id="typing-sqr">
|
<section id="typing-sqr">
|
||||||
<h3>Typing <code class="docutils literal notranslate"><span class="pre">sqr</span></code><a class="headerlink" href="#typing-sqr" title="Permalink to this headline">¶</a></h3>
|
<h3>Typing <code class="docutils literal notranslate"><span class="pre">sqr</span></code><a class="headerlink" href="#typing-sqr" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">dup</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">],),</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">dup</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">],),</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
||||||
|
|
||||||
<span class="n">mul</span> <span class="o">=</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">N</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">3</span><span class="p">],)</span>
|
<span class="n">mul</span> <span class="o">=</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">N</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">3</span><span class="p">],)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">dup</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">dup</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">a1</span><span class="p">,),</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">a1</span><span class="p">))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">a1</span><span class="p">,),</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">a1</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">mul</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">mul</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">),</span> <span class="p">(</span><span class="n">n3</span><span class="p">,))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">),</span> <span class="p">(</span><span class="n">n3</span><span class="p">,))</span>
|
||||||
|
|
@ -1072,7 +1072,7 @@ Tower</a> of <em>numbers</em> >
|
||||||
<section id="modifying-the-inferencer">
|
<section id="modifying-the-inferencer">
|
||||||
<h3>Modifying the Inferencer<a class="headerlink" href="#modifying-the-inferencer" title="Permalink to this headline">¶</a></h3>
|
<h3>Modifying the Inferencer<a class="headerlink" href="#modifying-the-inferencer" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>Re-labeling still works fine:</p>
|
<p>Re-labeling still works fine:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">foo</span> <span class="o">=</span> <span class="n">relabel</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">mul</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">foo</span> <span class="o">=</span> <span class="n">relabel</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">mul</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="n">foo</span>
|
<span class="n">foo</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -1084,7 +1084,7 @@ Tower</a> of <em>numbers</em> >
|
||||||
<h4><code class="docutils literal notranslate"><span class="pre">delabel()</span></code> version 2<a class="headerlink" href="#delabel-version-2" title="Permalink to this headline">¶</a></h4>
|
<h4><code class="docutils literal notranslate"><span class="pre">delabel()</span></code> version 2<a class="headerlink" href="#delabel-version-2" title="Permalink to this headline">¶</a></h4>
|
||||||
<p>The <code class="docutils literal notranslate"><span class="pre">delabel()</span></code> function needs an overhaul. It now has to keep track
|
<p>The <code class="docutils literal notranslate"><span class="pre">delabel()</span></code> function needs an overhaul. It now has to keep track
|
||||||
of how many labels of each domain it has “seen”.</p>
|
of how many labels of each domain it has “seen”.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">Counter</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">Counter</span>
|
||||||
|
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">delabel</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">seen</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
<span class="k">def</span> <span class="nf">delabel</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">seen</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||||
|
|
@ -1105,7 +1105,7 @@ of how many labels of each domain it has “seen”.</p>
|
||||||
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">delabel</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">seen</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">f</span><span class="p">)</span>
|
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">delabel</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="n">seen</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">inner</span> <span class="ow">in</span> <span class="n">f</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">delabel</span><span class="p">(</span><span class="n">foo</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">delabel</span><span class="p">(</span><span class="n">foo</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(((</span><span class="n">a1</span><span class="p">,),</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">a1</span><span class="p">)),</span> <span class="p">((</span><span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">),</span> <span class="p">(</span><span class="n">n3</span><span class="p">,)))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(((</span><span class="n">a1</span><span class="p">,),</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">a1</span><span class="p">)),</span> <span class="p">((</span><span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">),</span> <span class="p">(</span><span class="n">n3</span><span class="p">,)))</span>
|
||||||
|
|
@ -1114,7 +1114,7 @@ of how many labels of each domain it has “seen”.</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="unify-version-3">
|
<section id="unify-version-3">
|
||||||
<h4><code class="docutils literal notranslate"><span class="pre">unify()</span></code> version 3<a class="headerlink" href="#unify-version-3" title="Permalink to this headline">¶</a></h4>
|
<h4><code class="docutils literal notranslate"><span class="pre">unify()</span></code> version 3<a class="headerlink" href="#unify-version-3" title="Permalink to this headline">¶</a></h4>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">unify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">unify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||||
<span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
<span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
<span class="n">s</span> <span class="o">=</span> <span class="p">{}</span>
|
<span class="n">s</span> <span class="o">=</span> <span class="p">{}</span>
|
||||||
<span class="k">elif</span> <span class="n">s</span><span class="p">:</span>
|
<span class="k">elif</span> <span class="n">s</span><span class="p">:</span>
|
||||||
|
|
@ -1162,7 +1162,7 @@ of how many labels of each domain it has “seen”.</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Rewrite the stack effect comments:</p>
|
<p>Rewrite the stack effect comments:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">defs</span><span class="p">():</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">defs</span><span class="p">():</span>
|
||||||
|
|
||||||
<span class="n">rolldown</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="p">]),</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
<span class="n">rolldown</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="p">]),</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
||||||
|
|
||||||
|
|
@ -1215,10 +1215,10 @@ of how many labels of each domain it has “seen”.</p>
|
||||||
<span class="k">return</span> <span class="nb">locals</span><span class="p">()</span>
|
<span class="k">return</span> <span class="nb">locals</span><span class="p">()</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">DEFS</span> <span class="o">=</span> <span class="n">defs</span><span class="p">()</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">DEFS</span> <span class="o">=</span> <span class="n">defs</span><span class="p">()</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">stack_effect_comment</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">DEFS</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">stack_effect_comment</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">DEFS</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
||||||
<span class="nb">print</span> <span class="n">name</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">stack_effect_comment</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">name</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">stack_effect_comment</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1250,27 +1250,27 @@ of how many labels of each domain it has “seen”.</p>
|
||||||
<span class="n">uncons</span> <span class="o">=</span> <span class="p">([</span><span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">])</span>
|
<span class="n">uncons</span> <span class="o">=</span> <span class="p">([</span><span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">globals</span><span class="p">()</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">DEFS</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">globals</span><span class="p">()</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">DEFS</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section id="compose-dup-and-mul">
|
<section id="compose-dup-and-mul">
|
||||||
<h4>Compose <code class="docutils literal notranslate"><span class="pre">dup</span></code> and <code class="docutils literal notranslate"><span class="pre">mul</span></code><a class="headerlink" href="#compose-dup-and-mul" title="Permalink to this headline">¶</a></h4>
|
<h4>Compose <code class="docutils literal notranslate"><span class="pre">dup</span></code> and <code class="docutils literal notranslate"><span class="pre">mul</span></code><a class="headerlink" href="#compose-dup-and-mul" title="Permalink to this headline">¶</a></h4>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">mul</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">mul</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">n1</span><span class="p">,),</span> <span class="p">(</span><span class="n">n2</span><span class="p">,))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">n1</span><span class="p">,),</span> <span class="p">(</span><span class="n">n2</span><span class="p">,))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Revisit the <code class="docutils literal notranslate"><span class="pre">F</span></code> function, works fine.</p>
|
<p>Revisit the <code class="docutils literal notranslate"><span class="pre">F</span></code> function, works fine.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">F</span> <span class="o">=</span> <span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">rolldown</span><span class="p">,</span> <span class="n">rest</span><span class="p">,</span> <span class="n">rest</span><span class="p">,</span> <span class="n">cons</span><span class="p">,</span> <span class="n">cons</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">F</span> <span class="o">=</span> <span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">rolldown</span><span class="p">,</span> <span class="n">rest</span><span class="p">,</span> <span class="n">rest</span><span class="p">,</span> <span class="n">cons</span><span class="p">,</span> <span class="n">cons</span><span class="p">))</span>
|
||||||
<span class="n">F</span>
|
<span class="n">F</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(((</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),</span> <span class="n">a3</span><span class="p">,</span> <span class="n">a4</span><span class="p">,</span> <span class="n">a5</span><span class="p">),</span> <span class="p">((</span><span class="n">a4</span><span class="p">,</span> <span class="p">(</span><span class="n">a3</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(((</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),</span> <span class="n">a3</span><span class="p">,</span> <span class="n">a4</span><span class="p">,</span> <span class="n">a5</span><span class="p">),</span> <span class="p">((</span><span class="n">a4</span><span class="p">,</span> <span class="p">(</span><span class="n">a3</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">F</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">F</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="n">a1</span> <span class="n">a2</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="n">a3</span> <span class="n">a4</span> <span class="n">a5</span> <span class="o">--</span> <span class="p">[</span><span class="n">a4</span> <span class="n">a3</span> <span class="o">.</span><span class="mf">1.</span><span class="p">])</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="n">a1</span> <span class="n">a2</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="n">a3</span> <span class="n">a4</span> <span class="n">a5</span> <span class="o">--</span> <span class="p">[</span><span class="n">a4</span> <span class="n">a3</span> <span class="o">.</span><span class="mf">1.</span><span class="p">])</span>
|
||||||
|
|
@ -1278,25 +1278,25 @@ of how many labels of each domain it has “seen”.</p>
|
||||||
</div>
|
</div>
|
||||||
<p>Some otherwise inefficient functions are no longer to be feared. We can
|
<p>Some otherwise inefficient functions are no longer to be feared. We can
|
||||||
also get the effect of combinators in some limited cases.</p>
|
also get the effect of combinators in some limited cases.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">neato</span><span class="p">(</span><span class="o">*</span><span class="n">funcs</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">neato</span><span class="p">(</span><span class="o">*</span><span class="n">funcs</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">funcs</span><span class="p">))</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">funcs</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># e.g. [swap] dip</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="c1"># e.g. [swap] dip</span>
|
||||||
<span class="n">neato</span><span class="p">(</span><span class="n">rollup</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">rolldown</span><span class="p">)</span>
|
<span class="n">neato</span><span class="p">(</span><span class="n">rollup</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">rolldown</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span> <span class="n">a2</span> <span class="n">a3</span> <span class="o">--</span> <span class="n">a2</span> <span class="n">a1</span> <span class="n">a3</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span> <span class="n">a2</span> <span class="n">a3</span> <span class="o">--</span> <span class="n">a2</span> <span class="n">a1</span> <span class="n">a3</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># e.g. [popop] dipd</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="c1"># e.g. [popop] dipd</span>
|
||||||
<span class="n">neato</span><span class="p">(</span><span class="n">popdd</span><span class="p">,</span> <span class="n">rolldown</span><span class="p">,</span> <span class="n">pop</span><span class="p">)</span>
|
<span class="n">neato</span><span class="p">(</span><span class="n">popdd</span><span class="p">,</span> <span class="n">rolldown</span><span class="p">,</span> <span class="n">pop</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span> <span class="n">a2</span> <span class="n">a3</span> <span class="n">a4</span> <span class="o">--</span> <span class="n">a3</span> <span class="n">a4</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span> <span class="n">a2</span> <span class="n">a3</span> <span class="n">a4</span> <span class="o">--</span> <span class="n">a3</span> <span class="n">a4</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># Reverse the order of the top three items.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Reverse the order of the top three items.</span>
|
||||||
<span class="n">neato</span><span class="p">(</span><span class="n">rollup</span><span class="p">,</span> <span class="n">swap</span><span class="p">)</span>
|
<span class="n">neato</span><span class="p">(</span><span class="n">rollup</span><span class="p">,</span> <span class="n">swap</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1308,7 +1308,7 @@ also get the effect of combinators in some limited cases.</p>
|
||||||
<h4><code class="docutils literal notranslate"><span class="pre">compile_()</span></code> version 2<a class="headerlink" href="#compile-version-2" title="Permalink to this headline">¶</a></h4>
|
<h4><code class="docutils literal notranslate"><span class="pre">compile_()</span></code> version 2<a class="headerlink" href="#compile-version-2" title="Permalink to this headline">¶</a></h4>
|
||||||
<p>Because the type labels represent themselves as valid Python identifiers
|
<p>Because the type labels represent themselves as valid Python identifiers
|
||||||
the <code class="docutils literal notranslate"><span class="pre">compile_()</span></code> function doesn’t need to generate them anymore:</p>
|
the <code class="docutils literal notranslate"><span class="pre">compile_()</span></code> function doesn’t need to generate them anymore:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compile_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compile_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||||
<span class="n">inputs</span><span class="p">,</span> <span class="n">outputs</span> <span class="o">=</span> <span class="n">f</span>
|
<span class="n">inputs</span><span class="p">,</span> <span class="n">outputs</span> <span class="o">=</span> <span class="n">f</span>
|
||||||
<span class="k">if</span> <span class="n">doc</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
<span class="k">if</span> <span class="n">doc</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
<span class="n">doc</span> <span class="o">=</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="n">inputs</span><span class="p">,</span> <span class="n">outputs</span><span class="p">)</span>
|
<span class="n">doc</span> <span class="o">=</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="n">inputs</span><span class="p">,</span> <span class="n">outputs</span><span class="p">)</span>
|
||||||
|
|
@ -1323,7 +1323,7 @@ the <code class="docutils literal notranslate"><span class="pre">compile_()</spa
|
||||||
<span class="s1"> return </span><span class="si">%s</span><span class="s1">'''</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">doc</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
|
<span class="s1"> return </span><span class="si">%s</span><span class="s1">'''</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">doc</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">compile_</span><span class="p">(</span><span class="s1">'F'</span><span class="p">,</span> <span class="n">F</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">compile_</span><span class="p">(</span><span class="s1">'F'</span><span class="p">,</span> <span class="n">F</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">F</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">F</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||||
|
|
@ -1334,7 +1334,7 @@ the <code class="docutils literal notranslate"><span class="pre">compile_()</spa
|
||||||
</div>
|
</div>
|
||||||
<p>But it cannot magically create new functions that involve e.g. math and
|
<p>But it cannot magically create new functions that involve e.g. math and
|
||||||
such. Note that this is <em>not</em> a <code class="docutils literal notranslate"><span class="pre">sqr</span></code> function implementation:</p>
|
such. Note that this is <em>not</em> a <code class="docutils literal notranslate"><span class="pre">sqr</span></code> function implementation:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">compile_</span><span class="p">(</span><span class="s1">'sqr'</span><span class="p">,</span> <span class="n">C</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">mul</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">compile_</span><span class="p">(</span><span class="s1">'sqr'</span><span class="p">,</span> <span class="n">C</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">mul</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">sqr</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">sqr</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||||
|
|
@ -1356,14 +1356,14 @@ functions (at least) are already wrappers it should be straightforward.)</p>
|
||||||
<p>The functions that <em>can</em> be compiled are the ones that have only
|
<p>The functions that <em>can</em> be compiled are the ones that have only
|
||||||
<code class="docutils literal notranslate"><span class="pre">AnyJoyType</span></code> and <code class="docutils literal notranslate"><span class="pre">StackJoyType</span></code> labels in their stack effect
|
<code class="docutils literal notranslate"><span class="pre">AnyJoyType</span></code> and <code class="docutils literal notranslate"><span class="pre">StackJoyType</span></code> labels in their stack effect
|
||||||
comments. We can write a function to check that:</p>
|
comments. We can write a function to check that:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">imap</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">imap</span>
|
||||||
|
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">compilable</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
|
<span class="k">def</span> <span class="nf">compilable</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
|
||||||
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">all</span><span class="p">(</span><span class="n">imap</span><span class="p">(</span><span class="n">compilable</span><span class="p">,</span> <span class="n">f</span><span class="p">))</span> <span class="ow">or</span> <span class="n">stacky</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">all</span><span class="p">(</span><span class="n">imap</span><span class="p">(</span><span class="n">compilable</span><span class="p">,</span> <span class="n">f</span><span class="p">))</span> <span class="ow">or</span> <span class="n">stacky</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">stack_effect_comment</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">defs</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">stack_effect_comment</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">defs</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
||||||
<span class="k">if</span> <span class="n">compilable</span><span class="p">(</span><span class="n">stack_effect_comment</span><span class="p">):</span>
|
<span class="k">if</span> <span class="n">compilable</span><span class="p">(</span><span class="n">stack_effect_comment</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">name</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">stack_effect_comment</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">name</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">stack_effect_comment</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -1465,7 +1465,7 @@ first two rules’ <code class="docutils literal notranslate"><span class="pre">
|
||||||
the “truthiness” of <code class="docutils literal notranslate"><span class="pre">StackJoyType</span></code> to false to let e.g.
|
the “truthiness” of <code class="docutils literal notranslate"><span class="pre">StackJoyType</span></code> to false to let e.g.
|
||||||
<code class="docutils literal notranslate"><span class="pre">joy.utils.stack.concat</span></code> work with our stack effect comment cons-list
|
<code class="docutils literal notranslate"><span class="pre">joy.utils.stack.concat</span></code> work with our stack effect comment cons-list
|
||||||
tuples.)</p>
|
tuples.)</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compose</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compose</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
|
||||||
<span class="p">(</span><span class="n">f_in</span><span class="p">,</span> <span class="n">f_out</span><span class="p">),</span> <span class="p">(</span><span class="n">g_in</span><span class="p">,</span> <span class="n">g_out</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span><span class="p">,</span> <span class="n">g</span>
|
<span class="p">(</span><span class="n">f_in</span><span class="p">,</span> <span class="n">f_out</span><span class="p">),</span> <span class="p">(</span><span class="n">g_in</span><span class="p">,</span> <span class="n">g_out</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span><span class="p">,</span> <span class="n">g</span>
|
||||||
<span class="n">s</span> <span class="o">=</span> <span class="n">unify</span><span class="p">(</span><span class="n">g_in</span><span class="p">,</span> <span class="n">f_out</span><span class="p">)</span>
|
<span class="n">s</span> <span class="o">=</span> <span class="n">unify</span><span class="p">(</span><span class="n">g_in</span><span class="p">,</span> <span class="n">f_out</span><span class="p">)</span>
|
||||||
<span class="k">if</span> <span class="n">s</span> <span class="o">==</span> <span class="kc">False</span><span class="p">:</span> <span class="c1"># s can also be the empty dict, which is ok.</span>
|
<span class="k">if</span> <span class="n">s</span> <span class="o">==</span> <span class="kc">False</span><span class="p">:</span> <span class="c1"># s can also be the empty dict, which is ok.</span>
|
||||||
|
|
@ -1475,7 +1475,7 @@ tuples.)</p>
|
||||||
</div>
|
</div>
|
||||||
<p>I don’t want to rewrite all the defs myself, so I’ll write a little
|
<p>I don’t want to rewrite all the defs myself, so I’ll write a little
|
||||||
conversion function instead. This is programmer’s laziness.</p>
|
conversion function instead. This is programmer’s laziness.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">sequence_to_stack</span><span class="p">(</span><span class="n">seq</span><span class="p">,</span> <span class="n">stack</span><span class="o">=</span><span class="n">StackJoyType</span><span class="p">(</span><span class="mi">23</span><span class="p">)):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">sequence_to_stack</span><span class="p">(</span><span class="n">seq</span><span class="p">,</span> <span class="n">stack</span><span class="o">=</span><span class="n">StackJoyType</span><span class="p">(</span><span class="mi">23</span><span class="p">)):</span>
|
||||||
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">seq</span><span class="p">:</span> <span class="n">stack</span> <span class="o">=</span> <span class="n">item</span><span class="p">,</span> <span class="n">stack</span>
|
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">seq</span><span class="p">:</span> <span class="n">stack</span> <span class="o">=</span> <span class="n">item</span><span class="p">,</span> <span class="n">stack</span>
|
||||||
<span class="k">return</span> <span class="n">stack</span>
|
<span class="k">return</span> <span class="n">stack</span>
|
||||||
|
|
||||||
|
|
@ -1488,13 +1488,13 @@ conversion function instead. This is programmer’s laziness.</p>
|
||||||
<span class="nb">globals</span><span class="p">()</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">NEW_DEFS</span><span class="p">)</span>
|
<span class="nb">globals</span><span class="p">()</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">NEW_DEFS</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">uncons</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">uncons</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">a1</span><span class="p">,</span> <span class="n">s1</span><span class="p">),</span> <span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s1</span><span class="p">))))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">a1</span><span class="p">,</span> <span class="n">s1</span><span class="p">),</span> <span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s1</span><span class="p">))))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">uncons</span><span class="p">,</span> <span class="n">uncons</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">uncons</span><span class="p">,</span> <span class="n">uncons</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),</span> <span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">s1</span><span class="p">))))))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),</span> <span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">s1</span><span class="p">))))))</span>
|
||||||
|
|
@ -1506,7 +1506,7 @@ conversion function instead. This is programmer’s laziness.</p>
|
||||||
<section id="doc-from-stack-effect-version-2">
|
<section id="doc-from-stack-effect-version-2">
|
||||||
<h3><code class="docutils literal notranslate"><span class="pre">doc_from_stack_effect()</span></code> version 2<a class="headerlink" href="#doc-from-stack-effect-version-2" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal notranslate"><span class="pre">doc_from_stack_effect()</span></code> version 2<a class="headerlink" href="#doc-from-stack-effect-version-2" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>Clunky junk, but it will suffice for now.</p>
|
<p>Clunky junk, but it will suffice for now.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">doc_from_stack_effect</span><span class="p">(</span><span class="n">inputs</span><span class="p">,</span> <span class="n">outputs</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">doc_from_stack_effect</span><span class="p">(</span><span class="n">inputs</span><span class="p">,</span> <span class="n">outputs</span><span class="p">):</span>
|
||||||
<span class="n">switch</span> <span class="o">=</span> <span class="p">[</span><span class="kc">False</span><span class="p">]</span> <span class="c1"># Do we need to display the '...' for the rest of the main stack?</span>
|
<span class="n">switch</span> <span class="o">=</span> <span class="p">[</span><span class="kc">False</span><span class="p">]</span> <span class="c1"># Do we need to display the '...' for the rest of the main stack?</span>
|
||||||
<span class="n">i</span><span class="p">,</span> <span class="n">o</span> <span class="o">=</span> <span class="n">_f</span><span class="p">(</span><span class="n">inputs</span><span class="p">,</span> <span class="n">switch</span><span class="p">),</span> <span class="n">_f</span><span class="p">(</span><span class="n">outputs</span><span class="p">,</span> <span class="n">switch</span><span class="p">)</span>
|
<span class="n">i</span><span class="p">,</span> <span class="n">o</span> <span class="o">=</span> <span class="n">_f</span><span class="p">(</span><span class="n">inputs</span><span class="p">,</span> <span class="n">switch</span><span class="p">),</span> <span class="n">_f</span><span class="p">(</span><span class="n">outputs</span><span class="p">,</span> <span class="n">switch</span><span class="p">)</span>
|
||||||
<span class="k">if</span> <span class="n">switch</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
|
<span class="k">if</span> <span class="n">switch</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
|
||||||
|
|
@ -1553,7 +1553,7 @@ conversion function instead. This is programmer’s laziness.</p>
|
||||||
<span class="k">return</span> <span class="s1">'[</span><span class="si">%s</span><span class="s1">]'</span> <span class="o">%</span> <span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
|
<span class="k">return</span> <span class="s1">'[</span><span class="si">%s</span><span class="s1">]'</span> <span class="o">%</span> <span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">stack_effect_comment</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">NEW_DEFS</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">stack_effect_comment</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">NEW_DEFS</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
||||||
<span class="nb">print</span> <span class="n">name</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">stack_effect_comment</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">name</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">stack_effect_comment</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1587,7 +1587,7 @@ conversion function instead. This is programmer’s laziness.</p>
|
||||||
<span class="n">uncons</span> <span class="o">=</span> <span class="p">([</span><span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">])</span>
|
<span class="n">uncons</span> <span class="o">=</span> <span class="p">([</span><span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="p">;</span> <span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">stack</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="p">;</span> <span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">stack</span><span class="p">)</span>
|
||||||
<span class="nb">print</span> <span class="p">;</span> <span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">C</span><span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">uncons</span><span class="p">))</span>
|
<span class="nb">print</span> <span class="p">;</span> <span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">C</span><span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">uncons</span><span class="p">))</span>
|
||||||
<span class="nb">print</span> <span class="p">;</span> <span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">uncons</span><span class="p">,</span> <span class="n">uncons</span><span class="p">)))</span>
|
<span class="nb">print</span> <span class="p">;</span> <span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">uncons</span><span class="p">,</span> <span class="n">uncons</span><span class="p">)))</span>
|
||||||
<span class="nb">print</span> <span class="p">;</span> <span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">uncons</span><span class="p">,</span> <span class="n">cons</span><span class="p">)))</span>
|
<span class="nb">print</span> <span class="p">;</span> <span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">reduce</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">uncons</span><span class="p">,</span> <span class="n">cons</span><span class="p">)))</span>
|
||||||
|
|
@ -1602,13 +1602,13 @@ conversion function instead. This is programmer’s laziness.</p>
|
||||||
<span class="p">(</span><span class="o">...</span> <span class="n">a1</span> <span class="o">--</span> <span class="o">...</span> <span class="n">a1</span> <span class="p">[</span><span class="n">a1</span> <span class="o">...</span><span class="p">])</span>
|
<span class="p">(</span><span class="o">...</span> <span class="n">a1</span> <span class="o">--</span> <span class="o">...</span> <span class="n">a1</span> <span class="p">[</span><span class="n">a1</span> <span class="o">...</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">C</span><span class="p">(</span><span class="n">ccons</span><span class="p">,</span> <span class="n">stack</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">C</span><span class="p">(</span><span class="n">ccons</span><span class="p">,</span> <span class="n">stack</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">...</span> <span class="n">a2</span> <span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="o">...</span> <span class="p">[</span><span class="n">a2</span> <span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="p">[[</span><span class="n">a2</span> <span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">...</span><span class="p">])</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">...</span> <span class="n">a2</span> <span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="o">...</span> <span class="p">[</span><span class="n">a2</span> <span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="p">[[</span><span class="n">a2</span> <span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">...</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">Q</span> <span class="o">=</span> <span class="n">C</span><span class="p">(</span><span class="n">ccons</span><span class="p">,</span> <span class="n">stack</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">Q</span> <span class="o">=</span> <span class="n">C</span><span class="p">(</span><span class="n">ccons</span><span class="p">,</span> <span class="n">stack</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="n">Q</span>
|
<span class="n">Q</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -1620,7 +1620,7 @@ conversion function instead. This is programmer’s laziness.</p>
|
||||||
<h4><code class="docutils literal notranslate"><span class="pre">compile_()</span></code> version 3<a class="headerlink" href="#compile-version-3" title="Permalink to this headline">¶</a></h4>
|
<h4><code class="docutils literal notranslate"><span class="pre">compile_()</span></code> version 3<a class="headerlink" href="#compile-version-3" title="Permalink to this headline">¶</a></h4>
|
||||||
<p>This makes the <code class="docutils literal notranslate"><span class="pre">compile_()</span></code> function pretty simple as the stack effect
|
<p>This makes the <code class="docutils literal notranslate"><span class="pre">compile_()</span></code> function pretty simple as the stack effect
|
||||||
comments are now already in the form needed for the Python code:</p>
|
comments are now already in the form needed for the Python code:</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compile_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compile_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||||
<span class="n">i</span><span class="p">,</span> <span class="n">o</span> <span class="o">=</span> <span class="n">f</span>
|
<span class="n">i</span><span class="p">,</span> <span class="n">o</span> <span class="o">=</span> <span class="n">f</span>
|
||||||
<span class="k">if</span> <span class="n">doc</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
<span class="k">if</span> <span class="n">doc</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
<span class="n">doc</span> <span class="o">=</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
|
<span class="n">doc</span> <span class="o">=</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
|
||||||
|
|
@ -1630,7 +1630,7 @@ comments are now already in the form needed for the Python code:</p>
|
||||||
<span class="s1"> return </span><span class="si">%s</span><span class="s1">'''</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">doc</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
|
<span class="s1"> return </span><span class="si">%s</span><span class="s1">'''</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">doc</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">compile_</span><span class="p">(</span><span class="s1">'Q'</span><span class="p">,</span> <span class="n">Q</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">compile_</span><span class="p">(</span><span class="s1">'Q'</span><span class="p">,</span> <span class="n">Q</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">Q</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">Q</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||||
|
|
@ -1639,35 +1639,35 @@ comments are now already in the form needed for the Python code:</p>
|
||||||
<span class="k">return</span> <span class="p">(((</span><span class="n">a2</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),</span> <span class="n">s2</span><span class="p">),</span> <span class="p">((</span><span class="n">a2</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),</span> <span class="n">s2</span><span class="p">))</span>
|
<span class="k">return</span> <span class="p">(((</span><span class="n">a2</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),</span> <span class="n">s2</span><span class="p">),</span> <span class="p">((</span><span class="n">a2</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),</span> <span class="n">s2</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">unstack</span> <span class="o">=</span> <span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">unstack</span> <span class="o">=</span> <span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
||||||
<span class="n">enstacken</span> <span class="o">=</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
<span class="n">enstacken</span> <span class="o">=</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">unstack</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">unstack</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">enstacken</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">enstacken</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">--</span> <span class="p">[</span><span class="o">.</span><span class="mf">0.</span><span class="p">])</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">--</span> <span class="p">[</span><span class="o">.</span><span class="mf">0.</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">C</span><span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="n">unstack</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">C</span><span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="n">unstack</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">a1</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">a1</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">C</span><span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="n">enstacken</span><span class="p">))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">C</span><span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="n">enstacken</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="p">[[</span><span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">.</span><span class="mf">2.</span><span class="p">])</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="p">[[</span><span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">.</span><span class="mf">2.</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="n">unstack</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="n">unstack</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">s1</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s2</span><span class="p">)),</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s1</span><span class="p">))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="n">s1</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s2</span><span class="p">)),</span> <span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s1</span><span class="p">))</span>
|
||||||
|
|
@ -1679,14 +1679,14 @@ comments are now already in the form needed for the Python code:</p>
|
||||||
<section id="part-vi-multiple-stack-effects">
|
<section id="part-vi-multiple-stack-effects">
|
||||||
<h2>Part VI: Multiple Stack Effects<a class="headerlink" href="#part-vi-multiple-stack-effects" title="Permalink to this headline">¶</a></h2>
|
<h2>Part VI: Multiple Stack Effects<a class="headerlink" href="#part-vi-multiple-stack-effects" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>…</p>
|
<p>…</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">IntJoyType</span><span class="p">(</span><span class="n">NumberJoyType</span><span class="p">):</span> <span class="n">prefix</span> <span class="o">=</span> <span class="s1">'i'</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">IntJoyType</span><span class="p">(</span><span class="n">NumberJoyType</span><span class="p">):</span> <span class="n">prefix</span> <span class="o">=</span> <span class="s1">'i'</span>
|
||||||
|
|
||||||
|
|
||||||
<span class="n">F</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">FloatJoyType</span><span class="p">,</span> <span class="n">_R</span><span class="p">)</span>
|
<span class="n">F</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">FloatJoyType</span><span class="p">,</span> <span class="n">_R</span><span class="p">)</span>
|
||||||
<span class="n">I</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">IntJoyType</span><span class="p">,</span> <span class="n">_R</span><span class="p">)</span>
|
<span class="n">I</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">IntJoyType</span><span class="p">,</span> <span class="n">_R</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">muls</span> <span class="o">=</span> <span class="p">[</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">muls</span> <span class="o">=</span> <span class="p">[</span>
|
||||||
<span class="p">((</span><span class="n">I</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="p">(</span><span class="n">I</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span> <span class="p">(</span><span class="n">I</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span>
|
<span class="p">((</span><span class="n">I</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="p">(</span><span class="n">I</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span> <span class="p">(</span><span class="n">I</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span>
|
||||||
<span class="p">((</span><span class="n">F</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="p">(</span><span class="n">I</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span> <span class="p">(</span><span class="n">F</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span>
|
<span class="p">((</span><span class="n">F</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="p">(</span><span class="n">I</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span> <span class="p">(</span><span class="n">F</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span>
|
||||||
<span class="p">((</span><span class="n">I</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="p">(</span><span class="n">F</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span> <span class="p">(</span><span class="n">F</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span>
|
<span class="p">((</span><span class="n">I</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="p">(</span><span class="n">F</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span> <span class="p">(</span><span class="n">F</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span>
|
||||||
|
|
@ -1694,7 +1694,7 @@ comments are now already in the form needed for the Python code:</p>
|
||||||
<span class="p">]</span>
|
<span class="p">]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">muls</span><span class="p">:</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">muls</span><span class="p">:</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1704,7 +1704,7 @@ comments are now already in the form needed for the Python code:</p>
|
||||||
<span class="p">(</span><span class="n">f1</span> <span class="n">f2</span> <span class="o">--</span> <span class="n">f3</span><span class="p">)</span>
|
<span class="p">(</span><span class="n">f1</span> <span class="n">f2</span> <span class="o">--</span> <span class="n">f3</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">muls</span><span class="p">:</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">muls</span><span class="p">:</span>
|
||||||
<span class="k">try</span><span class="p">:</span>
|
<span class="k">try</span><span class="p">:</span>
|
||||||
<span class="n">e</span> <span class="o">=</span> <span class="n">C</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
|
<span class="n">e</span> <span class="o">=</span> <span class="n">C</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
|
||||||
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
|
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
|
||||||
|
|
@ -1716,7 +1716,7 @@ comments are now already in the form needed for the Python code:</p>
|
||||||
<span class="p">(</span><span class="n">a1</span> <span class="o">--</span> <span class="n">a1</span> <span class="n">a1</span><span class="p">)</span> <span class="p">(</span><span class="n">f1</span> <span class="n">f2</span> <span class="o">--</span> <span class="n">f3</span><span class="p">)</span> <span class="p">(</span><span class="n">f1</span> <span class="o">--</span> <span class="n">f2</span><span class="p">)</span>
|
<span class="p">(</span><span class="n">a1</span> <span class="o">--</span> <span class="n">a1</span> <span class="n">a1</span><span class="p">)</span> <span class="p">(</span><span class="n">f1</span> <span class="n">f2</span> <span class="o">--</span> <span class="n">f3</span><span class="p">)</span> <span class="p">(</span><span class="n">f1</span> <span class="o">--</span> <span class="n">f2</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">product</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">product</span>
|
||||||
|
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">meta_compose</span><span class="p">(</span><span class="n">F</span><span class="p">,</span> <span class="n">G</span><span class="p">):</span>
|
<span class="k">def</span> <span class="nf">meta_compose</span><span class="p">(</span><span class="n">F</span><span class="p">,</span> <span class="n">G</span><span class="p">):</span>
|
||||||
|
|
@ -1731,14 +1731,14 @@ comments are now already in the form needed for the Python code:</p>
|
||||||
<span class="k">return</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">meta_compose</span><span class="p">(</span><span class="n">F</span><span class="p">,</span> <span class="n">G</span><span class="p">)))</span>
|
<span class="k">return</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">meta_compose</span><span class="p">(</span><span class="n">F</span><span class="p">,</span> <span class="n">G</span><span class="p">)))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">MC</span><span class="p">([</span><span class="n">dup</span><span class="p">],</span> <span class="p">[</span><span class="n">mul</span><span class="p">]):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">MC</span><span class="p">([</span><span class="n">dup</span><span class="p">],</span> <span class="p">[</span><span class="n">mul</span><span class="p">]):</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">n1</span> <span class="o">--</span> <span class="n">n2</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">n1</span> <span class="o">--</span> <span class="n">n2</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">MC</span><span class="p">([</span><span class="n">dup</span><span class="p">],</span> <span class="n">muls</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">MC</span><span class="p">([</span><span class="n">dup</span><span class="p">],</span> <span class="n">muls</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1793,7 +1793,7 @@ disappears:</p>
|
||||||
<span class="p">{</span><span class="n">c</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="n">d</span><span class="p">:</span> <span class="n">e</span><span class="p">,</span> <span class="o">.</span><span class="mf">1.</span><span class="p">:</span> <span class="n">A</span><span class="o">*</span> <span class="n">b</span> <span class="o">.</span><span class="mf">0.</span><span class="p">}</span>
|
<span class="p">{</span><span class="n">c</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="n">d</span><span class="p">:</span> <span class="n">e</span><span class="p">,</span> <span class="o">.</span><span class="mf">1.</span><span class="p">:</span> <span class="n">A</span><span class="o">*</span> <span class="n">b</span> <span class="o">.</span><span class="mf">0.</span><span class="p">}</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">KleeneStar</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">KleeneStar</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
||||||
|
|
||||||
<span class="n">kind</span> <span class="o">=</span> <span class="n">AnyJoyType</span>
|
<span class="n">kind</span> <span class="o">=</span> <span class="n">AnyJoyType</span>
|
||||||
|
|
||||||
|
|
@ -1840,7 +1840,7 @@ disappears:</p>
|
||||||
<section id="unify-version-4">
|
<section id="unify-version-4">
|
||||||
<h4><code class="docutils literal notranslate"><span class="pre">unify()</span></code> version 4<a class="headerlink" href="#unify-version-4" title="Permalink to this headline">¶</a></h4>
|
<h4><code class="docutils literal notranslate"><span class="pre">unify()</span></code> version 4<a class="headerlink" href="#unify-version-4" title="Permalink to this headline">¶</a></h4>
|
||||||
<p>Can now return multiple results…</p>
|
<p>Can now return multiple results…</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">unify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">unify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||||
<span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
<span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
<span class="n">s</span> <span class="o">=</span> <span class="p">{}</span>
|
<span class="n">s</span> <span class="o">=</span> <span class="p">{}</span>
|
||||||
<span class="k">elif</span> <span class="n">s</span><span class="p">:</span>
|
<span class="k">elif</span> <span class="n">s</span><span class="p">:</span>
|
||||||
|
|
@ -1911,21 +1911,21 @@ disappears:</p>
|
||||||
<span class="k">return</span> <span class="n">thing</span><span class="o">.</span><span class="vm">__class__</span> <span class="ow">in</span> <span class="p">{</span><span class="n">AnyJoyType</span><span class="p">,</span> <span class="n">StackJoyType</span><span class="p">}</span>
|
<span class="k">return</span> <span class="n">thing</span><span class="o">.</span><span class="vm">__class__</span> <span class="ow">in</span> <span class="p">{</span><span class="n">AnyJoyType</span><span class="p">,</span> <span class="n">StackJoyType</span><span class="p">}</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">As</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">As</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
||||||
<span class="n">a</span>
|
<span class="n">a</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
||||||
<span class="n">b</span>
|
<span class="n">b</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s2</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">s2</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">unify</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">unify</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">result</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">a</span><span class="p">),</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">result</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">a</span><span class="p">),</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1933,7 +1933,7 @@ disappears:</p>
|
||||||
<span class="p">{</span><span class="n">a1</span><span class="p">:</span> <span class="n">a10001</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">)}</span> <span class="o">-></span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">)</span> <span class="p">(</span><span class="n">a10001</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">))</span>
|
<span class="p">{</span><span class="n">a1</span><span class="p">:</span> <span class="n">a10001</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">)}</span> <span class="o">-></span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">)</span> <span class="p">(</span><span class="n">a10001</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">unify</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">unify</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">result</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">a</span><span class="p">),</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">result</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">a</span><span class="p">),</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1948,7 +1948,7 @@ disappears:</p>
|
||||||
<span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">)</span> <span class="p">[</span><span class="n">a1</span><span class="o">*</span><span class="p">]</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">))</span> <span class="p">[</span><span class="n">a2</span> <span class="n">a1</span><span class="o">*</span><span class="p">]</span>
|
<span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">)</span> <span class="p">[</span><span class="n">a1</span><span class="o">*</span><span class="p">]</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="n">s1</span><span class="p">))</span> <span class="p">[</span><span class="n">a2</span> <span class="n">a1</span><span class="o">*</span><span class="p">]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sum_</span> <span class="o">=</span> <span class="p">((</span><span class="n">Ns</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">sum_</span> <span class="o">=</span> <span class="p">((</span><span class="n">Ns</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
||||||
|
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">sum_</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">sum_</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -1956,7 +1956,7 @@ disappears:</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">n0</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">n0</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">f</span> <span class="o">=</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">]))),</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">f</span> <span class="o">=</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">]))),</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
|
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">f</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">f</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -1964,7 +1964,7 @@ disappears:</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">--</span> <span class="p">[</span><span class="n">n1</span> <span class="n">n2</span> <span class="n">n3</span> <span class="o">.</span><span class="mf">1.</span><span class="p">])</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">--</span> <span class="p">[</span><span class="n">n1</span> <span class="n">n2</span> <span class="n">n3</span> <span class="o">.</span><span class="mf">1.</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">unify</span><span class="p">(</span><span class="n">sum_</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">f</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">unify</span><span class="p">(</span><span class="n">sum_</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">f</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">result</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">sum_</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
<span class="nb">print</span> <span class="n">result</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">sum_</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1978,7 +1978,7 @@ disappears:</p>
|
||||||
<section id="compose-version-3">
|
<section id="compose-version-3">
|
||||||
<h4><code class="docutils literal notranslate"><span class="pre">compose()</span></code> version 3<a class="headerlink" href="#compose-version-3" title="Permalink to this headline">¶</a></h4>
|
<h4><code class="docutils literal notranslate"><span class="pre">compose()</span></code> version 3<a class="headerlink" href="#compose-version-3" title="Permalink to this headline">¶</a></h4>
|
||||||
<p>This function has to be modified to yield multiple results.</p>
|
<p>This function has to be modified to yield multiple results.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compose</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">compose</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
|
||||||
<span class="p">(</span><span class="n">f_in</span><span class="p">,</span> <span class="n">f_out</span><span class="p">),</span> <span class="p">(</span><span class="n">g_in</span><span class="p">,</span> <span class="n">g_out</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span><span class="p">,</span> <span class="n">g</span>
|
<span class="p">(</span><span class="n">f_in</span><span class="p">,</span> <span class="n">f_out</span><span class="p">),</span> <span class="p">(</span><span class="n">g_in</span><span class="p">,</span> <span class="n">g_out</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span><span class="p">,</span> <span class="n">g</span>
|
||||||
<span class="n">s</span> <span class="o">=</span> <span class="n">unify</span><span class="p">(</span><span class="n">g_in</span><span class="p">,</span> <span class="n">f_out</span><span class="p">)</span>
|
<span class="n">s</span> <span class="o">=</span> <span class="n">unify</span><span class="p">(</span><span class="n">g_in</span><span class="p">,</span> <span class="n">f_out</span><span class="p">)</span>
|
||||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">s</span><span class="p">:</span>
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">s</span><span class="p">:</span>
|
||||||
|
|
@ -1987,7 +1987,7 @@ disappears:</p>
|
||||||
<span class="k">yield</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="p">(</span><span class="n">f_in</span><span class="p">,</span> <span class="n">g_out</span><span class="p">))</span>
|
<span class="k">yield</span> <span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="p">(</span><span class="n">f_in</span><span class="p">,</span> <span class="n">g_out</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">meta_compose</span><span class="p">(</span><span class="n">F</span><span class="p">,</span> <span class="n">G</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">meta_compose</span><span class="p">(</span><span class="n">F</span><span class="p">,</span> <span class="n">G</span><span class="p">):</span>
|
||||||
<span class="k">for</span> <span class="n">f</span><span class="p">,</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">product</span><span class="p">(</span><span class="n">F</span><span class="p">,</span> <span class="n">G</span><span class="p">):</span>
|
<span class="k">for</span> <span class="n">f</span><span class="p">,</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">product</span><span class="p">(</span><span class="n">F</span><span class="p">,</span> <span class="n">G</span><span class="p">):</span>
|
||||||
<span class="k">try</span><span class="p">:</span>
|
<span class="k">try</span><span class="p">:</span>
|
||||||
<span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">C</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
|
<span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">C</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
|
||||||
|
|
@ -2002,7 +2002,7 @@ disappears:</p>
|
||||||
<span class="k">yield</span> <span class="n">delabel</span><span class="p">(</span><span class="n">fg</span><span class="p">)</span>
|
<span class="k">yield</span> <span class="n">delabel</span><span class="p">(</span><span class="n">fg</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">MC</span><span class="p">([</span><span class="n">dup</span><span class="p">],</span> <span class="n">muls</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">MC</span><span class="p">([</span><span class="n">dup</span><span class="p">],</span> <span class="n">muls</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -2010,14 +2010,14 @@ disappears:</p>
|
||||||
<span class="p">(</span><span class="n">i1</span> <span class="o">--</span> <span class="n">i2</span><span class="p">)</span>
|
<span class="p">(</span><span class="n">i1</span> <span class="o">--</span> <span class="n">i2</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">MC</span><span class="p">([</span><span class="n">dup</span><span class="p">],</span> <span class="p">[</span><span class="n">sum_</span><span class="p">]):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">MC</span><span class="p">([</span><span class="n">dup</span><span class="p">],</span> <span class="p">[</span><span class="n">sum_</span><span class="p">]):</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="p">[</span><span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="n">n1</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="p">[</span><span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="n">n1</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">MC</span><span class="p">([</span><span class="n">cons</span><span class="p">],</span> <span class="p">[</span><span class="n">sum_</span><span class="p">]):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">MC</span><span class="p">([</span><span class="n">cons</span><span class="p">],</span> <span class="p">[</span><span class="n">sum_</span><span class="p">]):</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -2025,7 +2025,7 @@ disappears:</p>
|
||||||
<span class="p">(</span><span class="n">n1</span> <span class="p">[</span><span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">n2</span><span class="p">)</span>
|
<span class="p">(</span><span class="n">n1</span> <span class="p">[</span><span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">n2</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sum_</span> <span class="o">=</span> <span class="p">(((</span><span class="n">N</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="p">(</span><span class="n">Ns</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">])),</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">sum_</span> <span class="o">=</span> <span class="p">(((</span><span class="n">N</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="p">(</span><span class="n">Ns</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">])),</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="p">(</span><span class="n">N</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">cons</span><span class="p">),</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">cons</span><span class="p">),</span>
|
||||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">sum_</span><span class="p">),</span>
|
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">sum_</span><span class="p">),</span>
|
||||||
|
|
||||||
|
|
@ -2036,21 +2036,21 @@ disappears:</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="p">[</span><span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">])</span> <span class="p">([</span><span class="n">n1</span> <span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">n0</span><span class="p">)</span> <span class="p">(</span><span class="n">n1</span> <span class="p">[</span><span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">n2</span><span class="p">)</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span> <span class="p">[</span><span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="p">[</span><span class="n">a1</span> <span class="o">.</span><span class="mf">1.</span><span class="p">])</span> <span class="p">([</span><span class="n">n1</span> <span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">n0</span><span class="p">)</span> <span class="p">(</span><span class="n">n1</span> <span class="p">[</span><span class="n">n1</span><span class="o">*</span> <span class="o">.</span><span class="mf">1.</span><span class="p">]</span> <span class="o">--</span> <span class="n">n2</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span> <span class="p">(</span><span class="n">As</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">])))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span> <span class="p">(</span><span class="n">As</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">1</span><span class="p">])))</span>
|
||||||
<span class="n">a</span>
|
<span class="n">a</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a4</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="p">(</span><span class="n">a3</span><span class="p">,</span> <span class="n">s1</span><span class="p">)))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a4</span><span class="p">,</span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="p">(</span><span class="n">a3</span><span class="p">,</span> <span class="n">s1</span><span class="p">)))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span>
|
||||||
<span class="n">b</span>
|
<span class="n">b</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">s2</span><span class="p">))</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">s2</span><span class="p">))</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">unify</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">unify</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">result</span>
|
<span class="nb">print</span> <span class="n">result</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -2058,7 +2058,7 @@ disappears:</p>
|
||||||
<span class="p">{</span><span class="n">a1</span><span class="p">:</span> <span class="n">a4</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="p">(</span><span class="n">a3</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),</span> <span class="n">a2</span><span class="p">:</span> <span class="n">a10003</span><span class="p">}</span>
|
<span class="p">{</span><span class="n">a1</span><span class="p">:</span> <span class="n">a4</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="p">(</span><span class="n">a1</span><span class="o">*</span><span class="p">,</span> <span class="p">(</span><span class="n">a3</span><span class="p">,</span> <span class="n">s1</span><span class="p">)),</span> <span class="n">a2</span><span class="p">:</span> <span class="n">a10003</span><span class="p">}</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">unify</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">unify</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
||||||
<span class="nb">print</span> <span class="n">result</span>
|
<span class="nb">print</span> <span class="n">result</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -2111,7 +2111,7 @@ stack effect we have to “split universes” again and return both.</p>
|
||||||
<p>We need a type variable for Joy functions that can go in our expressions
|
<p>We need a type variable for Joy functions that can go in our expressions
|
||||||
and be used by the hybrid inferencer/interpreter. They have to store a
|
and be used by the hybrid inferencer/interpreter. They have to store a
|
||||||
name and a list of stack effects.</p>
|
name and a list of stack effects.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">FunctionJoyType</span><span class="p">(</span><span class="n">AnyJoyType</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">FunctionJoyType</span><span class="p">(</span><span class="n">AnyJoyType</span><span class="p">):</span>
|
||||||
|
|
||||||
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sec</span><span class="p">,</span> <span class="n">number</span><span class="p">):</span>
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sec</span><span class="p">,</span> <span class="n">number</span><span class="p">):</span>
|
||||||
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
||||||
|
|
@ -2131,12 +2131,12 @@ name and a list of stack effects.</p>
|
||||||
<h4>Specialized for Simple Functions and Combinators<a class="headerlink" href="#specialized-for-simple-functions-and-combinators" title="Permalink to this headline">¶</a></h4>
|
<h4>Specialized for Simple Functions and Combinators<a class="headerlink" href="#specialized-for-simple-functions-and-combinators" title="Permalink to this headline">¶</a></h4>
|
||||||
<p>For non-combinator functions the stack effects list contains stack
|
<p>For non-combinator functions the stack effects list contains stack
|
||||||
effect comments (represented by pairs of cons-lists as described above.)</p>
|
effect comments (represented by pairs of cons-lists as described above.)</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">SymbolJoyType</span><span class="p">(</span><span class="n">FunctionJoyType</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">SymbolJoyType</span><span class="p">(</span><span class="n">FunctionJoyType</span><span class="p">):</span>
|
||||||
<span class="n">prefix</span> <span class="o">=</span> <span class="s1">'F'</span>
|
<span class="n">prefix</span> <span class="o">=</span> <span class="s1">'F'</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>For combinators the list contains Python functions.</p>
|
<p>For combinators the list contains Python functions.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">CombinatorJoyType</span><span class="p">(</span><span class="n">FunctionJoyType</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">CombinatorJoyType</span><span class="p">(</span><span class="n">FunctionJoyType</span><span class="p">):</span>
|
||||||
|
|
||||||
<span class="n">prefix</span> <span class="o">=</span> <span class="s1">'C'</span>
|
<span class="n">prefix</span> <span class="o">=</span> <span class="s1">'C'</span>
|
||||||
|
|
||||||
|
|
@ -2155,7 +2155,7 @@ effect comments (represented by pairs of cons-lists as described above.)</p>
|
||||||
</div>
|
</div>
|
||||||
<p>For simple combinators that have only one effect (like <code class="docutils literal notranslate"><span class="pre">dip</span></code>) you only
|
<p>For simple combinators that have only one effect (like <code class="docutils literal notranslate"><span class="pre">dip</span></code>) you only
|
||||||
need one function and it can be the combinator itself.</p>
|
need one function and it can be the combinator itself.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">joy.library</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">joy.library</span>
|
||||||
|
|
||||||
<span class="n">dip</span> <span class="o">=</span> <span class="n">CombinatorJoyType</span><span class="p">(</span><span class="s1">'dip'</span><span class="p">,</span> <span class="p">[</span><span class="n">joy</span><span class="o">.</span><span class="n">library</span><span class="o">.</span><span class="n">dip</span><span class="p">],</span> <span class="mi">23</span><span class="p">)</span>
|
<span class="n">dip</span> <span class="o">=</span> <span class="n">CombinatorJoyType</span><span class="p">(</span><span class="s1">'dip'</span><span class="p">,</span> <span class="p">[</span><span class="n">joy</span><span class="o">.</span><span class="n">library</span><span class="o">.</span><span class="n">dip</span><span class="p">],</span> <span class="mi">23</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
@ -2163,7 +2163,7 @@ need one function and it can be the combinator itself.</p>
|
||||||
<p>For combinators that can have more than one effect (like <code class="docutils literal notranslate"><span class="pre">branch</span></code>) you
|
<p>For combinators that can have more than one effect (like <code class="docutils literal notranslate"><span class="pre">branch</span></code>) you
|
||||||
have to write functions that each implement the action of one of the
|
have to write functions that each implement the action of one of the
|
||||||
effects.</p>
|
effects.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">branch_true</span><span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">dictionary</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">branch_true</span><span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">dictionary</span><span class="p">):</span>
|
||||||
<span class="p">(</span><span class="n">then</span><span class="p">,</span> <span class="p">(</span><span class="n">else_</span><span class="p">,</span> <span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="n">stack</span><span class="p">)))</span> <span class="o">=</span> <span class="n">stack</span>
|
<span class="p">(</span><span class="n">then</span><span class="p">,</span> <span class="p">(</span><span class="n">else_</span><span class="p">,</span> <span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="n">stack</span><span class="p">)))</span> <span class="o">=</span> <span class="n">stack</span>
|
||||||
<span class="k">return</span> <span class="n">stack</span><span class="p">,</span> <span class="n">concat</span><span class="p">(</span><span class="n">then</span><span class="p">,</span> <span class="n">expression</span><span class="p">),</span> <span class="n">dictionary</span>
|
<span class="k">return</span> <span class="n">stack</span><span class="p">,</span> <span class="n">concat</span><span class="p">(</span><span class="n">then</span><span class="p">,</span> <span class="n">expression</span><span class="p">),</span> <span class="n">dictionary</span>
|
||||||
|
|
||||||
|
|
@ -2189,7 +2189,7 @@ that expression.</p>
|
||||||
updated along with the stack effects after doing unification or we risk
|
updated along with the stack effects after doing unification or we risk
|
||||||
losing useful information. This was a straightforward, if awkward,
|
losing useful information. This was a straightforward, if awkward,
|
||||||
modification to the call structure of <code class="docutils literal notranslate"><span class="pre">meta_compose()</span></code> et. al.</p>
|
modification to the call structure of <code class="docutils literal notranslate"><span class="pre">meta_compose()</span></code> et. al.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">ID</span> <span class="o">=</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># Identity function.</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">ID</span> <span class="o">=</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># Identity function.</span>
|
||||||
|
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">infer</span><span class="p">(</span><span class="o">*</span><span class="n">expression</span><span class="p">):</span>
|
<span class="k">def</span> <span class="nf">infer</span><span class="p">(</span><span class="o">*</span><span class="n">expression</span><span class="p">):</span>
|
||||||
|
|
@ -2249,7 +2249,7 @@ module (FIXME link to its docs here!) should be explained… There is
|
||||||
cruft to convert the definitions in <code class="docutils literal notranslate"><span class="pre">DEFS</span></code> to the new
|
cruft to convert the definitions in <code class="docutils literal notranslate"><span class="pre">DEFS</span></code> to the new
|
||||||
<code class="docutils literal notranslate"><span class="pre">SymbolJoyType</span></code> objects, and some combinators. Here is an example of
|
<code class="docutils literal notranslate"><span class="pre">SymbolJoyType</span></code> objects, and some combinators. Here is an example of
|
||||||
output from the current code :</p>
|
output from the current code :</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span><span class="o">/</span><span class="mi">0</span> <span class="c1"># (Don't try to run this cell! It's not going to work. This is "read only" code heh..)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span><span class="o">/</span><span class="mi">0</span> <span class="c1"># (Don't try to run this cell! It's not going to work. This is "read only" code heh..)</span>
|
||||||
|
|
||||||
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="nb">format</span><span class="o">=</span><span class="s1">'</span><span class="si">%(message)s</span><span class="s1">'</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">INFO</span><span class="p">)</span>
|
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="nb">format</span><span class="o">=</span><span class="s1">'</span><span class="si">%(message)s</span><span class="s1">'</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">INFO</span><span class="p">)</span>
|
||||||
|
|
||||||
|
|
@ -2366,7 +2366,7 @@ relational</em> nature of the stack effect comments to “compute in reverse”
|
||||||
as it were. There’s a working demo of this at the end of the <code class="docutils literal notranslate"><span class="pre">types</span></code>
|
as it were. There’s a working demo of this at the end of the <code class="docutils literal notranslate"><span class="pre">types</span></code>
|
||||||
module. But if you’re interested in all that you should just use Prolog!</p>
|
module. But if you’re interested in all that you should just use Prolog!</p>
|
||||||
<p>Anyhow, type <em>checking</em> is a few easy steps away.</p>
|
<p>Anyhow, type <em>checking</em> is a few easy steps away.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">_ge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">_ge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||||||
<span class="k">return</span> <span class="p">(</span><span class="nb">issubclass</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)</span>
|
<span class="k">return</span> <span class="p">(</span><span class="nb">issubclass</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)</span>
|
||||||
<span class="ow">or</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'accept'</span><span class="p">)</span>
|
<span class="ow">or</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'accept'</span><span class="p">)</span>
|
||||||
<span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">accept</span><span class="p">))</span>
|
<span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">accept</span><span class="p">))</span>
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ the original paper: <a class="reference external" href="https://www.st.cs.uni-sa
|
||||||
Huet</a></p>
|
Huet</a></p>
|
||||||
<p>Given a datastructure on the stack we can navigate through it, modify
|
<p>Given a datastructure on the stack we can navigate through it, modify
|
||||||
it, and rebuild it using the “zipper” technique.</p>
|
it, and rebuild it using the “zipper” technique.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<section id="trees">
|
<section id="trees">
|
||||||
|
|
@ -52,7 +52,7 @@ strings, Symbols (strings that are names of functions) and sequences
|
||||||
(aka lists, aka quoted literals, aka aggregates, etc…), but we can build
|
(aka lists, aka quoted literals, aka aggregates, etc…), but we can build
|
||||||
<a class="reference external" href="https://en.wikipedia.org/wiki/Tree_%28data_structure%29">trees</a> out
|
<a class="reference external" href="https://en.wikipedia.org/wiki/Tree_%28data_structure%29">trees</a> out
|
||||||
of sequences.</p>
|
of sequences.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8]'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8]'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
|
||||||
|
|
@ -75,13 +75,13 @@ datastructure used to keep track of these items is the zipper.)</p>
|
||||||
show the trace so you can see how it works. If we were going to use
|
show the trace so you can see how it works. If we were going to use
|
||||||
these a lot it would make sense to write Python versions for efficiency,
|
these a lot it would make sense to write Python versions for efficiency,
|
||||||
but see below.</p>
|
but see below.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'z-down == [] swap uncons swap'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'z-down == [] swap uncons swap'</span><span class="p">)</span>
|
||||||
<span class="n">define</span><span class="p">(</span><span class="s1">'z-up == swons swap shunt'</span><span class="p">)</span>
|
<span class="n">define</span><span class="p">(</span><span class="s1">'z-up == swons swap shunt'</span><span class="p">)</span>
|
||||||
<span class="n">define</span><span class="p">(</span><span class="s1">'z-right == [swons] cons dip uncons swap'</span><span class="p">)</span>
|
<span class="n">define</span><span class="p">(</span><span class="s1">'z-right == [swons] cons dip uncons swap'</span><span class="p">)</span>
|
||||||
<span class="n">define</span><span class="p">(</span><span class="s1">'z-left == swons [uncons swap] dip swap'</span><span class="p">)</span>
|
<span class="n">define</span><span class="p">(</span><span class="s1">'z-left == swons [uncons swap] dip swap'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8] z-down'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8] z-down'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="n">z</span><span class="o">-</span><span class="n">down</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="n">z</span><span class="o">-</span><span class="n">down</span>
|
||||||
|
|
@ -93,7 +93,7 @@ but see below.</p>
|
||||||
<span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="o">.</span>
|
<span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="o">.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[] [[2 [3 4 25 6] 7] 8] 1 z-right'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[] [[2 [3 4 25 6] 7] 8] 1 z-right'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="n">z</span><span class="o">-</span><span class="n">right</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="n">z</span><span class="o">-</span><span class="n">right</span>
|
||||||
|
|
@ -113,43 +113,43 @@ but see below.</p>
|
||||||
<span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="o">.</span>
|
<span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="o">.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2 [3 4 25 6] 7] z-down'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2 [3 4 25 6] 7] z-down'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">2</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">2</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [] [[3 4 25 6] 7] 2 z-right'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [] [[3 4 25 6] 7] 2 z-right'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [3 4 25 6] z-down'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [3 4 25 6] z-down'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">3</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">3</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [] [4 25 6] 3 z-right'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [] [4 25 6] 3 z-right'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">4</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">4</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [3] [25 6] 4 z-right'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [3] [25 6] 4 z-right'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">25</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">25</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [4 3] [6] 25 sqr'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [4 3] [6] 25 sqr'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [4 3] [6] 625 z-up'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [4 3] [6] 625 z-up'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
|
||||||
|
|
@ -168,13 +168,13 @@ but see below.</p>
|
||||||
<span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="o">.</span>
|
<span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="o">.</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [3 4 625 6] z-up'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [3 4 625 6] z-up'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2 [3 4 625 6] 7] z-up'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2 [3 4 625 6] 7] z-up'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
|
||||||
|
|
@ -185,7 +185,7 @@ but see below.</p>
|
||||||
<h2><code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">infra</span></code><a class="headerlink" href="#dip-and-infra" title="Permalink to this headline">¶</a></h2>
|
<h2><code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">infra</span></code><a class="headerlink" href="#dip-and-infra" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>In Joy we have the <code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">infra</span></code> combinators which can “target”
|
<p>In Joy we have the <code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">infra</span></code> combinators which can “target”
|
||||||
or “address” any particular item in a Joy tree structure.</p>
|
or “address” any particular item in a Joy tree structure.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="p">[[[[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="p">[[[[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span>
|
||||||
|
|
@ -236,11 +236,11 @@ been embedded in a nested series of quoted programs, e.g.:</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>The <code class="docutils literal notranslate"><span class="pre">Z</span></code> function isn’t hard to make.</p>
|
<p>The <code class="docutils literal notranslate"><span class="pre">Z</span></code> function isn’t hard to make.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Z == [[] cons cons] step i'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Z == [[] cons cons] step i'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Here it is in action in a simplified scenario.</p>
|
<p>Here it is in action in a simplified scenario.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'1 [2 3 4] Z'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'1 [2 3 4] Z'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="n">Z</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="n">Z</span>
|
||||||
|
|
@ -273,7 +273,7 @@ been embedded in a nested series of quoted programs, e.g.:</p>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>And here it is doing the main thing.</p>
|
<p>And here it is doing the main thing.</p>
|
||||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8] [sqr] [dip dip infra dip infra dip infra] Z'</span><span class="p">)</span>
|
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8] [sqr] [dip dip infra dip infra dip infra] Z'</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
|
||||||
|
|
|
||||||
|
|
@ -110,6 +110,14 @@
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Newton-Raphson.html#finding-consecutive-approximations-within-a-tolerance">Finding Consecutive Approximations within a Tolerance</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Newton-Raphson.html#finding-consecutive-approximations-within-a-tolerance">Finding Consecutive Approximations within a Tolerance</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="toctree-l1"><a class="reference internal" href="Square_Spiral.html">Square Spiral Example Joy Code</a><ul>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Square_Spiral.html#original-form">Original Form</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Square_Spiral.html#translation-to-joy">Translation to Joy</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Square_Spiral.html#putting-the-pieces-together">Putting the Pieces Together</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Square_Spiral.html#turning-it-into-a-generator-with-x">Turning it into a Generator with <code class="docutils literal notranslate"><span class="pre">x</span></code></a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Square_Spiral.html#conclusion">Conclusion</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li class="toctree-l1"><a class="reference internal" href="Zipper.html">Traversing Datastructures with Zippers</a><ul>
|
<li class="toctree-l1"><a class="reference internal" href="Zipper.html">Traversing Datastructures with Zippers</a><ul>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Zipper.html#trees">Trees</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Zipper.html#trees">Trees</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Zipper.html#zipper-in-joy">Zipper in Joy</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Zipper.html#zipper-in-joy">Zipper in Joy</a></li>
|
||||||
|
|
@ -194,6 +202,7 @@
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Treestep.html">Treating Trees II: <code class="docutils literal notranslate"><span class="pre">treestep</span></code></a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Treestep.html">Treating Trees II: <code class="docutils literal notranslate"><span class="pre">treestep</span></code></a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Generator_Programs.html">Using <code class="docutils literal notranslate"><span class="pre">x</span></code> to Generate Values</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Generator_Programs.html">Using <code class="docutils literal notranslate"><span class="pre">x</span></code> to Generate Values</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Newton-Raphson.html">Newton’s method</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Newton-Raphson.html">Newton’s method</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="Square_Spiral.html">Square Spiral Example Joy Code</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Zipper.html">Traversing Datastructures with Zippers</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Zipper.html">Traversing Datastructures with Zippers</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Types.html">The Blissful Elegance of Typing Joy</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Types.html">The Blissful Elegance of Typing Joy</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="TypeChecking.html">Type Checking</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="TypeChecking.html">Type Checking</a></li>
|
||||||
|
|
|
||||||
Binary file not shown.
File diff suppressed because one or more lines are too long
|
|
@ -34,6 +34,31 @@ itself.
|
||||||
.. _Concatinative: https://en.wikipedia.org/wiki/Concatenative_programming_language
|
.. _Concatinative: https://en.wikipedia.org/wiki/Concatenative_programming_language
|
||||||
|
|
||||||
|
|
||||||
|
Example Code
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Here is an example of Joy code::
|
||||||
|
|
||||||
|
[[[abs]ii <=][[<>][pop !-]||]&&][[!-][[++]][[--]]ifte dip][[pop !-][--][++]ifte]ifte
|
||||||
|
|
||||||
|
It might seem unreadable but with a little familiarity it becomes just as
|
||||||
|
legible as any other notation. Some layout helps::
|
||||||
|
|
||||||
|
[ [[abs] ii <=]
|
||||||
|
[
|
||||||
|
[<>] [pop !-] ||
|
||||||
|
] &&
|
||||||
|
]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
|
||||||
|
This function accepts two integers on the stack and increments or
|
||||||
|
decrements one of them such that the new pair of numbers is the next
|
||||||
|
coordinate pair in a square spiral (like the kind used to construct an
|
||||||
|
Ulam Spiral). For more information see :doc:`notebooks/Square_Spiral`
|
||||||
|
|
||||||
|
|
||||||
Quick Start
|
Quick Start
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ E.g.:
|
||||||
Implementation
|
Implementation
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from functools import partial as curry
|
from functools import partial as curry
|
||||||
from itertools import product
|
from itertools import product
|
||||||
|
|
@ -86,7 +86,7 @@ Implementation
|
||||||
|
|
||||||
The empty set and the set of just the empty string.
|
The empty set and the set of just the empty string.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
phi = frozenset() # ϕ
|
phi = frozenset() # ϕ
|
||||||
y = frozenset({''}) # λ
|
y = frozenset({''}) # λ
|
||||||
|
|
@ -101,7 +101,7 @@ alphabet with two symbols (if you had to.)
|
||||||
I chose the names ``O`` and ``l`` (uppercase “o” and lowercase “L”) to
|
I chose the names ``O`` and ``l`` (uppercase “o” and lowercase “L”) to
|
||||||
look like ``0`` and ``1`` (zero and one) respectively.
|
look like ``0`` and ``1`` (zero and one) respectively.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
syms = O, l = frozenset({'0'}), frozenset({'1'})
|
syms = O, l = frozenset({'0'}), frozenset({'1'})
|
||||||
|
|
||||||
|
|
@ -123,7 +123,7 @@ expression* is one of:
|
||||||
|
|
||||||
Where ``R`` and ``S`` stand for *regular expressions*.
|
Where ``R`` and ``S`` stand for *regular expressions*.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
AND, CONS, KSTAR, NOT, OR = 'and cons * not or'.split() # Tags are just strings.
|
AND, CONS, KSTAR, NOT, OR = 'and cons * not or'.split() # Tags are just strings.
|
||||||
|
|
||||||
|
|
@ -133,7 +133,7 @@ only, these datastructures are immutable.
|
||||||
String Representation of RE Datastructures
|
String Representation of RE Datastructures
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def stringy(re):
|
def stringy(re):
|
||||||
'''
|
'''
|
||||||
|
|
@ -175,11 +175,11 @@ Match anything. Often spelled “.”
|
||||||
|
|
||||||
I = (0|1)*
|
I = (0|1)*
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
I = (KSTAR, (OR, O, l))
|
I = (KSTAR, (OR, O, l))
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print stringy(I)
|
print stringy(I)
|
||||||
|
|
||||||
|
|
@ -201,14 +201,14 @@ The example expression from Brzozowski:
|
||||||
|
|
||||||
Note that it contains one of everything.
|
Note that it contains one of everything.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
a = (CONS, I, (CONS, l, (CONS, l, (CONS, l, I))))
|
a = (CONS, I, (CONS, l, (CONS, l, (CONS, l, I))))
|
||||||
b = (CONS, I, (CONS, O, l))
|
b = (CONS, I, (CONS, O, l))
|
||||||
c = (CONS, l, (KSTAR, l))
|
c = (CONS, l, (KSTAR, l))
|
||||||
it = (AND, a, (NOT, (OR, b, c)))
|
it = (AND, a, (NOT, (OR, b, c)))
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print stringy(it)
|
print stringy(it)
|
||||||
|
|
||||||
|
|
@ -223,7 +223,7 @@ Note that it contains one of everything.
|
||||||
|
|
||||||
Let’s get that auxiliary predicate function ``δ`` out of the way.
|
Let’s get that auxiliary predicate function ``δ`` out of the way.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def nully(R):
|
def nully(R):
|
||||||
'''
|
'''
|
||||||
|
|
@ -263,7 +263,7 @@ This is the straightforward version with no “compaction”. It works fine,
|
||||||
but does waaaay too much work because the expressions grow each
|
but does waaaay too much work because the expressions grow each
|
||||||
derivation.
|
derivation.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def D(symbol):
|
def D(symbol):
|
||||||
|
|
||||||
|
|
@ -308,7 +308,7 @@ derivation.
|
||||||
Compaction Rules
|
Compaction Rules
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def _compaction_rule(relation, one, zero, a, b):
|
def _compaction_rule(relation, one, zero, a, b):
|
||||||
return (
|
return (
|
||||||
|
|
@ -320,7 +320,7 @@ Compaction Rules
|
||||||
|
|
||||||
An elegant symmetry.
|
An elegant symmetry.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
# R ∧ I = I ∧ R = R
|
# R ∧ I = I ∧ R = R
|
||||||
# R ∧ ϕ = ϕ ∧ R = ϕ
|
# R ∧ ϕ = ϕ ∧ R = ϕ
|
||||||
|
|
@ -341,7 +341,7 @@ We can save re-processing by remembering results we have already
|
||||||
computed. RE datastructures are immutable and the ``derv()`` functions
|
computed. RE datastructures are immutable and the ``derv()`` functions
|
||||||
are *pure* so this is fine.
|
are *pure* so this is fine.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class Memo(object):
|
class Memo(object):
|
||||||
|
|
||||||
|
|
@ -365,7 +365,7 @@ With “Compaction”
|
||||||
This version uses the rules above to perform compaction. It keeps the
|
This version uses the rules above to perform compaction. It keeps the
|
||||||
expressions from growing too large.
|
expressions from growing too large.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def D_compaction(symbol):
|
def D_compaction(symbol):
|
||||||
|
|
||||||
|
|
@ -414,7 +414,7 @@ Let’s try it out…
|
||||||
|
|
||||||
(FIXME: redo.)
|
(FIXME: redo.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
o, z = D_compaction('0'), D_compaction('1')
|
o, z = D_compaction('0'), D_compaction('1')
|
||||||
REs = set()
|
REs = set()
|
||||||
|
|
@ -533,10 +533,10 @@ machine transition table.
|
||||||
|
|
||||||
Says, “Three or more 1’s and not ending in 01 nor composed of all 1’s.”
|
Says, “Three or more 1’s and not ending in 01 nor composed of all 1’s.”
|
||||||
|
|
||||||
.. figure:: omg.svg
|
.. figure:: attachment:omg.svg
|
||||||
:alt: State Machine Graph
|
:alt: omg.svg
|
||||||
|
|
||||||
State Machine Graph
|
omg.svg
|
||||||
|
|
||||||
Start at ``a`` and follow the transition arrows according to their
|
Start at ``a`` and follow the transition arrows according to their
|
||||||
labels. Accepting states have a double outline. (Graphic generated with
|
labels. Accepting states have a double outline. (Graphic generated with
|
||||||
|
|
@ -605,20 +605,20 @@ You can see the one-way nature of the ``g`` state and the ``hij`` “trap”
|
||||||
in the way that the ``.111.`` on the left-hand side of the ``&``
|
in the way that the ``.111.`` on the left-hand side of the ``&``
|
||||||
disappears once it has been matched.
|
disappears once it has been matched.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
from string import ascii_lowercase
|
from string import ascii_lowercase
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
d0, d1 = D_compaction('0'), D_compaction('1')
|
d0, d1 = D_compaction('0'), D_compaction('1')
|
||||||
|
|
||||||
``explore()``
|
``explore()``
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def explore(re):
|
def explore(re):
|
||||||
|
|
||||||
|
|
@ -645,7 +645,7 @@ disappears once it has been matched.
|
||||||
|
|
||||||
return table, accepting
|
return table, accepting
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
table, accepting = explore(it)
|
table, accepting = explore(it)
|
||||||
table
|
table
|
||||||
|
|
@ -678,7 +678,7 @@ disappears once it has been matched.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
accepting
|
accepting
|
||||||
|
|
||||||
|
|
@ -697,7 +697,7 @@ Generate Diagram
|
||||||
Once we have the FSM table and the set of accepting states we can
|
Once we have the FSM table and the set of accepting states we can
|
||||||
generate the diagram above.
|
generate the diagram above.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
_template = '''\
|
_template = '''\
|
||||||
digraph finite_state_machine {
|
digraph finite_state_machine {
|
||||||
|
|
@ -722,7 +722,7 @@ generate the diagram above.
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print make_graph(table, accepting)
|
print make_graph(table, accepting)
|
||||||
|
|
||||||
|
|
@ -776,7 +776,7 @@ Trampoline Function
|
||||||
Python has no GOTO statement but we can fake it with a “trampoline”
|
Python has no GOTO statement but we can fake it with a “trampoline”
|
||||||
function.
|
function.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def trampoline(input_, jump_from, accepting):
|
def trampoline(input_, jump_from, accepting):
|
||||||
I = iter(input_)
|
I = iter(input_)
|
||||||
|
|
@ -793,7 +793,7 @@ Stream Functions
|
||||||
Little helpers to process the iterator of our data (a “stream” of “1”
|
Little helpers to process the iterator of our data (a “stream” of “1”
|
||||||
and “0” characters, not bits.)
|
and “0” characters, not bits.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
getch = lambda I: int(next(I))
|
getch = lambda I: int(next(I))
|
||||||
|
|
||||||
|
|
@ -816,7 +816,7 @@ code. (You have to imagine that these are GOTO statements in C or
|
||||||
branches in assembly and that the state names are branch destination
|
branches in assembly and that the state names are branch destination
|
||||||
labels.)
|
labels.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
a = lambda I: c if getch(I) else b
|
a = lambda I: c if getch(I) else b
|
||||||
b = lambda I: _0(I) or d
|
b = lambda I: _0(I) or d
|
||||||
|
|
@ -833,12 +833,12 @@ Note that the implementations of ``h`` and ``g`` are identical ergo
|
||||||
``h = g`` and we could eliminate one in the code but ``h`` is an
|
``h = g`` and we could eliminate one in the code but ``h`` is an
|
||||||
accepting state and ``g`` isn’t.
|
accepting state and ``g`` isn’t.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def acceptable(input_):
|
def acceptable(input_):
|
||||||
return trampoline(input_, a, {h, i})
|
return trampoline(input_, a, {h, i})
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for n in range(2**5):
|
for n in range(2**5):
|
||||||
s = bin(n)[2:]
|
s = bin(n)[2:]
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ Using ``x`` to Generate Values
|
||||||
|
|
||||||
Cf. jp-reprod.html
|
Cf. jp-reprod.html
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import J, V, define
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
|
@ -57,7 +57,7 @@ We can make a generator for the Natural numbers (0, 1, 2, …) by using
|
||||||
|
|
||||||
Let’s try it:
|
Let’s try it:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[0 swap [dup ++] dip rest cons] x')
|
V('[0 swap [dup ++] dip rest cons] x')
|
||||||
|
|
||||||
|
|
@ -81,7 +81,7 @@ Let’s try it:
|
||||||
After one application of ``x`` the quoted program contains ``1`` and
|
After one application of ``x`` the quoted program contains ``1`` and
|
||||||
``0`` is below it on the stack.
|
``0`` is below it on the stack.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[0 swap [dup ++] dip rest cons] x x x x x pop')
|
J('[0 swap [dup ++] dip rest cons] x x x x x pop')
|
||||||
|
|
||||||
|
|
@ -94,11 +94,11 @@ After one application of ``x`` the quoted program contains ``1`` and
|
||||||
``direco``
|
``direco``
|
||||||
----------
|
----------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('direco == dip rest cons')
|
define('direco == dip rest cons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[0 swap [dup ++] direco] x')
|
V('[0 swap [dup ++] direco] x')
|
||||||
|
|
||||||
|
|
@ -149,13 +149,13 @@ Reading from the bottom up:
|
||||||
G == [direco] cons [swap] swap concat cons
|
G == [direco] cons [swap] swap concat cons
|
||||||
G == [direco] cons [swap] swoncat cons
|
G == [direco] cons [swap] swoncat cons
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('G == [direco] cons [swap] swoncat cons')
|
define('G == [direco] cons [swap] swoncat cons')
|
||||||
|
|
||||||
Let’s try it out:
|
Let’s try it out:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('0 [dup ++] G')
|
J('0 [dup ++] G')
|
||||||
|
|
||||||
|
|
@ -165,7 +165,7 @@ Let’s try it out:
|
||||||
[0 swap [dup ++] direco]
|
[0 swap [dup ++] direco]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('0 [dup ++] G x x x pop')
|
J('0 [dup ++] G x x x pop')
|
||||||
|
|
||||||
|
|
@ -178,7 +178,7 @@ Let’s try it out:
|
||||||
Powers of 2
|
Powers of 2
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('1 [dup 1 <<] G x x x x x x x x x pop')
|
J('1 [dup 1 <<] G x x x x x x x x x pop')
|
||||||
|
|
||||||
|
|
@ -194,7 +194,7 @@ Powers of 2
|
||||||
If we have one of these quoted programs we can drive it using ``times``
|
If we have one of these quoted programs we can drive it using ``times``
|
||||||
with the ``x`` combinator.
|
with the ``x`` combinator.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('23 [dup ++] G 5 [x] times')
|
J('23 [dup ++] G 5 [x] times')
|
||||||
|
|
||||||
|
|
@ -226,11 +226,11 @@ int:
|
||||||
And pick them off by masking with 3 (binary 11) and then shifting the
|
And pick them off by masking with 3 (binary 11) and then shifting the
|
||||||
int right two bits.
|
int right two bits.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE1.1 == dup [3 &] dip 2 >>')
|
define('PE1.1 == dup [3 &] dip 2 >>')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('14811 PE1.1')
|
V('14811 PE1.1')
|
||||||
|
|
||||||
|
|
@ -252,7 +252,7 @@ int right two bits.
|
||||||
|
|
||||||
If we plug ``14811`` and ``[PE1.1]`` into our generator form…
|
If we plug ``14811`` and ``[PE1.1]`` into our generator form…
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('14811 [PE1.1] G')
|
J('14811 [PE1.1] G')
|
||||||
|
|
||||||
|
|
@ -264,7 +264,7 @@ If we plug ``14811`` and ``[PE1.1]`` into our generator form…
|
||||||
|
|
||||||
…we get a generator that works for seven cycles before it reaches zero:
|
…we get a generator that works for seven cycles before it reaches zero:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[14811 swap [PE1.1] direco] 7 [x] times')
|
J('[14811 swap [PE1.1] direco] 7 [x] times')
|
||||||
|
|
||||||
|
|
@ -280,11 +280,11 @@ Reset at Zero
|
||||||
We need a function that checks if the int has reached zero and resets it
|
We need a function that checks if the int has reached zero and resets it
|
||||||
if so.
|
if so.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE1.1.check == dup [pop 14811] [] branch')
|
define('PE1.1.check == dup [pop 14811] [] branch')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('14811 [PE1.1.check PE1.1] G')
|
J('14811 [PE1.1.check PE1.1] G')
|
||||||
|
|
||||||
|
|
@ -294,7 +294,7 @@ if so.
|
||||||
[14811 swap [PE1.1.check PE1.1] direco]
|
[14811 swap [PE1.1.check PE1.1] direco]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[14811 swap [PE1.1.check PE1.1] direco] 21 [x] times')
|
J('[14811 swap [PE1.1.check PE1.1] direco] 21 [x] times')
|
||||||
|
|
||||||
|
|
@ -316,7 +316,7 @@ In the PE1 problem we are asked to sum all the multiples of three and
|
||||||
five less than 1000. It’s worked out that we need to use all seven
|
five less than 1000. It’s worked out that we need to use all seven
|
||||||
numbers sixty-six times and then four more.
|
numbers sixty-six times and then four more.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('7 66 * 4 +')
|
J('7 66 * 4 +')
|
||||||
|
|
||||||
|
|
@ -328,7 +328,7 @@ numbers sixty-six times and then four more.
|
||||||
|
|
||||||
If we drive our generator 466 times and sum the stack we get 999.
|
If we drive our generator 466 times and sum the stack we get 999.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times')
|
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times')
|
||||||
|
|
||||||
|
|
@ -338,7 +338,7 @@ If we drive our generator 466 times and sum the stack we get 999.
|
||||||
3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 [57 swap [PE1.1.check PE1.1] direco]
|
3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 [57 swap [PE1.1.check PE1.1] direco]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times pop enstacken sum')
|
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times pop enstacken sum')
|
||||||
|
|
||||||
|
|
@ -351,13 +351,13 @@ If we drive our generator 466 times and sum the stack we get 999.
|
||||||
Project Euler Problem One
|
Project Euler Problem One
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE1.2 == + dup [+] dip')
|
define('PE1.2 == + dup [+] dip')
|
||||||
|
|
||||||
Now we can add ``PE1.2`` to the quoted program given to ``G``.
|
Now we can add ``PE1.2`` to the quoted program given to ``G``.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('0 0 0 [PE1.1.check PE1.1] G 466 [x [PE1.2] dip] times popop')
|
J('0 0 0 [PE1.1.check PE1.1] G 466 [x [PE1.2] dip] times popop')
|
||||||
|
|
||||||
|
|
@ -445,15 +445,15 @@ Putting it all together:
|
||||||
F == + [popdd over] cons infra uncons
|
F == + [popdd over] cons infra uncons
|
||||||
fib_gen == [1 1 F]
|
fib_gen == [1 1 F]
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('fib == + [popdd over] cons infra uncons')
|
define('fib == + [popdd over] cons infra uncons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('fib_gen == [1 1 fib]')
|
define('fib_gen == [1 1 fib]')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('fib_gen 10 [x] times')
|
J('fib_gen 10 [x] times')
|
||||||
|
|
||||||
|
|
@ -473,14 +473,14 @@ Now that we have a generator for the Fibonacci sequence, we need a
|
||||||
function that adds a term in the sequence to a sum if it is even, and
|
function that adds a term in the sequence to a sum if it is even, and
|
||||||
``pop``\ s it otherwise.
|
``pop``\ s it otherwise.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE2.1 == dup 2 % [+] [pop] branch')
|
define('PE2.1 == dup 2 % [+] [pop] branch')
|
||||||
|
|
||||||
And a predicate function that detects when the terms in the series
|
And a predicate function that detects when the terms in the series
|
||||||
“exceed four million”.
|
“exceed four million”.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('>4M == 4000000 >')
|
define('>4M == 4000000 >')
|
||||||
|
|
||||||
|
|
@ -488,11 +488,11 @@ Now it’s straightforward to define ``PE2`` as a recursive function that
|
||||||
generates terms in the Fibonacci sequence until they exceed four million
|
generates terms in the Fibonacci sequence until they exceed four million
|
||||||
and sums the even ones.
|
and sums the even ones.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE2 == 0 fib_gen x [pop >4M] [popop] [[PE2.1] dip x] primrec')
|
define('PE2 == 0 fib_gen x [pop >4M] [popop] [[PE2.1] dip x] primrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('PE2')
|
J('PE2')
|
||||||
|
|
||||||
|
|
@ -535,7 +535,7 @@ So the Fibonacci sequence considered in terms of just parity would be:
|
||||||
|
|
||||||
Every third term is even.
|
Every third term is even.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 0 fib] x x x') # To start the sequence with 1 1 2 3 instead of 1 2 3.
|
J('[1 0 fib] x x x') # To start the sequence with 1 1 2 3 instead of 1 2 3.
|
||||||
|
|
||||||
|
|
@ -547,7 +547,7 @@ Every third term is even.
|
||||||
|
|
||||||
Drive the generator three times and ``popop`` the two odd terms.
|
Drive the generator three times and ``popop`` the two odd terms.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 0 fib] x x x [popop] dipd')
|
J('[1 0 fib] x x x [popop] dipd')
|
||||||
|
|
||||||
|
|
@ -557,11 +557,11 @@ Drive the generator three times and ``popop`` the two odd terms.
|
||||||
2 [3 2 fib]
|
2 [3 2 fib]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('PE2.2 == x x x [popop] dipd')
|
define('PE2.2 == x x x [popop] dipd')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 0 fib] 10 [PE2.2] times')
|
J('[1 0 fib] 10 [PE2.2] times')
|
||||||
|
|
||||||
|
|
@ -574,7 +574,7 @@ Drive the generator three times and ``popop`` the two odd terms.
|
||||||
Replace ``x`` with our new driver function ``PE2.2`` and start our
|
Replace ``x`` with our new driver function ``PE2.2`` and start our
|
||||||
``fib`` generator at ``1 0``.
|
``fib`` generator at ``1 0``.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('0 [1 0 fib] PE2.2 [pop >4M] [popop] [[PE2.1] dip PE2.2] primrec')
|
J('0 [1 0 fib] PE2.2 [pop >4M] [popop] [[PE2.1] dip PE2.2] primrec')
|
||||||
|
|
||||||
|
|
@ -593,11 +593,11 @@ modifications to the default ``x``?
|
||||||
An Interesting Variation
|
An Interesting Variation
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('codireco == cons dip rest cons')
|
define('codireco == cons dip rest cons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[0 [dup ++] codireco] x')
|
V('[0 [dup ++] codireco] x')
|
||||||
|
|
||||||
|
|
@ -620,11 +620,11 @@ An Interesting Variation
|
||||||
0 [1 [dup ++] codireco] .
|
0 [1 [dup ++] codireco] .
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('G == [codireco] cons cons')
|
define('G == [codireco] cons cons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('230 [dup ++] G 5 [x] times pop')
|
J('230 [dup ++] G 5 [x] times pop')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ to write a function that can compute the square root of a number.
|
||||||
Cf. `"Why Functional Programming Matters" by John
|
Cf. `"Why Functional Programming Matters" by John
|
||||||
Hughes <https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf>`__
|
Hughes <https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf>`__
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
from notebook_preamble import J, V, define
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
|
@ -75,11 +75,11 @@ The generator can be written as:
|
||||||
1 [23 over / + 2 /] [dup] swoncat make_generator
|
1 [23 over / + 2 /] [dup] swoncat make_generator
|
||||||
1 [dup 23 over / + 2 /] make_generator
|
1 [dup 23 over / + 2 /] make_generator
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
define('gsra 1 swap [over / + 2 /] cons [dup] swoncat make_generator')
|
define('gsra 1 swap [over / + 2 /] cons [dup] swoncat make_generator')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
J('23 gsra')
|
J('23 gsra')
|
||||||
|
|
||||||
|
|
@ -92,7 +92,7 @@ The generator can be written as:
|
||||||
Let's drive the generator a few time (with the ``x`` combinator) and
|
Let's drive the generator a few time (with the ``x`` combinator) and
|
||||||
square the approximation to see how well it works...
|
square the approximation to see how well it works...
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
J('23 gsra 6 [x popd] times first sqr')
|
J('23 gsra 6 [x popd] times first sqr')
|
||||||
|
|
||||||
|
|
@ -142,7 +142,7 @@ Predicate
|
||||||
abs(a-b) ε <=
|
abs(a-b) ε <=
|
||||||
(abs(a-b)<=ε)
|
(abs(a-b)<=ε)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
define('_within_P [first - abs] dip <=')
|
define('_within_P [first - abs] dip <=')
|
||||||
|
|
||||||
|
|
@ -156,7 +156,7 @@ Base-Case
|
||||||
[b G] first
|
[b G] first
|
||||||
b
|
b
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
define('_within_B roll< popop first')
|
define('_within_B roll< popop first')
|
||||||
|
|
||||||
|
|
@ -184,7 +184,7 @@ Pretty straightforward:
|
||||||
|
|
||||||
b [c G] ε within
|
b [c G] ε within
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
define('_within_R [popd x] dip')
|
define('_within_R [popd x] dip')
|
||||||
|
|
||||||
|
|
@ -199,14 +199,14 @@ The recursive function we have defined so far needs a slight preamble:
|
||||||
[a G] x ε ...
|
[a G] x ε ...
|
||||||
a [b G] ε ...
|
a [b G] ε ...
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
define('within x 0.000000001 [_within_P] [_within_B] [_within_R] tailrec')
|
define('within x 0.000000001 [_within_P] [_within_B] [_within_R] tailrec')
|
||||||
define('sqrt gsra within')
|
define('sqrt gsra within')
|
||||||
|
|
||||||
Try it out...
|
Try it out...
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
J('36 sqrt')
|
J('36 sqrt')
|
||||||
|
|
||||||
|
|
@ -216,7 +216,7 @@ Try it out...
|
||||||
6.0
|
6.0
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
J('23 sqrt')
|
J('23 sqrt')
|
||||||
|
|
||||||
|
|
@ -228,7 +228,7 @@ Try it out...
|
||||||
|
|
||||||
Check it.
|
Check it.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
4.795831523312719**2
|
4.795831523312719**2
|
||||||
|
|
||||||
|
|
@ -241,7 +241,7 @@ Check it.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython3
|
||||||
|
|
||||||
from math import sqrt
|
from math import sqrt
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ implementation under the hood. (Where does the “type” come from? It has
|
||||||
a contingent existence predicated on the disciplined use of these
|
a contingent existence predicated on the disciplined use of these
|
||||||
functions on otherwise undistinguished Joy datastructures.)
|
functions on otherwise undistinguished Joy datastructures.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import D, J, V, define, DefinitionWrapper
|
from notebook_preamble import D, J, V, define, DefinitionWrapper
|
||||||
|
|
||||||
|
|
@ -87,11 +87,11 @@ Definition:
|
||||||
|
|
||||||
Tree-new == swap [[] []] cons cons
|
Tree-new == swap [[] []] cons cons
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Tree-new == swap [[] []] cons cons')
|
define('Tree-new == swap [[] []] cons cons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('"v" "k" Tree-new')
|
J('"v" "k" Tree-new')
|
||||||
|
|
||||||
|
|
@ -163,11 +163,11 @@ comparison operator:
|
||||||
P < == pop roll> pop first <
|
P < == pop roll> pop first <
|
||||||
P == pop roll> pop first
|
P == pop roll> pop first
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('P == pop roll> pop first')
|
define('P == pop roll> pop first')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["old_key" 23 [] []] 17 "new_key" ["..."] P')
|
J('["old_key" 23 [] []] 17 "new_key" ["..."] P')
|
||||||
|
|
||||||
|
|
@ -242,11 +242,11 @@ And so ``T`` is just:
|
||||||
|
|
||||||
T == cons cons [dipdd] cons infra
|
T == cons cons [dipdd] cons infra
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('T == cons cons [dipdd] cons infra')
|
define('T == cons cons [dipdd] cons infra')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] T')
|
J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] T')
|
||||||
|
|
||||||
|
|
@ -266,7 +266,7 @@ This is very very similar to the above:
|
||||||
[key_n value_n left right] value key [Tree-add] E
|
[key_n value_n left right] value key [Tree-add] E
|
||||||
[key_n value_n left right] value key [Tree-add] [P <] [Te] [Ee] ifte
|
[key_n value_n left right] value key [Tree-add] [P <] [Te] [Ee] ifte
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('E == [P <] [Te] [Ee] ifte')
|
define('E == [P <] [Te] [Ee] ifte')
|
||||||
|
|
||||||
|
|
@ -278,11 +278,11 @@ instead of the right, so the only difference is that it must use
|
||||||
|
|
||||||
Te == cons cons [dipd] cons infra
|
Te == cons cons [dipd] cons infra
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Te == cons cons [dipd] cons infra')
|
define('Te == cons cons [dipd] cons infra')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] Te')
|
J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] Te')
|
||||||
|
|
||||||
|
|
@ -320,11 +320,11 @@ Example:
|
||||||
key new_value [ left right] cons cons
|
key new_value [ left right] cons cons
|
||||||
[key new_value left right]
|
[key new_value left right]
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Ee == pop swap roll< rest rest cons cons')
|
define('Ee == pop swap roll< rest rest cons cons')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee')
|
J('["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee')
|
||||||
|
|
||||||
|
|
@ -355,14 +355,14 @@ Putting it all together:
|
||||||
|
|
||||||
Tree-add == [popop not] [[pop] dipd Tree-new] [] [R] genrec
|
Tree-add == [popop not] [[pop] dipd Tree-new] [] [R] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [[P >] [T] [E] ifte] genrec')
|
define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [[P >] [T] [E] ifte] genrec')
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
~~~~~~~~
|
~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] 23 "b" Tree-add') # Initial
|
J('[] 23 "b" Tree-add') # Initial
|
||||||
|
|
||||||
|
|
@ -372,7 +372,7 @@ Examples
|
||||||
['b' 23 [] []]
|
['b' 23 [] []]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["b" 23 [] []] 88 "c" Tree-add') # Greater than
|
J('["b" 23 [] []] 88 "c" Tree-add') # Greater than
|
||||||
|
|
||||||
|
|
@ -382,7 +382,7 @@ Examples
|
||||||
['b' 23 [] ['c' 88 [] []]]
|
['b' 23 [] ['c' 88 [] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["b" 23 [] []] 88 "a" Tree-add') # Less than
|
J('["b" 23 [] []] 88 "a" Tree-add') # Less than
|
||||||
|
|
||||||
|
|
@ -392,7 +392,7 @@ Examples
|
||||||
['b' 23 ['a' 88 [] []] []]
|
['b' 23 ['a' 88 [] []] []]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["b" 23 [] []] 88 "b" Tree-add') # Equal to
|
J('["b" 23 [] []] 88 "b" Tree-add') # Equal to
|
||||||
|
|
||||||
|
|
@ -402,7 +402,7 @@ Examples
|
||||||
['b' 88 [] []]
|
['b' 88 [] []]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Series.
|
J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Series.
|
||||||
|
|
||||||
|
|
@ -412,7 +412,7 @@ Examples
|
||||||
['b' 23 ['a' 88 [] []] ['c' 44 [] []]]
|
['b' 23 ['a' 88 [] []] ['c' 44 [] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step')
|
J('[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step')
|
||||||
|
|
||||||
|
|
@ -444,7 +444,7 @@ values:
|
||||||
------------------------- a < b
|
------------------------- a < b
|
||||||
L
|
L
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("1 0 ['G'] ['E'] ['L'] cmp")
|
J("1 0 ['G'] ['E'] ['L'] cmp")
|
||||||
|
|
||||||
|
|
@ -454,7 +454,7 @@ values:
|
||||||
'G'
|
'G'
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("1 1 ['G'] ['E'] ['L'] cmp")
|
J("1 1 ['G'] ['E'] ['L'] cmp")
|
||||||
|
|
||||||
|
|
@ -464,7 +464,7 @@ values:
|
||||||
'E'
|
'E'
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("0 1 ['G'] ['E'] ['L'] cmp")
|
J("0 1 ['G'] ['E'] ['L'] cmp")
|
||||||
|
|
||||||
|
|
@ -514,7 +514,7 @@ Or just:
|
||||||
|
|
||||||
P == over [popop popop first] nullary
|
P == over [popop popop first] nullary
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('P == over [popop popop first] nullary')
|
define('P == over [popop popop first] nullary')
|
||||||
|
|
||||||
|
|
@ -541,11 +541,11 @@ to understand:
|
||||||
|
|
||||||
Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec
|
Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec')
|
define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Still works.
|
J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Still works.
|
||||||
|
|
||||||
|
|
@ -685,14 +685,14 @@ Working backward:
|
||||||
|
|
||||||
Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec
|
Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec')
|
define('Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec')
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
~~~~~~~~
|
~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] [foo] Tree-iter') # It doesn't matter what F is as it won't be used.
|
J('[] [foo] Tree-iter') # It doesn't matter what F is as it won't be used.
|
||||||
|
|
||||||
|
|
@ -702,7 +702,7 @@ Examples
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter")
|
J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter")
|
||||||
|
|
||||||
|
|
@ -712,7 +712,7 @@ Examples
|
||||||
'b' 'a' 'c'
|
'b' 'a' 'c'
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter")
|
J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter")
|
||||||
|
|
||||||
|
|
@ -731,7 +731,7 @@ to it will only occur once within it, and we can query it in
|
||||||
`:math:`O(\log_2 N)` <https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2>`__
|
`:math:`O(\log_2 N)` <https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2>`__
|
||||||
time.
|
time.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] [3 9 5 2 8 6 7 8 4] [0 swap Tree-add] step')
|
J('[] [3 9 5 2 8 6 7 8 4] [0 swap Tree-add] step')
|
||||||
|
|
||||||
|
|
@ -741,11 +741,11 @@ time.
|
||||||
[3 0 [2 0 [] []] [9 0 [5 0 [4 0 [] []] [8 0 [6 0 [] [7 0 [] []]] []]] []]]
|
[3 0 [2 0 [] []] [9 0 [5 0 [4 0 [] []] [8 0 [6 0 [] [7 0 [] []]] []]] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('to_set == [] swap [0 swap Tree-add] step')
|
define('to_set == [] swap [0 swap Tree-add] step')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[3 9 5 2 8 6 7 8 4] to_set')
|
J('[3 9 5 2 8 6 7 8 4] to_set')
|
||||||
|
|
||||||
|
|
@ -758,11 +758,11 @@ time.
|
||||||
And with that we can write a little program ``unique`` to remove
|
And with that we can write a little program ``unique`` to remove
|
||||||
duplicate items from a list.
|
duplicate items from a list.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('unique == [to_set [first] Tree-iter] cons run')
|
define('unique == [to_set [first] Tree-iter] cons run')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique') # Filter duplicate items.
|
J('[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique') # Filter duplicate items.
|
||||||
|
|
||||||
|
|
@ -872,7 +872,7 @@ Let’s do a little semantic factoring:
|
||||||
|
|
||||||
Now we can sort sequences.
|
Now we can sort sequences.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
#define('Tree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec')
|
#define('Tree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec')
|
||||||
|
|
||||||
|
|
@ -892,7 +892,7 @@ Now we can sort sequences.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[3 9 5 2 8 6 7 8 4] to_set Tree-iter-order')
|
J('[3 9 5 2 8 6 7 8 4] to_set Tree-iter-order')
|
||||||
|
|
||||||
|
|
@ -1070,7 +1070,7 @@ So:
|
||||||
|
|
||||||
Tree-get == [pop not] swap [] [P [T>] [E] [T<] cmp] genrec
|
Tree-get == [pop not] swap [] [P [T>] [E] [T<] cmp] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
# I don't want to deal with name conflicts with the above so I'm inlining everything here.
|
# I don't want to deal with name conflicts with the above so I'm inlining everything here.
|
||||||
# The original Joy system has "hide" which is a meta-command which allows you to use named
|
# The original Joy system has "hide" which is a meta-command which allows you to use named
|
||||||
|
|
@ -1088,7 +1088,7 @@ So:
|
||||||
] genrec
|
] genrec
|
||||||
''')
|
''')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get')
|
J('["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get')
|
||||||
|
|
||||||
|
|
@ -1098,7 +1098,7 @@ So:
|
||||||
'mike not in tree'
|
'mike not in tree'
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('["gary" 23 [] []] "gary" [popop "err"] Tree-get')
|
J('["gary" 23 [] []] "gary" [popop "err"] Tree-get')
|
||||||
|
|
||||||
|
|
@ -1108,7 +1108,7 @@ So:
|
||||||
23
|
23
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('''
|
J('''
|
||||||
|
|
||||||
|
|
@ -1124,7 +1124,7 @@ So:
|
||||||
2
|
2
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('''
|
J('''
|
||||||
|
|
||||||
|
|
@ -1500,7 +1500,7 @@ Refactoring
|
||||||
By the standards of the code I’ve written so far, this is a *huge* Joy
|
By the standards of the code I’ve written so far, this is a *huge* Joy
|
||||||
program.
|
program.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
DefinitionWrapper.add_definitions('''
|
DefinitionWrapper.add_definitions('''
|
||||||
first_two == uncons uncons pop
|
first_two == uncons uncons pop
|
||||||
|
|
@ -1519,7 +1519,7 @@ program.
|
||||||
Tree-Delete == [pop not] [pop] [R0] [R1] genrec
|
Tree-Delete == [pop not] [pop] [R0] [R1] genrec
|
||||||
''', D)
|
''', D)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete ")
|
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete ")
|
||||||
|
|
||||||
|
|
@ -1529,7 +1529,7 @@ program.
|
||||||
['a' 23 [] ['b' 88 [] []]]
|
['a' 23 [] ['b' 88 [] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete ")
|
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete ")
|
||||||
|
|
||||||
|
|
@ -1539,7 +1539,7 @@ program.
|
||||||
['a' 23 [] ['c' 44 [] []]]
|
['a' 23 [] ['c' 44 [] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete ")
|
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete ")
|
||||||
|
|
||||||
|
|
@ -1549,7 +1549,7 @@ program.
|
||||||
['b' 88 [] ['c' 44 [] []]]
|
['b' 88 [] ['c' 44 [] []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete ")
|
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete ")
|
||||||
|
|
||||||
|
|
@ -1559,7 +1559,7 @@ program.
|
||||||
['a' 23 [] ['b' 88 [] ['c' 44 [] []]]]
|
['a' 23 [] ['b' 88 [] ['c' 44 [] []]]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] [4 2 3 1 6 7 5 ] [0 swap Tree-add] step')
|
J('[] [4 2 3 1 6 7 5 ] [0 swap Tree-add] step')
|
||||||
|
|
||||||
|
|
@ -1569,7 +1569,7 @@ program.
|
||||||
[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]]
|
[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 3 Tree-Delete ")
|
J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 3 Tree-Delete ")
|
||||||
|
|
||||||
|
|
@ -1579,7 +1579,7 @@ program.
|
||||||
[4 0 [2 0 [1 0 [] []] []] [6 0 [5 0 [] []] [7 0 [] []]]]
|
[4 0 [2 0 [1 0 [] []] []] [6 0 [5 0 [] []] [7 0 [] []]]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 4 Tree-Delete ")
|
J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 4 Tree-Delete ")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import J, V, define
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
|
@ -81,13 +81,13 @@ the variables:
|
||||||
The three arguments are to the left, so we can “chop off” everything to
|
The three arguments are to the left, so we can “chop off” everything to
|
||||||
the right and say it’s the definition of the ``quadratic`` function:
|
the right and say it’s the definition of the ``quadratic`` function:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2')
|
define('quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2')
|
||||||
|
|
||||||
Let’s try it out:
|
Let’s try it out:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('3 1 1 quadratic')
|
J('3 1 1 quadratic')
|
||||||
|
|
||||||
|
|
@ -102,7 +102,7 @@ lines are the ``dip`` and ``dipd`` combinators building the main program
|
||||||
by incorporating the values on the stack. Then that program runs and you
|
by incorporating the values on the stack. Then that program runs and you
|
||||||
get the results. This is pretty typical of Joy code.
|
get the results. This is pretty typical of Joy code.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('-5 1 4 quadratic')
|
V('-5 1 4 quadratic')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import D, DefinitionWrapper, J, V, define
|
from notebook_preamble import D, DefinitionWrapper, J, V, define
|
||||||
|
|
||||||
|
|
@ -80,7 +80,7 @@ is a recursive function ``H :: A -> C`` that converts a value of type
|
||||||
It may be helpful to see this function implemented in imperative Python
|
It may be helpful to see this function implemented in imperative Python
|
||||||
code.
|
code.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def hylomorphism(c, F, P, G):
|
def hylomorphism(c, F, P, G):
|
||||||
'''Return a hylomorphism function H.'''
|
'''Return a hylomorphism function H.'''
|
||||||
|
|
@ -185,7 +185,7 @@ the left so we have a definition for ``hylomorphism``:
|
||||||
|
|
||||||
hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec
|
hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec')
|
define('hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec')
|
||||||
|
|
||||||
|
|
@ -203,13 +203,13 @@ To sum a range of integers from 0 to *n* - 1:
|
||||||
- ``[G]`` is ``[-- dup]``
|
- ``[G]`` is ``[-- dup]``
|
||||||
- ``[F]`` is ``[+]``
|
- ``[F]`` is ``[+]``
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism')
|
define('triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism')
|
||||||
|
|
||||||
Let’s try it:
|
Let’s try it:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 triangular_number')
|
J('5 triangular_number')
|
||||||
|
|
||||||
|
|
@ -219,7 +219,7 @@ Let’s try it:
|
||||||
10
|
10
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[0 1 2 3 4 5 6] [triangular_number] map')
|
J('[0 1 2 3 4 5 6] [triangular_number] map')
|
||||||
|
|
||||||
|
|
@ -391,10 +391,8 @@ values.
|
||||||
|
|
||||||
A == [P] [] [G] [swons] hylomorphism
|
A == [P] [] [G] [swons] hylomorphism
|
||||||
|
|
||||||
``range`` et. al.
|
``range`` et. al. An example of an anamorphism is the ``range`` function which generates the list of integers from 0 to *n* - 1 given *n*.
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
An example of an anamorphism is the ``range`` function which generates the list of integers from 0 to *n* - 1 given *n*.
|
|
||||||
|
|
||||||
Each of the above variations can be used to make four slightly different
|
Each of the above variations can be used to make four slightly different
|
||||||
``range`` functions.
|
``range`` functions.
|
||||||
|
|
@ -407,11 +405,11 @@ Each of the above variations can be used to make four slightly different
|
||||||
H1 == [P] [pop c] [G] [dip F] genrec
|
H1 == [P] [pop c] [G] [dip F] genrec
|
||||||
== [0 <=] [pop []] [-- dup] [dip swons] genrec
|
== [0 <=] [pop []] [-- dup] [dip swons] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('range == [0 <=] [] [-- dup] [swons] hylomorphism')
|
define('range == [0 <=] [] [-- dup] [swons] hylomorphism')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 range')
|
J('5 range')
|
||||||
|
|
||||||
|
|
@ -429,11 +427,11 @@ Each of the above variations can be used to make four slightly different
|
||||||
H2 == c swap [P] [pop] [G [F] dip] primrec
|
H2 == c swap [P] [pop] [G [F] dip] primrec
|
||||||
== [] swap [0 <=] [pop] [-- dup [swons] dip] primrec
|
== [] swap [0 <=] [pop] [-- dup [swons] dip] primrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec')
|
define('range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 range_reverse')
|
J('5 range_reverse')
|
||||||
|
|
||||||
|
|
@ -451,11 +449,11 @@ Each of the above variations can be used to make four slightly different
|
||||||
H3 == [P] [pop c] [[G] dupdip] [dip F] genrec
|
H3 == [P] [pop c] [[G] dupdip] [dip F] genrec
|
||||||
== [0 <=] [pop []] [[--] dupdip] [dip swons] genrec
|
== [0 <=] [pop []] [[--] dupdip] [dip swons] genrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec')
|
define('ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 ranger')
|
J('5 ranger')
|
||||||
|
|
||||||
|
|
@ -473,11 +471,11 @@ Each of the above variations can be used to make four slightly different
|
||||||
H4 == c swap [P] [pop] [[F] dupdip G ] primrec
|
H4 == c swap [P] [pop] [[F] dupdip G ] primrec
|
||||||
== [] swap [0 <=] [pop] [[swons] dupdip --] primrec
|
== [] swap [0 <=] [pop] [[swons] dupdip --] primrec
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec')
|
define('ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 ranger_reverse')
|
J('5 ranger_reverse')
|
||||||
|
|
||||||
|
|
@ -503,7 +501,7 @@ and makes some new value.
|
||||||
|
|
||||||
C == [not] c [uncons swap] [F] hylomorphism
|
C == [not] c [uncons swap] [F] hylomorphism
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('swuncons == uncons swap') # Awkward name.
|
define('swuncons == uncons swap') # Awkward name.
|
||||||
|
|
||||||
|
|
@ -513,11 +511,11 @@ An example of a catamorphism is the sum function.
|
||||||
|
|
||||||
sum == [not] 0 [swuncons] [+] hylomorphism
|
sum == [not] 0 [swuncons] [+] hylomorphism
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('sum == [not] 0 [swuncons] [+] hylomorphism')
|
define('sum == [not] 0 [swuncons] [+] hylomorphism')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[5 4 3 2 1] sum')
|
J('[5 4 3 2 1] sum')
|
||||||
|
|
||||||
|
|
@ -533,7 +531,7 @@ The ``step`` combinator
|
||||||
The ``step`` combinator will usually be better to use than
|
The ``step`` combinator will usually be better to use than
|
||||||
``catamorphism``.
|
``catamorphism``.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[step] help')
|
J('[step] help')
|
||||||
|
|
||||||
|
|
@ -562,11 +560,11 @@ The ``step`` combinator will usually be better to use than
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('sum == 0 swap [+] step')
|
define('sum == 0 swap [+] step')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[5 4 3 2 1] sum')
|
J('[5 4 3 2 1] sum')
|
||||||
|
|
||||||
|
|
@ -594,11 +592,11 @@ With:
|
||||||
G == --
|
G == --
|
||||||
P == 1 <=
|
P == 1 <=
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec')
|
define('factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('5 factorial')
|
J('5 factorial')
|
||||||
|
|
||||||
|
|
@ -637,11 +635,11 @@ We would use:
|
||||||
G == rest dup
|
G == rest dup
|
||||||
P == not
|
P == not
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('tails == [] swap [not] [pop] [rest dup [swons] dip] primrec')
|
define('tails == [] swap [not] [pop] [rest dup [swons] dip] primrec')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 2 3] tails')
|
J('[1 2 3] tails')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,14 @@ dictionary. However, there’s no function that does that. Adding a new
|
||||||
function to the dictionary is a meta-interpreter action, you have to do
|
function to the dictionary is a meta-interpreter action, you have to do
|
||||||
it in Python, not Joy.
|
it in Python, not Joy.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import D, J, V
|
from notebook_preamble import D, J, V
|
||||||
|
|
||||||
A long trace
|
A long trace
|
||||||
------------
|
------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[23 18] average')
|
V('[23 18] average')
|
||||||
|
|
||||||
|
|
@ -81,7 +81,7 @@ An efficient ``sum`` function is already in the library. But for
|
||||||
``size`` we can use a “compiled” version hand-written in Python to speed
|
``size`` we can use a “compiled” version hand-written in Python to speed
|
||||||
up evaluation and make the trace more readable.
|
up evaluation and make the trace more readable.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from joy.library import SimpleFunctionWrapper
|
from joy.library import SimpleFunctionWrapper
|
||||||
from joy.utils.stack import iter_stack
|
from joy.utils.stack import iter_stack
|
||||||
|
|
@ -99,7 +99,7 @@ up evaluation and make the trace more readable.
|
||||||
Now we replace the old version in the dictionary with the new version,
|
Now we replace the old version in the dictionary with the new version,
|
||||||
and re-evaluate the expression.
|
and re-evaluate the expression.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
D['size'] = size
|
D['size'] = size
|
||||||
|
|
||||||
|
|
@ -108,7 +108,7 @@ A shorter trace
|
||||||
|
|
||||||
You can see that ``size`` now executes in a single step.
|
You can see that ``size`` now executes in a single step.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[23 18] average')
|
V('[23 18] average')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,421 @@
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
Square Spiral Example Joy Code
|
||||||
|
==============================
|
||||||
|
|
||||||
|
Here is the example of Joy code from the ``README`` file:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[[abs]ii <=][[<>][pop !-]||]&&][[!-][[++]][[--]]ifte dip][[pop !-][--][++]ifte]ifte
|
||||||
|
|
||||||
|
It might seem unreadable but with a little familiarity it becomes just
|
||||||
|
as legible as any other notation. Some layout helps:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[ [[abs] ii <=]
|
||||||
|
[
|
||||||
|
[<>] [pop !-] ||
|
||||||
|
] &&
|
||||||
|
]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
|
||||||
|
This function accepts two integers on the stack and increments or
|
||||||
|
decrements one of them such that the new pair of numbers is the next
|
||||||
|
coordinate pair in a square spiral (like the kind used to construct an
|
||||||
|
Ulam Spiral).
|
||||||
|
|
||||||
|
Original Form
|
||||||
|
-------------
|
||||||
|
|
||||||
|
It's adapted from `the original code on
|
||||||
|
StackOverflow <https://stackoverflow.com/questions/398299/looping-in-a-spiral/31864777#31864777>`__:
|
||||||
|
|
||||||
|
If all you're trying to do is generate the first N points in the
|
||||||
|
spiral (without the original problem's constraint of masking to an N
|
||||||
|
x M region), the code becomes very simple:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
void spiral(const int N)
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
for(int i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
cout << x << '\t' << y << '\n';
|
||||||
|
if(abs(x) <= abs(y) && (x != y || x >= 0))
|
||||||
|
x += ((y >= 0) ? 1 : -1);
|
||||||
|
else
|
||||||
|
y += ((x >= 0) ? -1 : 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Translation to Joy
|
||||||
|
------------------
|
||||||
|
|
||||||
|
I'm going to make a function that take two ints (``x`` and ``y``) and
|
||||||
|
generates the next pair, we'll turn it into a generator later using the
|
||||||
|
``x`` combinator.
|
||||||
|
|
||||||
|
First Boolean Predicate
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
We need a function that computes ``abs(x) <= abs(y)``, we can use ``ii``
|
||||||
|
to apply ``abs`` to both values and then compare them with ``<=``:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[abs] ii <=
|
||||||
|
|
||||||
|
I've defined two short-circuiting Boolean combinators ``&&`` and ``||``
|
||||||
|
that each accept two quoted predicate programs, run the first, and
|
||||||
|
conditionally run the second only if required (to compute the final
|
||||||
|
Boolean value). They run their predicate arguments ``nullary``.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('&& [nullary] cons [nullary [0]] dip branch')
|
||||||
|
define('|| [nullary] cons [nullary] dip [1] branch')
|
||||||
|
|
||||||
|
Given those, we can define ``x != y || x >= 0`` as:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[<>] [pop 0 >=] ||
|
||||||
|
|
||||||
|
And ``(abs(x) <= abs(y) && (x != y || x >= 0))`` as:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[abs] ii <=] [[<>] [pop 0 >=] ||] &&
|
||||||
|
|
||||||
|
It's a little rough, but, as I say, with a little familiarity it becomes
|
||||||
|
legible.
|
||||||
|
|
||||||
|
The Increment / Decrement Branches
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Turning to the branches of the main ``if`` statement:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
x += ((y >= 0) ? 1 : -1);
|
||||||
|
|
||||||
|
Rewrite as a hybrid (pseudo-code) ``ifte`` expression:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[y >= 0] [x += 1] [X -= 1] ifte
|
||||||
|
|
||||||
|
Change each C phrase to Joy code:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 >=] [[++] dip] [[--] dip] ifte
|
||||||
|
|
||||||
|
Factor out the dip from each branch:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 >=] [[++]] [[--]] ifte dip
|
||||||
|
|
||||||
|
Similar logic applies to the other branch:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
y += ((x >= 0) ? -1 : 1);
|
||||||
|
|
||||||
|
[x >= 0] [y -= 1] [y += 1] ifte
|
||||||
|
|
||||||
|
[pop 0 >=] [--] [++] ifte
|
||||||
|
|
||||||
|
"Not Negative"
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('!- 0 >=')
|
||||||
|
|
||||||
|
Putting the Pieces Together
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
We can assemble the three functions we just defined in quotes and give
|
||||||
|
them them to the ``ifte`` combinator. With some arrangement to show off
|
||||||
|
the symmetry of the two branches, we have:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[[abs] ii <=] [[<>] [pop !-] ||] &&]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
ifte
|
||||||
|
|
||||||
|
As I was writing this up I realized that, since the ``&&`` combinator
|
||||||
|
doesn't consume the stack (below its quoted args), I can unquote the
|
||||||
|
predicate, swap the branches, and use the ``branch`` combinator instead
|
||||||
|
of ``ifte``:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[abs] ii <=] [[<>] [pop !-] ||] &&
|
||||||
|
[[pop !-] [--] [++] ifte ]
|
||||||
|
[[ !-] [[++]] [[--]] ifte dip]
|
||||||
|
branch
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte')
|
||||||
|
|
||||||
|
Let's try it out:
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('0 0 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
1 0
|
||||||
|
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('1 0 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
1 -1
|
||||||
|
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('1 -1 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
0 -1
|
||||||
|
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('0 -1 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
-1 -1
|
||||||
|
|
||||||
|
|
||||||
|
Turning it into a Generator with ``x``
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
It can be used with the x combinator to make a kind of generator for
|
||||||
|
spiral square coordinates.
|
||||||
|
|
||||||
|
We can use ``codireco`` to make a generator
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
codireco ::= cons dip rest cons
|
||||||
|
|
||||||
|
It will look like this:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[value [F] codireco]
|
||||||
|
|
||||||
|
Here's a trace of how it works:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 [dup ++] codireco] . x
|
||||||
|
[0 [dup ++] codireco] . 0 [dup ++] codireco
|
||||||
|
[0 [dup ++] codireco] 0 . [dup ++] codireco
|
||||||
|
[0 [dup ++] codireco] 0 [dup ++] . codireco
|
||||||
|
[0 [dup ++] codireco] 0 [dup ++] . cons dip rest cons
|
||||||
|
[0 [dup ++] codireco] [0 dup ++] . dip rest cons
|
||||||
|
. 0 dup ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 . dup ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 0 . ++ [0 [dup ++] codireco] rest cons
|
||||||
|
0 1 . [0 [dup ++] codireco] rest cons
|
||||||
|
0 1 [0 [dup ++] codireco] . rest cons
|
||||||
|
0 1 [[dup ++] codireco] . cons
|
||||||
|
0 [1 [dup ++] codireco] .
|
||||||
|
|
||||||
|
But first we have to change the ``spiral_next`` function to work on a
|
||||||
|
quoted pair of integers, and leave a copy of the pair on the stack.
|
||||||
|
From:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
y x spiral_next
|
||||||
|
---------------------
|
||||||
|
y' x'
|
||||||
|
|
||||||
|
to:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[x y] [spiral_next] infra
|
||||||
|
-------------------------------
|
||||||
|
[x' y']
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('[0 0] [spiral_next] infra')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
[0 1]
|
||||||
|
|
||||||
|
|
||||||
|
So our generator is:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[x y] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
Or rather:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[[0 0] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
There is a function ``make_generator`` that will build the generator for
|
||||||
|
us out of the value and stepper function:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[0 0] [dup [spiral_next] infra] make_generator
|
||||||
|
----------------------------------------------------
|
||||||
|
[[0 0] [dup [spiral_next] infra] codireco]
|
||||||
|
|
||||||
|
Here it is in action:
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
J('[0 0] [dup [spiral_next] infra] make_generator x x x x pop')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
[0 0] [0 1] [-1 1] [-1 0]
|
||||||
|
|
||||||
|
|
||||||
|
Four ``x`` combinators, four pairs of coordinates.
|
||||||
|
|
||||||
|
Conclusion
|
||||||
|
----------
|
||||||
|
|
||||||
|
So that's an example of Joy code. It's a straightforward translation of
|
||||||
|
the original. It's a little long for a single definition, you might
|
||||||
|
break it up like so:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
_spn_P ::= [[abs] ii <=] [[<>] [pop !-] ||] &&
|
||||||
|
|
||||||
|
_spn_T ::= [ !-] [[++]] [[--]] ifte dip
|
||||||
|
_spn_E ::= [pop !-] [--] [++] ifte
|
||||||
|
|
||||||
|
spiral_next ::= _spn_P [_spn_E] [_spn_T] branch
|
||||||
|
|
||||||
|
This way it's easy to see that the function is a branch with two
|
||||||
|
quasi-symmetrical paths.
|
||||||
|
|
||||||
|
We then used this function to make a simple generator of coordinate
|
||||||
|
pairs, where the next pair in the series can be generated at any time by
|
||||||
|
using the ``x`` combinator on the generator (which is just a quoted
|
||||||
|
expression containing a copy of the current pair and the "stepper
|
||||||
|
function" to generate the next pair from that.)
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
define('_spn_P [[abs] ii <=] [[<>] [pop !-] ||] &&')
|
||||||
|
define('_spn_T [!-] [[++]] [[--]] ifte dip')
|
||||||
|
define('_spn_E [pop !-] [--] [++] ifte')
|
||||||
|
define('spiral_next _spn_P [_spn_E] [_spn_T] branch')
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
V('23 18 spiral_next')
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
. 23 18 spiral_next
|
||||||
|
23 . 18 spiral_next
|
||||||
|
23 18 . spiral_next
|
||||||
|
23 18 . _spn_P [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [[abs] ii <=] [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . [[<>] [pop !-] ||] && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] . && [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] . [nullary] cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[<>] [pop !-] ||] [nullary] . cons [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] . [nullary [0]] dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [[[<>] [pop !-] ||] nullary] [nullary [0]] . dip branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . nullary [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] . [stack] dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [stack] . dinfrirst [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [[abs] ii <=] [stack] . dip infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . stack [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [18 23] . [[abs] ii <=] infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [18 23] [[abs] ii <=] . infra first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [abs] ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . ii <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . [dip] dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] [dip] . dupdip i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . dip [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 . abs 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 . 18 [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . [abs] i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [abs] . i <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . abs <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . <= [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
False . [18 23] swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
False [18 23] . swaack first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 [False] . first [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False . [0] [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False [0] . [[[<>] [pop !-] ||] nullary] branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 False [0] [[[<>] [pop !-] ||] nullary] . branch [_spn_E] [_spn_T] branch
|
||||||
|
23 18 . 0 [_spn_E] [_spn_T] branch
|
||||||
|
23 18 0 . [_spn_E] [_spn_T] branch
|
||||||
|
23 18 0 [_spn_E] . [_spn_T] branch
|
||||||
|
23 18 0 [_spn_E] [_spn_T] . branch
|
||||||
|
23 18 . _spn_E
|
||||||
|
23 18 . [pop !-] [--] [++] ifte
|
||||||
|
23 18 [pop !-] . [--] [++] ifte
|
||||||
|
23 18 [pop !-] [--] . [++] ifte
|
||||||
|
23 18 [pop !-] [--] [++] . ifte
|
||||||
|
23 18 [pop !-] [--] [++] . [nullary not] dipd branch
|
||||||
|
23 18 [pop !-] [--] [++] [nullary not] . dipd branch
|
||||||
|
23 18 [pop !-] . nullary not [--] [++] branch
|
||||||
|
23 18 [pop !-] . [stack] dinfrirst not [--] [++] branch
|
||||||
|
23 18 [pop !-] [stack] . dinfrirst not [--] [++] branch
|
||||||
|
23 18 [pop !-] [stack] . dip infra first not [--] [++] branch
|
||||||
|
23 18 . stack [pop !-] infra first not [--] [++] branch
|
||||||
|
23 18 [18 23] . [pop !-] infra first not [--] [++] branch
|
||||||
|
23 18 [18 23] [pop !-] . infra first not [--] [++] branch
|
||||||
|
23 18 . pop !- [18 23] swaack first not [--] [++] branch
|
||||||
|
23 . !- [18 23] swaack first not [--] [++] branch
|
||||||
|
23 . 0 >= [18 23] swaack first not [--] [++] branch
|
||||||
|
23 0 . >= [18 23] swaack first not [--] [++] branch
|
||||||
|
True . [18 23] swaack first not [--] [++] branch
|
||||||
|
True [18 23] . swaack first not [--] [++] branch
|
||||||
|
23 18 [True] . first not [--] [++] branch
|
||||||
|
23 18 True . not [--] [++] branch
|
||||||
|
23 18 False . [--] [++] branch
|
||||||
|
23 18 False [--] . [++] branch
|
||||||
|
23 18 False [--] [++] . branch
|
||||||
|
23 18 . --
|
||||||
|
23 17 .
|
||||||
|
|
||||||
|
|
@ -148,11 +148,11 @@ Working backwards:
|
||||||
Define ``treestep``
|
Define ``treestep``
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import D, J, V, define, DefinitionWrapper
|
from notebook_preamble import D, J, V, define, DefinitionWrapper
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
DefinitionWrapper.add_definitions('''
|
DefinitionWrapper.add_definitions('''
|
||||||
|
|
||||||
|
|
@ -173,7 +173,7 @@ all nodes in a tree with this function:
|
||||||
|
|
||||||
sumtree == [pop 0] [] [sum +] treestep
|
sumtree == [pop 0] [] [sum +] treestep
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('sumtree == [pop 0] [] [sum +] treestep')
|
define('sumtree == [pop 0] [] [sum +] treestep')
|
||||||
|
|
||||||
|
|
@ -185,7 +185,7 @@ Running this function on an empty tree value gives zero:
|
||||||
------------------------------------
|
------------------------------------
|
||||||
0
|
0
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[] sumtree') # Empty tree.
|
J('[] sumtree') # Empty tree.
|
||||||
|
|
||||||
|
|
@ -205,7 +205,7 @@ Running it on a non-empty node:
|
||||||
n m +
|
n m +
|
||||||
n+m
|
n+m
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23] sumtree') # No child trees.
|
J('[23] sumtree') # No child trees.
|
||||||
|
|
||||||
|
|
@ -215,7 +215,7 @@ Running it on a non-empty node:
|
||||||
23
|
23
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 []] sumtree') # Child tree, empty.
|
J('[23 []] sumtree') # Child tree, empty.
|
||||||
|
|
||||||
|
|
@ -225,7 +225,7 @@ Running it on a non-empty node:
|
||||||
23
|
23
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [4]] [3]] sumtree') # Non-empty child trees.
|
J('[23 [2 [4]] [3]] sumtree') # Non-empty child trees.
|
||||||
|
|
||||||
|
|
@ -235,7 +235,7 @@ Running it on a non-empty node:
|
||||||
32
|
32
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] sumtree') # Etc...
|
J('[23 [2 [8] [9]] [3] [4 []]] sumtree') # Etc...
|
||||||
|
|
||||||
|
|
@ -245,7 +245,7 @@ Running it on a non-empty node:
|
||||||
49
|
49
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [] [cons sum] treestep') # Alternate "spelling".
|
J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [] [cons sum] treestep') # Alternate "spelling".
|
||||||
|
|
||||||
|
|
@ -255,7 +255,7 @@ Running it on a non-empty node:
|
||||||
49
|
49
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 23] [cons] treestep') # Replace each node.
|
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 23] [cons] treestep') # Replace each node.
|
||||||
|
|
||||||
|
|
@ -265,7 +265,7 @@ Running it on a non-empty node:
|
||||||
[23 [23 [23] [23]] [23] [23 []]]
|
[23 [23 [23] [23]] [23] [23 []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep')
|
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep')
|
||||||
|
|
||||||
|
|
@ -275,7 +275,7 @@ Running it on a non-empty node:
|
||||||
[1 [1 [1] [1]] [1] [1 []]]
|
[1 [1 [1] [1]] [1] [1 []]]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree')
|
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree')
|
||||||
|
|
||||||
|
|
@ -285,7 +285,7 @@ Running it on a non-empty node:
|
||||||
6
|
6
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
||||||
|
|
||||||
|
|
@ -295,7 +295,7 @@ Running it on a non-empty node:
|
||||||
6
|
6
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[4 [3 [] [7]]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
J('[4 [3 [] [7]]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
||||||
|
|
||||||
|
|
@ -339,7 +339,7 @@ Traversal
|
||||||
|
|
||||||
This doesn’t quite work:
|
This doesn’t quite work:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[[3 0] [[2 0] [][]] [[9 0] [[5 0] [[4 0] [][]] [[8 0] [[6 0] [] [[7 0] [][]]][]]][]]] ["B"] [first] [i] treestep')
|
J('[[3 0] [[2 0] [][]] [[9 0] [[5 0] [[4 0] [][]] [[8 0] [[6 0] [] [[7 0] [][]]][]]][]]] ["B"] [first] [i] treestep')
|
||||||
|
|
||||||
|
|
@ -369,7 +369,7 @@ So:
|
||||||
|
|
||||||
[] [first] [flatten cons] treestep
|
[] [first] [flatten cons] treestep
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [first] [flatten cons] treestep')
|
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [first] [flatten cons] treestep')
|
||||||
|
|
||||||
|
|
@ -401,7 +401,7 @@ So:
|
||||||
|
|
||||||
[] [i roll< swons concat] [first] treestep
|
[] [i roll< swons concat] [first] treestep
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [uncons pop] [i roll< swons concat] treestep')
|
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [uncons pop] [i roll< swons concat] treestep')
|
||||||
|
|
||||||
|
|
@ -429,7 +429,7 @@ Plugging in our BTree structure:
|
||||||
|
|
||||||
[key value] N [left right] [K] C
|
[key value] N [left right] [K] C
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind')
|
J('[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind')
|
||||||
|
|
||||||
|
|
@ -444,7 +444,7 @@ Plugging in our BTree structure:
|
||||||
|
|
||||||
Iteration through the nodes
|
Iteration through the nodes
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] ["N"] [step] treegrind')
|
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] ["N"] [step] treegrind')
|
||||||
|
|
||||||
|
|
@ -456,7 +456,7 @@ Iteration through the nodes
|
||||||
|
|
||||||
Sum the nodes’ keys.
|
Sum the nodes’ keys.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('0 [[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] [first +] [step] treegrind')
|
J('0 [[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] [first +] [step] treegrind')
|
||||||
|
|
||||||
|
|
@ -468,7 +468,7 @@ Sum the nodes’ keys.
|
||||||
|
|
||||||
Rebuild the tree using ``map`` (imitating ``treestep``.)
|
Rebuild the tree using ``map`` (imitating ``treestep``.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [[100 +] infra] [map cons] treegrind')
|
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [[100 +] infra] [map cons] treegrind')
|
||||||
|
|
||||||
|
|
@ -574,7 +574,7 @@ Putting it together
|
||||||
|
|
||||||
To me, that seems simpler than the ``genrec`` version.
|
To me, that seems simpler than the ``genrec`` version.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
DefinitionWrapper.add_definitions('''
|
DefinitionWrapper.add_definitions('''
|
||||||
|
|
||||||
|
|
@ -587,7 +587,7 @@ To me, that seems simpler than the ``genrec`` version.
|
||||||
|
|
||||||
''', D)
|
''', D)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('''\
|
J('''\
|
||||||
|
|
||||||
|
|
@ -603,7 +603,7 @@ To me, that seems simpler than the ``genrec`` version.
|
||||||
15
|
15
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('''\
|
J('''\
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
Type Checking
|
Type Checking
|
||||||
=============
|
=============
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
import logging, sys
|
import logging, sys
|
||||||
|
|
||||||
|
|
@ -11,7 +11,7 @@ Type Checking
|
||||||
level=logging.INFO,
|
level=logging.INFO,
|
||||||
)
|
)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from joy.utils.types import (
|
from joy.utils.types import (
|
||||||
doc_from_stack_effect,
|
doc_from_stack_effect,
|
||||||
|
|
@ -22,7 +22,7 @@ Type Checking
|
||||||
JoyTypeError,
|
JoyTypeError,
|
||||||
)
|
)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
D = FUNCTIONS.copy()
|
D = FUNCTIONS.copy()
|
||||||
del D['product']
|
del D['product']
|
||||||
|
|
@ -31,7 +31,7 @@ Type Checking
|
||||||
An Example
|
An Example
|
||||||
----------
|
----------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
fi, fo = infer(pop, swap, rolldown, rrest, ccons)[0]
|
fi, fo = infer(pop, swap, rolldown, rrest, ccons)[0]
|
||||||
|
|
||||||
|
|
@ -46,7 +46,7 @@ An Example
|
||||||
40 ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) ∘
|
40 ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) ∘
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(fi, fo)
|
print doc_from_stack_effect(fi, fo)
|
||||||
|
|
||||||
|
|
@ -56,13 +56,13 @@ An Example
|
||||||
([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1])
|
([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from joy.parser import text_to_expression
|
from joy.parser import text_to_expression
|
||||||
from joy.utils.stack import stack_to_string
|
from joy.utils.stack import stack_to_string
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
e = text_to_expression('0 1 2 [3 4]') # reverse order
|
e = text_to_expression('0 1 2 [3 4]') # reverse order
|
||||||
print stack_to_string(e)
|
print stack_to_string(e)
|
||||||
|
|
@ -73,7 +73,7 @@ An Example
|
||||||
[3 4] 2 1 0
|
[3 4] 2 1 0
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
u = unify(e, fi)[0]
|
u = unify(e, fi)[0]
|
||||||
u
|
u
|
||||||
|
|
@ -87,7 +87,7 @@ An Example
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
g = reify(u, (fi, fo))
|
g = reify(u, (fi, fo))
|
||||||
print doc_from_stack_effect(*g)
|
print doc_from_stack_effect(*g)
|
||||||
|
|
@ -101,11 +101,11 @@ An Example
|
||||||
Unification Works “in Reverse”
|
Unification Works “in Reverse”
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
e = text_to_expression('[2 3]')
|
e = text_to_expression('[2 3]')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
u = unify(e, fo)[0] # output side, not input side
|
u = unify(e, fo)[0] # output side, not input side
|
||||||
u
|
u
|
||||||
|
|
@ -119,7 +119,7 @@ Unification Works “in Reverse”
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
g = reify(u, (fi, fo))
|
g = reify(u, (fi, fo))
|
||||||
print doc_from_stack_effect(*g)
|
print doc_from_stack_effect(*g)
|
||||||
|
|
@ -133,7 +133,7 @@ Unification Works “in Reverse”
|
||||||
Failing a Check
|
Failing a Check
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
fi, fo = infer(dup, mul)[0]
|
fi, fo = infer(dup, mul)[0]
|
||||||
|
|
||||||
|
|
@ -146,7 +146,7 @@ Failing a Check
|
||||||
31 (i1 -- i2) ∘
|
31 (i1 -- i2) ∘
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
e = text_to_expression('"two"')
|
e = text_to_expression('"two"')
|
||||||
print stack_to_string(e)
|
print stack_to_string(e)
|
||||||
|
|
@ -157,7 +157,7 @@ Failing a Check
|
||||||
'two'
|
'two'
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
try:
|
try:
|
||||||
unify(e, fi)
|
unify(e, fi)
|
||||||
|
|
|
||||||
|
|
@ -184,7 +184,7 @@ Compiling ``pop∘swap∘roll<``
|
||||||
|
|
||||||
The simplest way to “compile” this function would be something like:
|
The simplest way to “compile” this function would be something like:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def poswrd(s, e, d):
|
def poswrd(s, e, d):
|
||||||
return rolldown(*swap(*pop(s, e, d)))
|
return rolldown(*swap(*pop(s, e, d)))
|
||||||
|
|
@ -200,7 +200,7 @@ Looking ahead for a moment, from the stack effect comment:
|
||||||
|
|
||||||
We should be able to directly write out a Python function like:
|
We should be able to directly write out a Python function like:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def poswrd(stack):
|
def poswrd(stack):
|
||||||
(_, (a, (b, (c, stack)))) = stack
|
(_, (a, (b, (c, stack)))) = stack
|
||||||
|
|
@ -393,7 +393,7 @@ And there you have it, the stack effect for
|
||||||
From this stack effect comment it should be possible to construct the
|
From this stack effect comment it should be possible to construct the
|
||||||
following Python code:
|
following Python code:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def F(stack):
|
def F(stack):
|
||||||
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
||||||
|
|
@ -408,7 +408,7 @@ Representing Stack Effect Comments in Python
|
||||||
I’m going to use pairs of tuples of type descriptors, which will be
|
I’m going to use pairs of tuples of type descriptors, which will be
|
||||||
integers or tuples of type descriptors:
|
integers or tuples of type descriptors:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
roll_dn = (1, 2, 3), (2, 3, 1)
|
roll_dn = (1, 2, 3), (2, 3, 1)
|
||||||
|
|
||||||
|
|
@ -419,7 +419,7 @@ integers or tuples of type descriptors:
|
||||||
``compose()``
|
``compose()``
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compose(f, g):
|
def compose(f, g):
|
||||||
|
|
||||||
|
|
@ -465,7 +465,7 @@ integers or tuples of type descriptors:
|
||||||
``unify()``
|
``unify()``
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def unify(u, v, s=None):
|
def unify(u, v, s=None):
|
||||||
if s is None:
|
if s is None:
|
||||||
|
|
@ -483,7 +483,7 @@ integers or tuples of type descriptors:
|
||||||
``update()``
|
``update()``
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def update(s, term):
|
def update(s, term):
|
||||||
if not isinstance(term, tuple):
|
if not isinstance(term, tuple):
|
||||||
|
|
@ -493,7 +493,7 @@ integers or tuples of type descriptors:
|
||||||
``relabel()``
|
``relabel()``
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def relabel(left, right):
|
def relabel(left, right):
|
||||||
return left, _1000(right)
|
return left, _1000(right)
|
||||||
|
|
@ -517,7 +517,7 @@ integers or tuples of type descriptors:
|
||||||
``delabel()``
|
``delabel()``
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def delabel(f):
|
def delabel(f):
|
||||||
s = {u: i for i, u in enumerate(sorted(_unique(f)))}
|
s = {u: i for i, u in enumerate(sorted(_unique(f)))}
|
||||||
|
|
@ -551,7 +551,7 @@ At last we put it all together in a function ``C()`` that accepts two
|
||||||
stack effect comments and returns their composition (or raises and
|
stack effect comments and returns their composition (or raises and
|
||||||
exception if they can’t be composed due to type conflicts.)
|
exception if they can’t be composed due to type conflicts.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def C(f, g):
|
def C(f, g):
|
||||||
f, g = relabel(f, g)
|
f, g = relabel(f, g)
|
||||||
|
|
@ -560,7 +560,7 @@ exception if they can’t be composed due to type conflicts.)
|
||||||
|
|
||||||
Let’s try it out.
|
Let’s try it out.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(pop, swap)
|
C(pop, swap)
|
||||||
|
|
||||||
|
|
@ -573,7 +573,7 @@ Let’s try it out.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(C(pop, swap), roll_dn)
|
C(C(pop, swap), roll_dn)
|
||||||
|
|
||||||
|
|
@ -586,7 +586,7 @@ Let’s try it out.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(swap, roll_dn)
|
C(swap, roll_dn)
|
||||||
|
|
||||||
|
|
@ -599,7 +599,7 @@ Let’s try it out.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(pop, C(swap, roll_dn))
|
C(pop, C(swap, roll_dn))
|
||||||
|
|
||||||
|
|
@ -612,7 +612,7 @@ Let’s try it out.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
poswrd = reduce(C, (pop, swap, roll_dn))
|
poswrd = reduce(C, (pop, swap, roll_dn))
|
||||||
poswrd
|
poswrd
|
||||||
|
|
@ -633,13 +633,13 @@ Here’s that trick to represent functions like ``rest`` and ``cons`` that
|
||||||
manipulate stacks. We use a cons-list of tuples and give the tails their
|
manipulate stacks. We use a cons-list of tuples and give the tails their
|
||||||
own numbers. Then everything above already works.
|
own numbers. Then everything above already works.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
rest = ((1, 2),), (2,)
|
rest = ((1, 2),), (2,)
|
||||||
|
|
||||||
cons = (1, 2), ((1, 2),)
|
cons = (1, 2), ((1, 2),)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(poswrd, rest)
|
C(poswrd, rest)
|
||||||
|
|
||||||
|
|
@ -671,7 +671,7 @@ The translation table, if you will, would be:
|
||||||
0: 0,
|
0: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
F = reduce(C, (pop, swap, roll_dn, rest, rest, cons, cons))
|
F = reduce(C, (pop, swap, roll_dn, rest, rest, cons, cons))
|
||||||
|
|
||||||
|
|
@ -699,11 +699,11 @@ Dealing with ``cons`` and ``uncons``
|
||||||
However, if we try to compose e.g. ``cons`` and ``uncons`` it won’t
|
However, if we try to compose e.g. ``cons`` and ``uncons`` it won’t
|
||||||
work:
|
work:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
uncons = ((1, 2),), (1, 2)
|
uncons = ((1, 2),), (1, 2)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
try:
|
try:
|
||||||
C(cons, uncons)
|
C(cons, uncons)
|
||||||
|
|
@ -723,7 +723,7 @@ The problem is that the ``unify()`` function as written doesn’t handle
|
||||||
the case when both terms are tuples. We just have to add a clause to
|
the case when both terms are tuples. We just have to add a clause to
|
||||||
deal with this recursively:
|
deal with this recursively:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def unify(u, v, s=None):
|
def unify(u, v, s=None):
|
||||||
if s is None:
|
if s is None:
|
||||||
|
|
@ -753,7 +753,7 @@ deal with this recursively:
|
||||||
|
|
||||||
return s
|
return s
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(cons, uncons)
|
C(cons, uncons)
|
||||||
|
|
||||||
|
|
@ -771,7 +771,7 @@ Part III: Compiling Yin Functions
|
||||||
|
|
||||||
Now consider the Python function we would like to derive:
|
Now consider the Python function we would like to derive:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def F_python(stack):
|
def F_python(stack):
|
||||||
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
||||||
|
|
@ -779,7 +779,7 @@ Now consider the Python function we would like to derive:
|
||||||
|
|
||||||
And compare it to the input stack effect comment tuple we just computed:
|
And compare it to the input stack effect comment tuple we just computed:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
F[0]
|
F[0]
|
||||||
|
|
||||||
|
|
@ -816,7 +816,7 @@ Eh?
|
||||||
|
|
||||||
And the return tuple
|
And the return tuple
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
F[1]
|
F[1]
|
||||||
|
|
||||||
|
|
@ -848,7 +848,7 @@ Python Identifiers
|
||||||
We want to substitute Python identifiers for the integers. I’m going to
|
We want to substitute Python identifiers for the integers. I’m going to
|
||||||
repurpose ``joy.parser.Symbol`` class for this:
|
repurpose ``joy.parser.Symbol`` class for this:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from joy.parser import Symbol
|
from joy.parser import Symbol
|
||||||
|
|
@ -874,7 +874,7 @@ effect comment tuples to reasonable text format. There are some details
|
||||||
in how this code works that related to stuff later in the notebook, so
|
in how this code works that related to stuff later in the notebook, so
|
||||||
you should skip it for now and read it later if you’re interested.
|
you should skip it for now and read it later if you’re interested.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def doc_from_stack_effect(inputs, outputs):
|
def doc_from_stack_effect(inputs, outputs):
|
||||||
return '(%s--%s)' % (
|
return '(%s--%s)' % (
|
||||||
|
|
@ -914,7 +914,7 @@ Now we can write a compiler function to emit Python source code. (The
|
||||||
underscore suffix distiguishes it from the built-in ``compile()``
|
underscore suffix distiguishes it from the built-in ``compile()``
|
||||||
function.)
|
function.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compile_(name, f, doc=None):
|
def compile_(name, f, doc=None):
|
||||||
if doc is None:
|
if doc is None:
|
||||||
|
|
@ -932,7 +932,7 @@ function.)
|
||||||
|
|
||||||
Here it is in action:
|
Here it is in action:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
source = compile_('F', F)
|
source = compile_('F', F)
|
||||||
|
|
||||||
|
|
@ -949,7 +949,7 @@ Here it is in action:
|
||||||
|
|
||||||
Compare:
|
Compare:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def F_python(stack):
|
def F_python(stack):
|
||||||
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
||||||
|
|
@ -957,7 +957,7 @@ Compare:
|
||||||
|
|
||||||
Next steps:
|
Next steps:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
L = {}
|
L = {}
|
||||||
|
|
||||||
|
|
@ -976,16 +976,16 @@ Next steps:
|
||||||
|
|
||||||
Let’s try it out:
|
Let’s try it out:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import D, J, V
|
from notebook_preamble import D, J, V
|
||||||
from joy.library import SimpleFunctionWrapper
|
from joy.library import SimpleFunctionWrapper
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
D['F'] = SimpleFunctionWrapper(L['F'])
|
D['F'] = SimpleFunctionWrapper(L['F'])
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[4 5 ...] 2 3 1 F')
|
J('[4 5 ...] 2 3 1 F')
|
||||||
|
|
||||||
|
|
@ -1012,7 +1012,7 @@ Compiling Library Functions
|
||||||
We can use ``compile_()`` to generate many primitives in the library
|
We can use ``compile_()`` to generate many primitives in the library
|
||||||
from their stack effect comments:
|
from their stack effect comments:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def defs():
|
def defs():
|
||||||
|
|
||||||
|
|
@ -1036,7 +1036,7 @@ from their stack effect comments:
|
||||||
|
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for name, stack_effect_comment in sorted(defs().items()):
|
for name, stack_effect_comment in sorted(defs().items()):
|
||||||
print
|
print
|
||||||
|
|
@ -1205,7 +1205,7 @@ Python class hierarchy of Joy types and use the ``issubclass()`` method
|
||||||
to establish domain ordering, as well as other handy behaviour that will
|
to establish domain ordering, as well as other handy behaviour that will
|
||||||
make it fairly easy to reuse most of the code above.
|
make it fairly easy to reuse most of the code above.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class AnyJoyType(object):
|
class AnyJoyType(object):
|
||||||
|
|
||||||
|
|
@ -1251,14 +1251,14 @@ make it fairly easy to reuse most of the code above.
|
||||||
|
|
||||||
Mess with it a little:
|
Mess with it a little:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from itertools import permutations
|
from itertools import permutations
|
||||||
|
|
||||||
“Any” types can be specialized to numbers and stacks, but not vice
|
“Any” types can be specialized to numbers and stacks, but not vice
|
||||||
versa:
|
versa:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for a, b in permutations((A[0], N[0], S[0]), 2):
|
for a, b in permutations((A[0], N[0], S[0]), 2):
|
||||||
print a, '>=', b, '->', a >= b
|
print a, '>=', b, '->', a >= b
|
||||||
|
|
@ -1278,7 +1278,7 @@ Our crude `Numerical
|
||||||
Tower <https://en.wikipedia.org/wiki/Numerical_tower>`__ of *numbers* >
|
Tower <https://en.wikipedia.org/wiki/Numerical_tower>`__ of *numbers* >
|
||||||
*floats* > *integers* works as well (but we’re not going to use it yet):
|
*floats* > *integers* works as well (but we’re not going to use it yet):
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for a, b in permutations((A[0], N[0], FloatJoyType(0), IntJoyType(0)), 2):
|
for a, b in permutations((A[0], N[0], FloatJoyType(0), IntJoyType(0)), 2):
|
||||||
print a, '>=', b, '->', a >= b
|
print a, '>=', b, '->', a >= b
|
||||||
|
|
@ -1303,13 +1303,13 @@ Tower <https://en.wikipedia.org/wiki/Numerical_tower>`__ of *numbers* >
|
||||||
Typing ``sqr``
|
Typing ``sqr``
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
dup = (A[1],), (A[1], A[1])
|
dup = (A[1],), (A[1], A[1])
|
||||||
|
|
||||||
mul = (N[1], N[2]), (N[3],)
|
mul = (N[1], N[2]), (N[3],)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
dup
|
dup
|
||||||
|
|
||||||
|
|
@ -1322,7 +1322,7 @@ Typing ``sqr``
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
mul
|
mul
|
||||||
|
|
||||||
|
|
@ -1340,7 +1340,7 @@ Modifying the Inferencer
|
||||||
|
|
||||||
Re-labeling still works fine:
|
Re-labeling still works fine:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
foo = relabel(dup, mul)
|
foo = relabel(dup, mul)
|
||||||
|
|
||||||
|
|
@ -1361,7 +1361,7 @@ Re-labeling still works fine:
|
||||||
The ``delabel()`` function needs an overhaul. It now has to keep track
|
The ``delabel()`` function needs an overhaul. It now has to keep track
|
||||||
of how many labels of each domain it has “seen”.
|
of how many labels of each domain it has “seen”.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from collections import Counter
|
from collections import Counter
|
||||||
|
|
||||||
|
|
@ -1383,7 +1383,7 @@ of how many labels of each domain it has “seen”.
|
||||||
|
|
||||||
return tuple(delabel(inner, seen, c) for inner in f)
|
return tuple(delabel(inner, seen, c) for inner in f)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
delabel(foo)
|
delabel(foo)
|
||||||
|
|
||||||
|
|
@ -1399,7 +1399,7 @@ of how many labels of each domain it has “seen”.
|
||||||
``unify()`` version 3
|
``unify()`` version 3
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def unify(u, v, s=None):
|
def unify(u, v, s=None):
|
||||||
if s is None:
|
if s is None:
|
||||||
|
|
@ -1449,7 +1449,7 @@ of how many labels of each domain it has “seen”.
|
||||||
|
|
||||||
Rewrite the stack effect comments:
|
Rewrite the stack effect comments:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def defs():
|
def defs():
|
||||||
|
|
||||||
|
|
@ -1503,11 +1503,11 @@ Rewrite the stack effect comments:
|
||||||
|
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
DEFS = defs()
|
DEFS = defs()
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for name, stack_effect_comment in sorted(DEFS.items()):
|
for name, stack_effect_comment in sorted(DEFS.items()):
|
||||||
print name, '=', doc_from_stack_effect(*stack_effect_comment)
|
print name, '=', doc_from_stack_effect(*stack_effect_comment)
|
||||||
|
|
@ -1543,14 +1543,14 @@ Rewrite the stack effect comments:
|
||||||
uncons = ([a1 .1.] -- a1 [.1.])
|
uncons = ([a1 .1.] -- a1 [.1.])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
globals().update(DEFS)
|
globals().update(DEFS)
|
||||||
|
|
||||||
Compose ``dup`` and ``mul``
|
Compose ``dup`` and ``mul``
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(dup, mul)
|
C(dup, mul)
|
||||||
|
|
||||||
|
|
@ -1565,7 +1565,7 @@ Compose ``dup`` and ``mul``
|
||||||
|
|
||||||
Revisit the ``F`` function, works fine.
|
Revisit the ``F`` function, works fine.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))
|
F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))
|
||||||
F
|
F
|
||||||
|
|
@ -1579,7 +1579,7 @@ Revisit the ``F`` function, works fine.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*F)
|
print doc_from_stack_effect(*F)
|
||||||
|
|
||||||
|
|
@ -1592,12 +1592,12 @@ Revisit the ``F`` function, works fine.
|
||||||
Some otherwise inefficient functions are no longer to be feared. We can
|
Some otherwise inefficient functions are no longer to be feared. We can
|
||||||
also get the effect of combinators in some limited cases.
|
also get the effect of combinators in some limited cases.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def neato(*funcs):
|
def neato(*funcs):
|
||||||
print doc_from_stack_effect(*reduce(C, funcs))
|
print doc_from_stack_effect(*reduce(C, funcs))
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
# e.g. [swap] dip
|
# e.g. [swap] dip
|
||||||
neato(rollup, swap, rolldown)
|
neato(rollup, swap, rolldown)
|
||||||
|
|
@ -1608,7 +1608,7 @@ also get the effect of combinators in some limited cases.
|
||||||
(a1 a2 a3 -- a2 a1 a3)
|
(a1 a2 a3 -- a2 a1 a3)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
# e.g. [popop] dipd
|
# e.g. [popop] dipd
|
||||||
neato(popdd, rolldown, pop)
|
neato(popdd, rolldown, pop)
|
||||||
|
|
@ -1619,7 +1619,7 @@ also get the effect of combinators in some limited cases.
|
||||||
(a1 a2 a3 a4 -- a3 a4)
|
(a1 a2 a3 a4 -- a3 a4)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
# Reverse the order of the top three items.
|
# Reverse the order of the top three items.
|
||||||
neato(rollup, swap)
|
neato(rollup, swap)
|
||||||
|
|
@ -1636,7 +1636,7 @@ also get the effect of combinators in some limited cases.
|
||||||
Because the type labels represent themselves as valid Python identifiers
|
Because the type labels represent themselves as valid Python identifiers
|
||||||
the ``compile_()`` function doesn’t need to generate them anymore:
|
the ``compile_()`` function doesn’t need to generate them anymore:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compile_(name, f, doc=None):
|
def compile_(name, f, doc=None):
|
||||||
inputs, outputs = f
|
inputs, outputs = f
|
||||||
|
|
@ -1652,7 +1652,7 @@ the ``compile_()`` function doesn’t need to generate them anymore:
|
||||||
%s = stack
|
%s = stack
|
||||||
return %s''' % (name, doc, i, o)
|
return %s''' % (name, doc, i, o)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print compile_('F', F)
|
print compile_('F', F)
|
||||||
|
|
||||||
|
|
@ -1668,7 +1668,7 @@ the ``compile_()`` function doesn’t need to generate them anymore:
|
||||||
But it cannot magically create new functions that involve e.g. math and
|
But it cannot magically create new functions that involve e.g. math and
|
||||||
such. Note that this is *not* a ``sqr`` function implementation:
|
such. Note that this is *not* a ``sqr`` function implementation:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print compile_('sqr', C(dup, mul))
|
print compile_('sqr', C(dup, mul))
|
||||||
|
|
||||||
|
|
@ -1696,7 +1696,7 @@ The functions that *can* be compiled are the ones that have only
|
||||||
``AnyJoyType`` and ``StackJoyType`` labels in their stack effect
|
``AnyJoyType`` and ``StackJoyType`` labels in their stack effect
|
||||||
comments. We can write a function to check that:
|
comments. We can write a function to check that:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from itertools import imap
|
from itertools import imap
|
||||||
|
|
||||||
|
|
@ -1704,7 +1704,7 @@ comments. We can write a function to check that:
|
||||||
def compilable(f):
|
def compilable(f):
|
||||||
return isinstance(f, tuple) and all(imap(compilable, f)) or stacky(f)
|
return isinstance(f, tuple) and all(imap(compilable, f)) or stacky(f)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for name, stack_effect_comment in sorted(defs().items()):
|
for name, stack_effect_comment in sorted(defs().items()):
|
||||||
if compilable(stack_effect_comment):
|
if compilable(stack_effect_comment):
|
||||||
|
|
@ -1828,7 +1828,7 @@ the “truthiness” of ``StackJoyType`` to false to let e.g.
|
||||||
``joy.utils.stack.concat`` work with our stack effect comment cons-list
|
``joy.utils.stack.concat`` work with our stack effect comment cons-list
|
||||||
tuples.)
|
tuples.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compose(f, g):
|
def compose(f, g):
|
||||||
(f_in, f_out), (g_in, g_out) = f, g
|
(f_in, f_out), (g_in, g_out) = f, g
|
||||||
|
|
@ -1840,7 +1840,7 @@ tuples.)
|
||||||
I don’t want to rewrite all the defs myself, so I’ll write a little
|
I don’t want to rewrite all the defs myself, so I’ll write a little
|
||||||
conversion function instead. This is programmer’s laziness.
|
conversion function instead. This is programmer’s laziness.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def sequence_to_stack(seq, stack=StackJoyType(23)):
|
def sequence_to_stack(seq, stack=StackJoyType(23)):
|
||||||
for item in seq: stack = item, stack
|
for item in seq: stack = item, stack
|
||||||
|
|
@ -1854,7 +1854,7 @@ conversion function instead. This is programmer’s laziness.
|
||||||
NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1])
|
NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1])
|
||||||
globals().update(NEW_DEFS)
|
globals().update(NEW_DEFS)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(stack, uncons)
|
C(stack, uncons)
|
||||||
|
|
||||||
|
|
@ -1867,7 +1867,7 @@ conversion function instead. This is programmer’s laziness.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
reduce(C, (stack, uncons, uncons))
|
reduce(C, (stack, uncons, uncons))
|
||||||
|
|
||||||
|
|
@ -1887,7 +1887,7 @@ The display function should be changed too.
|
||||||
|
|
||||||
Clunky junk, but it will suffice for now.
|
Clunky junk, but it will suffice for now.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def doc_from_stack_effect(inputs, outputs):
|
def doc_from_stack_effect(inputs, outputs):
|
||||||
switch = [False] # Do we need to display the '...' for the rest of the main stack?
|
switch = [False] # Do we need to display the '...' for the rest of the main stack?
|
||||||
|
|
@ -1935,7 +1935,7 @@ Clunky junk, but it will suffice for now.
|
||||||
a.append(end)
|
a.append(end)
|
||||||
return '[%s]' % ' '.join(a)
|
return '[%s]' % ' '.join(a)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for name, stack_effect_comment in sorted(NEW_DEFS.items()):
|
for name, stack_effect_comment in sorted(NEW_DEFS.items()):
|
||||||
print name, '=', doc_from_stack_effect(*stack_effect_comment)
|
print name, '=', doc_from_stack_effect(*stack_effect_comment)
|
||||||
|
|
@ -1973,7 +1973,7 @@ Clunky junk, but it will suffice for now.
|
||||||
uncons = ([a1 .1.] -- a1 [.1.])
|
uncons = ([a1 .1.] -- a1 [.1.])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print ; print doc_from_stack_effect(*stack)
|
print ; print doc_from_stack_effect(*stack)
|
||||||
print ; print doc_from_stack_effect(*C(stack, uncons))
|
print ; print doc_from_stack_effect(*C(stack, uncons))
|
||||||
|
|
@ -1993,7 +1993,7 @@ Clunky junk, but it will suffice for now.
|
||||||
(... a1 -- ... a1 [a1 ...])
|
(... a1 -- ... a1 [a1 ...])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*C(ccons, stack))
|
print doc_from_stack_effect(*C(ccons, stack))
|
||||||
|
|
||||||
|
|
@ -2003,7 +2003,7 @@ Clunky junk, but it will suffice for now.
|
||||||
(... a2 a1 [.1.] -- ... [a2 a1 .1.] [[a2 a1 .1.] ...])
|
(... a2 a1 [.1.] -- ... [a2 a1 .1.] [[a2 a1 .1.] ...])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
Q = C(ccons, stack)
|
Q = C(ccons, stack)
|
||||||
|
|
||||||
|
|
@ -2024,7 +2024,7 @@ Clunky junk, but it will suffice for now.
|
||||||
This makes the ``compile_()`` function pretty simple as the stack effect
|
This makes the ``compile_()`` function pretty simple as the stack effect
|
||||||
comments are now already in the form needed for the Python code:
|
comments are now already in the form needed for the Python code:
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compile_(name, f, doc=None):
|
def compile_(name, f, doc=None):
|
||||||
i, o = f
|
i, o = f
|
||||||
|
|
@ -2035,7 +2035,7 @@ comments are now already in the form needed for the Python code:
|
||||||
%s = stack
|
%s = stack
|
||||||
return %s''' % (name, doc, i, o)
|
return %s''' % (name, doc, i, o)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print compile_('Q', Q)
|
print compile_('Q', Q)
|
||||||
|
|
||||||
|
|
@ -2053,12 +2053,12 @@ comments are now already in the form needed for the Python code:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
unstack = (S[1], S[0]), S[1]
|
unstack = (S[1], S[0]), S[1]
|
||||||
enstacken = S[0], (S[0], S[1])
|
enstacken = S[0], (S[0], S[1])
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*unstack)
|
print doc_from_stack_effect(*unstack)
|
||||||
|
|
||||||
|
|
@ -2068,7 +2068,7 @@ comments are now already in the form needed for the Python code:
|
||||||
([.1.] --)
|
([.1.] --)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*enstacken)
|
print doc_from_stack_effect(*enstacken)
|
||||||
|
|
||||||
|
|
@ -2078,7 +2078,7 @@ comments are now already in the form needed for the Python code:
|
||||||
(-- [.0.])
|
(-- [.0.])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*C(cons, unstack))
|
print doc_from_stack_effect(*C(cons, unstack))
|
||||||
|
|
||||||
|
|
@ -2088,7 +2088,7 @@ comments are now already in the form needed for the Python code:
|
||||||
(a1 [.1.] -- a1)
|
(a1 [.1.] -- a1)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
print doc_from_stack_effect(*C(cons, enstacken))
|
print doc_from_stack_effect(*C(cons, enstacken))
|
||||||
|
|
||||||
|
|
@ -2098,7 +2098,7 @@ comments are now already in the form needed for the Python code:
|
||||||
(a1 [.1.] -- [[a1 .1.] .2.])
|
(a1 [.1.] -- [[a1 .1.] .2.])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
C(cons, unstack)
|
C(cons, unstack)
|
||||||
|
|
||||||
|
|
@ -2117,7 +2117,7 @@ Part VI: Multiple Stack Effects
|
||||||
|
|
||||||
…
|
…
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class IntJoyType(NumberJoyType): prefix = 'i'
|
class IntJoyType(NumberJoyType): prefix = 'i'
|
||||||
|
|
||||||
|
|
@ -2125,7 +2125,7 @@ Part VI: Multiple Stack Effects
|
||||||
F = map(FloatJoyType, _R)
|
F = map(FloatJoyType, _R)
|
||||||
I = map(IntJoyType, _R)
|
I = map(IntJoyType, _R)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
muls = [
|
muls = [
|
||||||
((I[2], (I[1], S[0])), (I[3], S[0])),
|
((I[2], (I[1], S[0])), (I[3], S[0])),
|
||||||
|
|
@ -2134,7 +2134,7 @@ Part VI: Multiple Stack Effects
|
||||||
((F[2], (F[1], S[0])), (F[3], S[0])),
|
((F[2], (F[1], S[0])), (F[3], S[0])),
|
||||||
]
|
]
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for f in muls:
|
for f in muls:
|
||||||
print doc_from_stack_effect(*f)
|
print doc_from_stack_effect(*f)
|
||||||
|
|
@ -2148,7 +2148,7 @@ Part VI: Multiple Stack Effects
|
||||||
(f1 f2 -- f3)
|
(f1 f2 -- f3)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for f in muls:
|
for f in muls:
|
||||||
try:
|
try:
|
||||||
|
|
@ -2164,7 +2164,7 @@ Part VI: Multiple Stack Effects
|
||||||
(a1 -- a1 a1) (f1 f2 -- f3) (f1 -- f2)
|
(a1 -- a1 a1) (f1 f2 -- f3) (f1 -- f2)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from itertools import product
|
from itertools import product
|
||||||
|
|
||||||
|
|
@ -2180,7 +2180,7 @@ Part VI: Multiple Stack Effects
|
||||||
def MC(F, G):
|
def MC(F, G):
|
||||||
return sorted(set(meta_compose(F, G)))
|
return sorted(set(meta_compose(F, G)))
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for f in MC([dup], [mul]):
|
for f in MC([dup], [mul]):
|
||||||
print doc_from_stack_effect(*f)
|
print doc_from_stack_effect(*f)
|
||||||
|
|
@ -2191,7 +2191,7 @@ Part VI: Multiple Stack Effects
|
||||||
(n1 -- n2)
|
(n1 -- n2)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for f in MC([dup], muls):
|
for f in MC([dup], muls):
|
||||||
print doc_from_stack_effect(*f)
|
print doc_from_stack_effect(*f)
|
||||||
|
|
@ -2264,7 +2264,7 @@ Giving us two unifiers:
|
||||||
{c: a, d: b, .1.: .0.}
|
{c: a, d: b, .1.: .0.}
|
||||||
{c: a, d: e, .1.: A* b .0.}
|
{c: a, d: e, .1.: A* b .0.}
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class KleeneStar(object):
|
class KleeneStar(object):
|
||||||
|
|
||||||
|
|
@ -2314,7 +2314,7 @@ Giving us two unifiers:
|
||||||
|
|
||||||
Can now return multiple results…
|
Can now return multiple results…
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def unify(u, v, s=None):
|
def unify(u, v, s=None):
|
||||||
if s is None:
|
if s is None:
|
||||||
|
|
@ -2386,7 +2386,7 @@ Can now return multiple results…
|
||||||
def stacky(thing):
|
def stacky(thing):
|
||||||
return thing.__class__ in {AnyJoyType, StackJoyType}
|
return thing.__class__ in {AnyJoyType, StackJoyType}
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
a = (As[1], S[1])
|
a = (As[1], S[1])
|
||||||
a
|
a
|
||||||
|
|
@ -2400,7 +2400,7 @@ Can now return multiple results…
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
b = (A[1], S[2])
|
b = (A[1], S[2])
|
||||||
b
|
b
|
||||||
|
|
@ -2414,7 +2414,7 @@ Can now return multiple results…
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for result in unify(b, a):
|
for result in unify(b, a):
|
||||||
print result, '->', update(result, a), update(result, b)
|
print result, '->', update(result, a), update(result, b)
|
||||||
|
|
@ -2426,7 +2426,7 @@ Can now return multiple results…
|
||||||
{a1: a10001, s2: (a1*, s1)} -> (a1*, s1) (a10001, (a1*, s1))
|
{a1: a10001, s2: (a1*, s1)} -> (a1*, s1) (a10001, (a1*, s1))
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for result in unify(a, b):
|
for result in unify(a, b):
|
||||||
print result, '->', update(result, a), update(result, b)
|
print result, '->', update(result, a), update(result, b)
|
||||||
|
|
@ -2446,7 +2446,7 @@ Can now return multiple results…
|
||||||
|
|
||||||
(a1*, s1) [a1*] (a2, (a1*, s1)) [a2 a1*]
|
(a1*, s1) [a1*] (a2, (a1*, s1)) [a2 a1*]
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
sum_ = ((Ns[1], S[1]), S[0]), (N[0], S[0])
|
sum_ = ((Ns[1], S[1]), S[0]), (N[0], S[0])
|
||||||
|
|
||||||
|
|
@ -2458,7 +2458,7 @@ Can now return multiple results…
|
||||||
([n1* .1.] -- n0)
|
([n1* .1.] -- n0)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
f = (N[1], (N[2], (N[3], S[1]))), S[0]
|
f = (N[1], (N[2], (N[3], S[1]))), S[0]
|
||||||
|
|
||||||
|
|
@ -2470,7 +2470,7 @@ Can now return multiple results…
|
||||||
(-- [n1 n2 n3 .1.])
|
(-- [n1 n2 n3 .1.])
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for result in unify(sum_[0], f):
|
for result in unify(sum_[0], f):
|
||||||
print result, '->', update(result, sum_[1])
|
print result, '->', update(result, sum_[1])
|
||||||
|
|
@ -2489,7 +2489,7 @@ Can now return multiple results…
|
||||||
|
|
||||||
This function has to be modified to yield multiple results.
|
This function has to be modified to yield multiple results.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def compose(f, g):
|
def compose(f, g):
|
||||||
(f_in, f_out), (g_in, g_out) = f, g
|
(f_in, f_out), (g_in, g_out) = f, g
|
||||||
|
|
@ -2501,7 +2501,7 @@ This function has to be modified to yield multiple results.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def meta_compose(F, G):
|
def meta_compose(F, G):
|
||||||
for f, g in product(F, G):
|
for f, g in product(F, G):
|
||||||
|
|
@ -2517,7 +2517,7 @@ This function has to be modified to yield multiple results.
|
||||||
for fg in compose(f, g):
|
for fg in compose(f, g):
|
||||||
yield delabel(fg)
|
yield delabel(fg)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for f in MC([dup], muls):
|
for f in MC([dup], muls):
|
||||||
print doc_from_stack_effect(*f)
|
print doc_from_stack_effect(*f)
|
||||||
|
|
@ -2529,7 +2529,7 @@ This function has to be modified to yield multiple results.
|
||||||
(i1 -- i2)
|
(i1 -- i2)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2542,7 +2542,7 @@ This function has to be modified to yield multiple results.
|
||||||
([n1* .1.] -- [n1* .1.] n1)
|
([n1* .1.] -- [n1* .1.] n1)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2556,7 +2556,7 @@ This function has to be modified to yield multiple results.
|
||||||
(n1 [n1* .1.] -- n2)
|
(n1 [n1* .1.] -- n2)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
sum_ = (((N[1], (Ns[1], S[1])), S[0]), (N[0], S[0]))
|
sum_ = (((N[1], (Ns[1], S[1])), S[0]), (N[0], S[0]))
|
||||||
print doc_from_stack_effect(*cons),
|
print doc_from_stack_effect(*cons),
|
||||||
|
|
@ -2571,7 +2571,7 @@ This function has to be modified to yield multiple results.
|
||||||
(a1 [.1.] -- [a1 .1.]) ([n1 n1* .1.] -- n0) (n1 [n1* .1.] -- n2)
|
(a1 [.1.] -- [a1 .1.]) ([n1 n1* .1.] -- n0) (n1 [n1* .1.] -- n2)
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
a = (A[4], (As[1], (A[3], S[1])))
|
a = (A[4], (As[1], (A[3], S[1])))
|
||||||
a
|
a
|
||||||
|
|
@ -2585,7 +2585,7 @@ This function has to be modified to yield multiple results.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
b = (A[1], (A[2], S[2]))
|
b = (A[1], (A[2], S[2]))
|
||||||
b
|
b
|
||||||
|
|
@ -2599,7 +2599,7 @@ This function has to be modified to yield multiple results.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for result in unify(b, a):
|
for result in unify(b, a):
|
||||||
print result
|
print result
|
||||||
|
|
@ -2611,7 +2611,7 @@ This function has to be modified to yield multiple results.
|
||||||
{a1: a4, s2: (a1*, (a3, s1)), a2: a10003}
|
{a1: a4, s2: (a1*, (a3, s1)), a2: a10003}
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
for result in unify(a, b):
|
for result in unify(a, b):
|
||||||
print result
|
print result
|
||||||
|
|
@ -2681,7 +2681,7 @@ We need a type variable for Joy functions that can go in our expressions
|
||||||
and be used by the hybrid inferencer/interpreter. They have to store a
|
and be used by the hybrid inferencer/interpreter. They have to store a
|
||||||
name and a list of stack effects.
|
name and a list of stack effects.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class FunctionJoyType(AnyJoyType):
|
class FunctionJoyType(AnyJoyType):
|
||||||
|
|
||||||
|
|
@ -2703,14 +2703,14 @@ Specialized for Simple Functions and Combinators
|
||||||
For non-combinator functions the stack effects list contains stack
|
For non-combinator functions the stack effects list contains stack
|
||||||
effect comments (represented by pairs of cons-lists as described above.)
|
effect comments (represented by pairs of cons-lists as described above.)
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class SymbolJoyType(FunctionJoyType):
|
class SymbolJoyType(FunctionJoyType):
|
||||||
prefix = 'F'
|
prefix = 'F'
|
||||||
|
|
||||||
For combinators the list contains Python functions.
|
For combinators the list contains Python functions.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
class CombinatorJoyType(FunctionJoyType):
|
class CombinatorJoyType(FunctionJoyType):
|
||||||
|
|
||||||
|
|
@ -2731,7 +2731,7 @@ For combinators the list contains Python functions.
|
||||||
For simple combinators that have only one effect (like ``dip``) you only
|
For simple combinators that have only one effect (like ``dip``) you only
|
||||||
need one function and it can be the combinator itself.
|
need one function and it can be the combinator itself.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
import joy.library
|
import joy.library
|
||||||
|
|
||||||
|
|
@ -2741,7 +2741,7 @@ For combinators that can have more than one effect (like ``branch``) you
|
||||||
have to write functions that each implement the action of one of the
|
have to write functions that each implement the action of one of the
|
||||||
effects.
|
effects.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def branch_true(stack, expression, dictionary):
|
def branch_true(stack, expression, dictionary):
|
||||||
(then, (else_, (flag, stack))) = stack
|
(then, (else_, (flag, stack))) = stack
|
||||||
|
|
@ -2771,7 +2771,7 @@ updated along with the stack effects after doing unification or we risk
|
||||||
losing useful information. This was a straightforward, if awkward,
|
losing useful information. This was a straightforward, if awkward,
|
||||||
modification to the call structure of ``meta_compose()`` et. al.
|
modification to the call structure of ``meta_compose()`` et. al.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
ID = S[0], S[0] # Identity function.
|
ID = S[0], S[0] # Identity function.
|
||||||
|
|
||||||
|
|
@ -2833,7 +2833,7 @@ cruft to convert the definitions in ``DEFS`` to the new
|
||||||
``SymbolJoyType`` objects, and some combinators. Here is an example of
|
``SymbolJoyType`` objects, and some combinators. Here is an example of
|
||||||
output from the current code :
|
output from the current code :
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
1/0 # (Don't try to run this cell! It's not going to work. This is "read only" code heh..)
|
1/0 # (Don't try to run this cell! It's not going to work. This is "read only" code heh..)
|
||||||
|
|
||||||
|
|
@ -2956,7 +2956,7 @@ module. But if you’re interested in all that you should just use Prolog!
|
||||||
|
|
||||||
Anyhow, type *checking* is a few easy steps away.
|
Anyhow, type *checking* is a few easy steps away.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
def _ge(self, other):
|
def _ge(self, other):
|
||||||
return (issubclass(other.__class__, self.__class__)
|
return (issubclass(other.__class__, self.__class__)
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ Huet <https://www.st.cs.uni-saarland.de/edu/seminare/2005/advanced-fp/docs/huet-
|
||||||
Given a datastructure on the stack we can navigate through it, modify
|
Given a datastructure on the stack we can navigate through it, modify
|
||||||
it, and rebuild it using the “zipper” technique.
|
it, and rebuild it using the “zipper” technique.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
from notebook_preamble import J, V, define
|
from notebook_preamble import J, V, define
|
||||||
|
|
||||||
|
|
@ -23,7 +23,7 @@ strings, Symbols (strings that are names of functions) and sequences
|
||||||
`trees <https://en.wikipedia.org/wiki/Tree_%28data_structure%29>`__ out
|
`trees <https://en.wikipedia.org/wiki/Tree_%28data_structure%29>`__ out
|
||||||
of sequences.
|
of sequences.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 [2 [3 4 25 6] 7] 8]')
|
J('[1 [2 [3 4 25 6] 7] 8]')
|
||||||
|
|
||||||
|
|
@ -54,14 +54,14 @@ show the trace so you can see how it works. If we were going to use
|
||||||
these a lot it would make sense to write Python versions for efficiency,
|
these a lot it would make sense to write Python versions for efficiency,
|
||||||
but see below.
|
but see below.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('z-down == [] swap uncons swap')
|
define('z-down == [] swap uncons swap')
|
||||||
define('z-up == swons swap shunt')
|
define('z-up == swons swap shunt')
|
||||||
define('z-right == [swons] cons dip uncons swap')
|
define('z-right == [swons] cons dip uncons swap')
|
||||||
define('z-left == swons [uncons swap] dip swap')
|
define('z-left == swons [uncons swap] dip swap')
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[1 [2 [3 4 25 6] 7] 8] z-down')
|
V('[1 [2 [3 4 25 6] 7] 8] z-down')
|
||||||
|
|
||||||
|
|
@ -77,7 +77,7 @@ but see below.
|
||||||
[] [[2 [3 4 25 6] 7] 8] 1 .
|
[] [[2 [3 4 25 6] 7] 8] 1 .
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[] [[2 [3 4 25 6] 7] 8] 1 z-right')
|
V('[] [[2 [3 4 25 6] 7] 8] 1 z-right')
|
||||||
|
|
||||||
|
|
@ -101,7 +101,7 @@ but see below.
|
||||||
[1] [8] [2 [3 4 25 6] 7] .
|
[1] [8] [2 [3 4 25 6] 7] .
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2 [3 4 25 6] 7] z-down')
|
J('[1] [8] [2 [3 4 25 6] 7] z-down')
|
||||||
|
|
||||||
|
|
@ -111,7 +111,7 @@ but see below.
|
||||||
[1] [8] [] [[3 4 25 6] 7] 2
|
[1] [8] [] [[3 4 25 6] 7] 2
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [] [[3 4 25 6] 7] 2 z-right')
|
J('[1] [8] [] [[3 4 25 6] 7] 2 z-right')
|
||||||
|
|
||||||
|
|
@ -121,7 +121,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [3 4 25 6]
|
[1] [8] [2] [7] [3 4 25 6]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2] [7] [3 4 25 6] z-down')
|
J('[1] [8] [2] [7] [3 4 25 6] z-down')
|
||||||
|
|
||||||
|
|
@ -131,7 +131,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [] [4 25 6] 3
|
[1] [8] [2] [7] [] [4 25 6] 3
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2] [7] [] [4 25 6] 3 z-right')
|
J('[1] [8] [2] [7] [] [4 25 6] 3 z-right')
|
||||||
|
|
||||||
|
|
@ -141,7 +141,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [3] [25 6] 4
|
[1] [8] [2] [7] [3] [25 6] 4
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2] [7] [3] [25 6] 4 z-right')
|
J('[1] [8] [2] [7] [3] [25 6] 4 z-right')
|
||||||
|
|
||||||
|
|
@ -151,7 +151,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [4 3] [6] 25
|
[1] [8] [2] [7] [4 3] [6] 25
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2] [7] [4 3] [6] 25 sqr')
|
J('[1] [8] [2] [7] [4 3] [6] 25 sqr')
|
||||||
|
|
||||||
|
|
@ -161,7 +161,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [4 3] [6] 625
|
[1] [8] [2] [7] [4 3] [6] 625
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[1] [8] [2] [7] [4 3] [6] 625 z-up')
|
V('[1] [8] [2] [7] [4 3] [6] 625 z-up')
|
||||||
|
|
||||||
|
|
@ -184,7 +184,7 @@ but see below.
|
||||||
[1] [8] [2] [7] [3 4 625 6] .
|
[1] [8] [2] [7] [3 4 625 6] .
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2] [7] [3 4 625 6] z-up')
|
J('[1] [8] [2] [7] [3 4 625 6] z-up')
|
||||||
|
|
||||||
|
|
@ -194,7 +194,7 @@ but see below.
|
||||||
[1] [8] [2 [3 4 625 6] 7]
|
[1] [8] [2 [3 4 625 6] 7]
|
||||||
|
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1] [8] [2 [3 4 625 6] 7] z-up')
|
J('[1] [8] [2 [3 4 625 6] 7] z-up')
|
||||||
|
|
||||||
|
|
@ -210,7 +210,7 @@ but see below.
|
||||||
In Joy we have the ``dip`` and ``infra`` combinators which can “target”
|
In Joy we have the ``dip`` and ``infra`` combinators which can “target”
|
||||||
or “address” any particular item in a Joy tree structure.
|
or “address” any particular item in a Joy tree structure.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('[1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra')
|
V('[1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra')
|
||||||
|
|
||||||
|
|
@ -270,13 +270,13 @@ been embedded in a nested series of quoted programs, e.g.:
|
||||||
|
|
||||||
The ``Z`` function isn’t hard to make.
|
The ``Z`` function isn’t hard to make.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
define('Z == [[] cons cons] step i')
|
define('Z == [[] cons cons] step i')
|
||||||
|
|
||||||
Here it is in action in a simplified scenario.
|
Here it is in action in a simplified scenario.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
V('1 [2 3 4] Z')
|
V('1 [2 3 4] Z')
|
||||||
|
|
||||||
|
|
@ -314,7 +314,7 @@ Here it is in action in a simplified scenario.
|
||||||
|
|
||||||
And here it is doing the main thing.
|
And here it is doing the main thing.
|
||||||
|
|
||||||
.. code:: python
|
.. code:: ipython2
|
||||||
|
|
||||||
J('[1 [2 [3 4 25 6] 7] 8] [sqr] [dip dip infra dip infra dip infra] Z')
|
J('[1 [2 [3 4 25 6] 7] 8] [sqr] [dip dip infra dip infra dip infra] Z')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ These essays are adapted from Jupyter notebooks. I hope to have those hosted so
|
||||||
Treestep
|
Treestep
|
||||||
Generator_Programs
|
Generator_Programs
|
||||||
Newton-Raphson
|
Newton-Raphson
|
||||||
|
Square_Spiral
|
||||||
Zipper
|
Zipper
|
||||||
Types
|
Types
|
||||||
TypeChecking
|
TypeChecking
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue