Thun/docs/1. Basic Use of Joy in a No...

241 lines
7.7 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Preamble\n",
"\n",
"First, import what we need."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from joy.joy import run\n",
"from joy.library import initialize\n",
"from joy.utils.stack import stack_to_string\n",
"from joy.utils.pretty_print import TracePrinter"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define a dictionary, an initial stack, and two helper functions to run Joy code and print results for us."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"D = initialize()\n",
"S = ()\n",
"\n",
"\n",
"def J(text):\n",
" print stack_to_string(run(text, S, D)[0])\n",
"\n",
"\n",
"def V(text):\n",
" tp = TracePrinter()\n",
" run(text, S, D, tp.viewer)\n",
" tp.print_()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Run some simple programs"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"41\n"
]
}
],
"source": [
"J('23 18 +')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"15\n"
]
}
],
"source": [
"J('45 30 gcd')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### With Viewer\n",
"\n",
"A `viewer` records each step of the evaluation of a Joy program. The `TracePrinter` has a facility for printing out a trace of the evaluation, one line per step. Each step is aligned to the current interpreter position, signified by a period separating the stack on the left from the pending expression (\"continuation\") on the right. I find these traces beautiful, like a kind of art."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" . 23 18 +\n",
" 23 . 18 +\n",
"23 18 . +\n",
" 41 . \n"
]
}
],
"source": [
"V('23 18 +')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" . 45 30 gcd\n",
" 45 . 30 gcd\n",
" 45 30 . gcd\n",
" 45 30 . 1 [tuck modulus dup 0 >] loop pop\n",
" 45 30 1 . [tuck modulus dup 0 >] loop pop\n",
" 45 30 1 [tuck modulus dup 0 >] . loop pop\n",
" 45 30 . tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 30 45 30 . modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 30 15 . dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 30 15 15 . 0 > [tuck modulus dup 0 >] loop pop\n",
" 30 15 15 0 . > [tuck modulus dup 0 >] loop pop\n",
" 30 15 True . [tuck modulus dup 0 >] loop pop\n",
"30 15 True [tuck modulus dup 0 >] . loop pop\n",
" 30 15 . tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 15 30 15 . modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 15 0 . dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 15 0 0 . 0 > [tuck modulus dup 0 >] loop pop\n",
" 15 0 0 0 . > [tuck modulus dup 0 >] loop pop\n",
" 15 0 False . [tuck modulus dup 0 >] loop pop\n",
"15 0 False [tuck modulus dup 0 >] . loop pop\n",
" 15 0 . pop\n",
" 15 . \n"
]
}
],
"source": [
"V('45 30 gcd')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's a longer trace."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" . 96 27 gcd\n",
" 96 . 27 gcd\n",
" 96 27 . gcd\n",
" 96 27 . 1 [tuck modulus dup 0 >] loop pop\n",
" 96 27 1 . [tuck modulus dup 0 >] loop pop\n",
" 96 27 1 [tuck modulus dup 0 >] . loop pop\n",
" 96 27 . tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 27 96 27 . modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 27 15 . dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 27 15 15 . 0 > [tuck modulus dup 0 >] loop pop\n",
" 27 15 15 0 . > [tuck modulus dup 0 >] loop pop\n",
" 27 15 True . [tuck modulus dup 0 >] loop pop\n",
"27 15 True [tuck modulus dup 0 >] . loop pop\n",
" 27 15 . tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 15 27 15 . modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 15 12 . dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 15 12 12 . 0 > [tuck modulus dup 0 >] loop pop\n",
" 15 12 12 0 . > [tuck modulus dup 0 >] loop pop\n",
" 15 12 True . [tuck modulus dup 0 >] loop pop\n",
"15 12 True [tuck modulus dup 0 >] . loop pop\n",
" 15 12 . tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 12 15 12 . modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 12 3 . dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 12 3 3 . 0 > [tuck modulus dup 0 >] loop pop\n",
" 12 3 3 0 . > [tuck modulus dup 0 >] loop pop\n",
" 12 3 True . [tuck modulus dup 0 >] loop pop\n",
" 12 3 True [tuck modulus dup 0 >] . loop pop\n",
" 12 3 . tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 3 12 3 . modulus dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 3 0 . dup 0 > [tuck modulus dup 0 >] loop pop\n",
" 3 0 0 . 0 > [tuck modulus dup 0 >] loop pop\n",
" 3 0 0 0 . > [tuck modulus dup 0 >] loop pop\n",
" 3 0 False . [tuck modulus dup 0 >] loop pop\n",
" 3 0 False [tuck modulus dup 0 >] . loop pop\n",
" 3 0 . pop\n",
" 3 . \n"
]
}
],
"source": [
"V('96 27 gcd')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}