From 6eff23b19170d9062a7658785852cf4dec65de50 Mon Sep 17 00:00:00 2001 From: Simon Forman Date: Thu, 31 Mar 2022 10:10:22 -0700 Subject: [PATCH] Rebuild HTML docs. --- .../_build/doctrees/environment.pickle | Bin 291217 -> 290010 bytes .../sphinx_docs/_build/doctrees/index.doctree | Bin 23872 -> 23882 bytes docs/sphinx_docs/_build/doctrees/joy.doctree | Bin 24952 -> 24830 bytes docs/sphinx_docs/_build/doctrees/lib.doctree | Bin 95605 -> 95615 bytes .../_build/doctrees/library.doctree | Bin 224466 -> 222287 bytes .../doctrees/notebooks/Categorical.doctree | Bin 7658 -> 7668 bytes ...Derivatives_of_Regular_Expressions.doctree | Bin 67557 -> 67567 bytes .../doctrees/notebooks/Developing.doctree | Bin 66675 -> 66685 bytes .../notebooks/Generator_Programs.doctree | Bin 48705 -> 48715 bytes .../_build/doctrees/notebooks/Intro.doctree | Bin 40965 -> 40975 bytes .../doctrees/notebooks/Newton-Raphson.doctree | Bin 21428 -> 21438 bytes .../doctrees/notebooks/NoUpdates.doctree | Bin 8533 -> 8543 bytes .../notebooks/Ordered_Binary_Trees.doctree | Bin 133162 -> 133172 bytes .../doctrees/notebooks/Quadratic.doctree | Bin 20417 -> 20427 bytes .../notebooks/Recursion_Combinators.doctree | Bin 70371 -> 70381 bytes .../doctrees/notebooks/Replacing.doctree | Bin 30615 -> 30625 bytes .../doctrees/notebooks/Square_Spiral.doctree | Bin 45952 -> 45962 bytes .../notebooks/The_Four_Operations.doctree | Bin 39813 -> 39823 bytes .../doctrees/notebooks/Treestep.doctree | Bin 48208 -> 48218 bytes .../doctrees/notebooks/TypeChecking.doctree | Bin 9272 -> 9282 bytes .../_build/doctrees/notebooks/Types.doctree | Bin 202616 -> 202626 bytes .../_build/doctrees/notebooks/Zipper.doctree | Bin 33430 -> 33440 bytes .../_build/doctrees/notebooks/index.doctree | Bin 4049 -> 4059 bytes .../_build/doctrees/parser.doctree | Bin 13570 -> 13558 bytes .../_build/doctrees/pretty.doctree | Bin 20916 -> 20801 bytes .../sphinx_docs/_build/doctrees/stack.doctree | Bin 40635 -> 40447 bytes .../sphinx_docs/_build/doctrees/types.doctree | Bin 16608 -> 16618 bytes .../_build/html/_modules/index.html | 2 +- .../_build/html/_modules/joy/library.html | 30 +- .../_build/html/_modules/joy/parser.html | 26 +- .../_build/html/_modules/joy/utils/stack.html | 15 +- .../sphinx_docs/_build/html/_static/basic.css | 4 + .../_build/html/_static/doctools.js | 5 +- .../_build/html/_static/language_data.js | 2 +- .../_build/html/_static/pygments.css | 8 +- .../_build/html/_static/searchtools.js | 2 +- docs/sphinx_docs/_build/html/genindex.html | 4 +- docs/sphinx_docs/_build/html/index.html | 2 +- docs/sphinx_docs/_build/html/joy.html | 2 +- docs/sphinx_docs/_build/html/lib.html | 2 +- docs/sphinx_docs/_build/html/library.html | 46 +- .../_build/html/notebooks/Categorical.html | 3 +- .../Derivatives_of_Regular_Expressions.html | 554 +++--- .../_build/html/notebooks/Developing.html | 443 ++--- .../html/notebooks/Generator_Programs.html | 96 +- .../_build/html/notebooks/Intro.html | 2 +- .../_build/html/notebooks/Newton-Raphson.html | 32 +- .../_build/html/notebooks/NoUpdates.html | 3 +- .../html/notebooks/Ordered_Binary_Trees.html | 184 +- .../_build/html/notebooks/Quadratic.html | 12 +- .../html/notebooks/Recursion_Combinators.html | 68 +- .../_build/html/notebooks/Replacing.html | 30 +- .../_build/html/notebooks/Square_Spiral.html | 34 +- .../html/notebooks/The_Four_Operations.html | 2 +- .../_build/html/notebooks/Treestep.html | 94 +- .../_build/html/notebooks/TypeChecking.html | 82 +- .../_build/html/notebooks/Types.html | 1504 ++++++++--------- .../_build/html/notebooks/Zipper.html | 44 +- .../_build/html/notebooks/index.html | 2 +- docs/sphinx_docs/_build/html/objects.inv | Bin 1592 -> 1588 bytes docs/sphinx_docs/_build/html/parser.html | 2 +- docs/sphinx_docs/_build/html/pretty.html | 2 +- docs/sphinx_docs/_build/html/py-modindex.html | 2 +- docs/sphinx_docs/_build/html/search.html | 2 +- docs/sphinx_docs/_build/html/searchindex.js | 2 +- docs/sphinx_docs/_build/html/stack.html | 2 +- docs/sphinx_docs/_build/html/types.html | 36 +- 67 files changed, 1692 insertions(+), 1695 deletions(-) diff --git a/docs/sphinx_docs/_build/doctrees/environment.pickle b/docs/sphinx_docs/_build/doctrees/environment.pickle index a92d50bb6237f94d2e02cfa8b6592d1d9f5f0023..5bd9019074b42c5f98a736fec4ab818e32d0b894 100644 GIT binary patch literal 290010 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 diff --git a/docs/sphinx_docs/_build/doctrees/index.doctree b/docs/sphinx_docs/_build/doctrees/index.doctree index 398bdecea7c91f4c7b2cb65ad35d5899d5ee5e19..bca829d2a7b34a8a8928c41939cae55c5cef37b9 100644 GIT binary patch delta 63 zcmX@Gi}BPhMwSNFsrDOLR)#Q_mZWXo5W>l%sFqPuQc!HAub+}wl2}rdn4Fzjq?egm TlBSnml&+tWpS<}(SOFUV_SYA@ delta 53 zcmX@Li}AoNMwSMasiqrQR)#Q#hPZ9s5W>kME|XDGQc!HAuV0d%pHr-tnOc&jmtT~= J`Bqo~8vqRa6O8}> diff --git a/docs/sphinx_docs/_build/doctrees/joy.doctree b/docs/sphinx_docs/_build/doctrees/joy.doctree index 22ae729d3b95f4cb99d6f8416e2155ec3f223bff..506022d8dceb3ddd68d531a975b399df30284f7f 100644 GIT binary patch delta 717 zcmexyi1FV+M%D(_sh<-zvR*csq|P##!*m*x0_)^NNtww4)&iVztPBhp(pl21lN*)g zCi8h(vM2#XCf_hIV3geKZMK3Dq=(nSSVRgatl2oFc8W#@YX(~ed+d}f`N8Qf7*YtKITYgmwUcu_B`16N3s0^y z6W#3PFUSOn!_q(;*6j&Q20B_H2(P2(1yw&wmQhktP;8~IpORRTSW*N`2B}4QnW-gddih1^`YHLzn^R+jSpZXN Bz25); delta 900 zcmex&knzVMM%D(Fskw<8SudMRW-&9Ee8*%OlQQdMMt2=fMOFre4CyR6*2#h1T9a>h z=&Gv%MY2SJL`Rkwh`FByNQeVjex(`OSu#KdP(35-YKNk zX)uam*F5>Ixw(ieP`75|l-em88LSy>8SJrBvXmz8^3|OjYM}>nN*>55+DsO#lP?Bp zsTYHsK*%)_5Z8EF3QzV865Z@&xtNJjcJe#x1c)h`lNCZarEnXvd5#S$BZ~#lrpfz- zr5Pzn2b4h_V2A8$gh61-Hy`(2fzzgZ zUmU*NG~=8$=e&V8NYA>08x?~f&c&j delta 73 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 aom!-qnOc&jmtT~wpOT-v-Ia-P0V@C;y%tFT delta 64 zcmaFg&+@dNg{gt1k!dOuqZsc|b_Ou$VGRv&+p5aQ$s{h5QBqP+Y^ASXlAoVbte2Tu QlBSnml)l}ciE#ld05(Dr8UO$Q diff --git a/docs/sphinx_docs/_build/doctrees/notebooks/Developing.doctree b/docs/sphinx_docs/_build/doctrees/notebooks/Developing.doctree index 5204cb89b4af78b2a3052400cbd151a0b2f7a332..8bfaf107e71a67d53844cd4b6880042579ae7205 100644 GIT binary patch delta 89 zcmey|!Sc6*g{6UYD&t0$hd-E0OVT#K_`%7fsFqPuQc!HAub+}wl2}rdn4Fzjq?egm qlBSnml&+tWpS+pl_b(RysTnK`V35(8A)RF~{T?Hu$yQfJJr)2UARm2%|)EQ6! diff --git a/docs/sphinx_docs/_build/doctrees/notebooks/Generator_Programs.doctree b/docs/sphinx_docs/_build/doctrees/notebooks/Generator_Programs.doctree index ccb39482e52f6550a351d8d42700002fb97d4a4b..033c34031169cb1760ba2c8f8f73f03d1e68c2dd 100644 GIT binary patch delta 63 zcmV-F0Kosj`~u7T0tA2sl|Zosr?-=Bw+FMbw*>+rCTMhYaC15@FJxhKVRUj~V{2t{ VE@@?SW-f1XXD?)LW3$e=a|BPq8Pxy) delta 53 zcmX^8hw0!SCYA=4sb(8lmTzYc4RPDNZaXKFxJ*V#NkOrdzJ5u5eonDoW@<^AUVc&f J<{LYUSpY->6*>R_ diff --git a/docs/sphinx_docs/_build/doctrees/notebooks/Intro.doctree b/docs/sphinx_docs/_build/doctrees/notebooks/Intro.doctree index 1a78f94f58150e657e6b39d06f090d1434c55859..14627f9183cad7eeefd5121d664a710dd4e372d9 100644 GIT binary patch delta 64 zcmZoYz|?<$iM4@sD$9b6td=vGOH0x=JI>@}QdG+*DJdwn($`N(EJ-XWN=(j9Ez-+O UElJbMFG|->$xq&#IC}{T0OnU0ZU6uP delta 54 zcmeA_z|?wxiM4@c>aY15SuJNWhlaRqcAUw{BrcOtQc_TCrLSL-pPy5#mzi3Urk7uo KzBzmL5*7d}q7*&= diff --git a/docs/sphinx_docs/_build/doctrees/notebooks/Newton-Raphson.doctree b/docs/sphinx_docs/_build/doctrees/notebooks/Newton-Raphson.doctree index 4a86f59bb10dfd759680ee7fc7e4a3e9207f58b9..690f96e3d757e1db581af34b54915fd9f17ff0ae 100644 GIT binary patch delta 63 zcmdn8oN?cBMwSNFshc;lEb?V8ElJzF(wCD-Q7xmSq@dVJUq2|JTd_`_>ph delta 53 zcmdnDoN>!?MwSMasVg_KEb?Uz4RPDN(wCD-TqdKWq@dVJU%wPx# diff --git a/docs/sphinx_docs/_build/doctrees/notebooks/Quadratic.doctree b/docs/sphinx_docs/_build/doctrees/notebooks/Quadratic.doctree index 9506af376901a975fda89acf84cde81394ac2b18..f3e6e769cd5d186f111ebe1d6e640fd643325e98 100644 GIT binary patch delta 63 zcmX>&pYim3MwSNFsRuT)T<~NrElJya-IJ3^Q7xmSq@dVJUq2-pYh;)MwSMasoOTPT<~NL4RPCi-IJ3^TqdKWq@dVJU%w&nec+ SOf5;%%P&gb?#j!!f)xNlViJS^ diff --git a/docs/sphinx_docs/_build/doctrees/notebooks/Replacing.doctree b/docs/sphinx_docs/_build/doctrees/notebooks/Replacing.doctree index 2ad10559c141617445da646821e3f2c915bd7ec3..af1b3bcd12ff576cae36284173b08a33e51edeae 100644 GIT binary patch delta 63 zcmbRKo^j!OMwSNFsna&He2Hf+ElJz_JD!tCQ7xmSq@dVJUq24OVT!fox;hasFqPuQc!HAub+}wl2}rdn4Fzjq?egm TlBSnml&+tWpS)RgdI1Xn6^IxW delta 53 zcmeC*&eXb{iKT&MYSl)TcT<={L)=%%vr1o7c#3GAXKMl#~<{Tj}ekB$gzW6eT8SrxxjDrk14X R=%%LG}o7c#3GKtG%l#~<{Tj}eUt&{vr0L}srEk8b Hki!fB#}5(O diff --git a/docs/sphinx_docs/_build/doctrees/notebooks/Types.doctree b/docs/sphinx_docs/_build/doctrees/notebooks/Types.doctree index 9ba07c820d72101edc70660b9b64f000eb723fe8..2709a75384af1caca59f88b730387a2b8a9d9e5f 100644 GIT binary patch delta 107 zcmeydj;Coo4^sncBU39AV=EKWRwm|Yj2w?d8Ngt=BO9aU_LGdvGuU}cOVV^Lru4|9 z78T_eO*iCZme}6L$^4vAQ7xmSq@dVJUq2&Nru4|9 y78T_eO*iCZme}6L$^4vATqdKWq@dVJU%wFo diff --git a/docs/sphinx_docs/_build/doctrees/notebooks/Zipper.doctree b/docs/sphinx_docs/_build/doctrees/notebooks/Zipper.doctree index 22f043b12d7b9f5b706b062996c883109708d36c..984d622502cd5defc8af32e92fbd9ce5f4cf125e 100644 GIT binary patch delta 63 zcmbQ%%Cw-BiKT&c>eP)aM{1Z$OVT!zCx`=M?K@rk14X`m`h92HqYncWKvYiC@Co@w$j&6Ni0b$DN0PvPA$^QOf5;% R%P&gTPsvZ-yq`yi833*o6~zDm delta 51 zcmcaDe^H*Lfo1BkjVv>`m_tL{HqYncWD=LjC@Co@w$j%x$tlb^)QGPyv5W%Dvs1CUAA)z-mGlAOFqT|x@CA)BwLS1~f~p6suw$hdoR zp{748Z)r)IuEmrdnbe}9{G!Pd^dvSv)qBpUsFqPuQc!HAub+}wl2}p%bX;nYUS?`Z SnqGcUx_(N2^5(||@+<(xS5}h% delta 235 zcmeyC*_6f7z%upwMwU{=$xDQ#(DRhF8HjQci6Yx=V?hlaRqUaQB+BrcOtQc_TC arLSL-pPy5#mzi3Urk7uozWKU=JPQD`X-M<{ diff --git a/docs/sphinx_docs/_build/doctrees/pretty.doctree b/docs/sphinx_docs/_build/doctrees/pretty.doctree index 0b18a489e4d84ad04d6328a121e380b9c1b14064..043c6a548233307bd6eb980d6232959546dc5470 100644 GIT binary patch delta 2302 zcma);du&rx9LIM~AM4dZH`k4B_jWH>AM4hx>;c^hdjQ*#!5$hgDzCbATrO^dtr(|a zU^I)f*B8)j?{f<{HegEZDJW2+8hm?IDlE+$+F>Uu@m;L&4*)hgEieD z{)4Qt>~@}!F=^?Gj`YSx_eN*5_V_mEqcu4?3+8bWj!5pgJdCgsf#_aG+?G z9THjVigTqgGRxYt9GaCvxKM4eJ)^J0aN7T*HVR9to$Mfv3Use=vZEMT$X=N)u_r^1 zq(Y@sC=9iUWN@J-bIE@M+6afE_FeE>iHAox*c1oXwnDJ9!*QN=Q+?{3>O?0*D(qm0 zwLLyldW`W)9C}*vVdDxfyDZ30yKQE*1|2TJyDJ*V9+2hfG7tL&yk&0oE1tfM|Ez<( zp5hFyZQu1X5ADgLESEz^+N?IO6{dw9M9g3T3h!JTQzBO3z27w&mp zFV-!qX-(E@;GD03)xaH3l=ldW)TLWC8pNwSEL-8dhAPh^xT;z4NH6KvJCBdzdetj< zV9kdYP3a84!VXSTiwo0kE3d}!welbjQo2%GKu=zQ6W&S{6xS<|?Q`*v0c_PWT@8PE z5#Trh@^J%PX)0yiu(LkEk1yhUGs(Gx^~0+be$U)}kzz(7r3p#L1?jjTeL;{)DN-zg zQmI_$c9YG^^9;D?8UgI)CITvqq@(Xl+QmYAMw-`p9=Ia=75D@5!|U#m>uNc8Ro{{4OY7`wY3Wz zD;xMIhe&;%K|4sZpRGYJC)cR*EeX+tV6NJo)JrYK-$O5(?+)vsu&jhul3^Sgn`E(B zW7BFjaCg*hib^W1*0@Mv>Fh>SSied0A`WEd=5V`_bY{?OMrh7mS7g>C>MvwY>di$b z*Y%bS3$^cC-lhdvdy60dr3R<#USzXSyK0`Dg1=XFuul?}EX&8b>nRvpJ;6`WR-~y9 z^o#~fG7B3*PqA+k0n4PzWO8aQBYf$W^E4mckoWnS12Z1gq?*;tZ8IKG+>I(g`PY!ifYSZ?0q~ z(g}~>MR@Xl2r(@YP7vV)c*NM<(#YpcFz2YkrO#V>IXV&axPVS}jB8ZXrItj;_>o>c z>`)%$mucP07QncE3;T-@sX0rxktSJ53fu@k0O!`PWLCJjzMk97u&lP>ds?{$4Pg2Ult!6|o z$yA>}B}is!f$TO6ww3b*aaJkO0cWY&^bVL!`p`Qd=`zs)6>zpIdUsRk5<~|aKyJMQ zil;7^3gpN4wSUhGPNHRUX>@paXn03-uy?3$_u#IXNz?vVe|(@r;w3IM7TY^g9|-hC zVv*Qzq<2qr*uOg(>-P^0?+Ww{^~R?*onULnXoKfyc$$V09QIF2gOPzK{nr>F)oSF^ pDeNey5?Y}E)rud@fvyhx9)H?(Bx@_RY5E(0T?hwze0%p6_AdY{Sgim6 delta 2443 zcma)8eP~lx6z{!BYBIaDUA4yKB~AKazM8bP+OM>!_7f^rJHO^&YK@)G*J`?^6`d2z zL=0<&laslDR;>=f3F}5CY{EV|21CI=MCceY^smV*LW^U=ZiAik-b+cuZT;uI`_4V* zcYf#I`#bMVUSgkLX4+%g_pg4Y{lzTA4TFap_J{Y34D=M*);Hh~R zFW~Toc@>v$A9#$;gvGT11xLg_gK}PhTW7e0UH6x{@2MuQI-u!?;O+cM5DQ zlzeC_W&CZ$;<X_sk|utl#pP7dU2TgNc}uH?z$ zF~)8~S!pYuqFj~ua<(+UZ*#cdwZM~77n=s5%*h`s{rZR1lP(;><{?9Y!$l+ zPs^@j+{6kW#o2v+qg66!=Cj-av$LOBV2#_C_W*Yn6Psw2sDPzSfcwsmd7}oiyGo=S zWEYdjRChEok@; zFt5U+MgyM)Oo*26apE{#UX5dsuZmS8P)Tl;g6hWyp3F+P<7wdm4IH&wpwesQ@r81Z z$(&=zxrDt8r<*F+cslFzD(f7bBw{Mq5%9V$FNl9k;UAOv$7KF7ng0pmZ zxl)Z=UYbcA1TMMRQnG>Fzlh(W1N6cJL7%&ewqCtdI0eT`1sazmLey_A>ZY?HveE{c zJ)zmg`B@L#@E=xuva~55Ml;z*p7p@J&gIGeiaN&4T3ITSl{Qug4=S&7w_-r;

6* zO2P#{R|Tv`FpE2yIGS*Yy0|Vf+#Bjoh>KoJNKssX`$grvS&n{2Gy$k;EdswopORZG z0zWIaZO@C`^skZUs;w*v=c)ymstBCg8i; zb^HdRxy$pvP@EE_jPoRTyBh$!Act zoUMaAhmFL%VzCYZ(mF#XpsM8=m$VojAX{wi&+@lTGE&+@izx_LdMwM=C8QmzL^PkF@E%>LDJThfk5s&F;d< z)~)PsVwt*-b4WT4OezW3anPC;p`RGiX$!^ll(tn#cUd9U+NZoY!nxUp|&C_J>Y z??5QLXWxOniMVdd=8oh{mw_)6#Npw=NJB-%a5y{=@$c&!e%&7)+M6`5zr=#a2=XWm zhiDkVVI*!i(7V5n{&6DIeI@egme*0%4zf^yn1g>HbKUFo)AVAE4?^CuLHKHeEpG>X S9_U9!%BOx%n4I3QmHh*0bbn?5 diff --git a/docs/sphinx_docs/_build/doctrees/stack.doctree b/docs/sphinx_docs/_build/doctrees/stack.doctree index c335e30dad48583fa900b45c63789049438ad4b7..6ce8d345597789a3d93c9e5909cc8e30376fcdb9 100644 GIT binary patch delta 838 zcmdnJm+Aj*Ce{YlsbA)9WPPqVSs{&O@>>J;$;w)dj7ugTRMX+iTExV_kRhElfAT_I z?a6z+3|N){1t!1IG}s)h-N6Xg@khs=aq;B+{rZ!$b@dn*O`fG|%(!#%IbCDHy+HLH zS^I!wmL-VTzgb9+pBXGEGuh5i0*iul!$c;q0$r&d*5Z=HB zL1MD4DHr3;%^s#LB5*go^@O=8#tY=8Zm)D?%h*}Lu3`30W5Oa_<(tI;H;FY2W>QI* z9tSi?rcT}%DL=WO!bWTs8_*;q2Zn<9`!`F6m!g;q6H7K{VrKBmu=3{gPG9*G2?(P?_|+z6J*apjflz?V8$X` zohQHvH+fAt%w*{bQ0RG8poHEWPOxJRRkR=yL3$NP%krv7pmN4)Y|1OEvr#ODn)0=7 z4@yYE3~!WUL3Soo_+zU&7u=ba6JX9#9Sb;*+RRQQ4Fh;-{hk@UX05o3+To&E}fjGYs|EVY4XNgoyq5Q z*#t4n+WbtHpBbV;da{tA1Qr$6hKWoN6{c8ZpBM`=f@EW&q_}(7Qu1>XGxMfo?b$42 z+9HDDKz3HB+x;dl@Ps%}f3lR99?+4VUg^jtLsV`)=#|EVMcBeOivz{rP&T;1i$Y-r z%Y=ap_6|ca7@~6X;jmH^gQ3Enk;l1F4BpQUH&`GQWN>t9G$%BIL^wbZBqqrLRDu+! z5G|Ya)7qGE8MQSNXw;-EP~^mAp*Rn!`C66$GqS&-!ryZRI8n@;!wGjDdpXSCjpZPJ zZzxAG7@~5sMnwy1nn5yQO(n>L@0F22-GNoubf2usMsXI@P}jOWD1iwT7HX7ZLG}bx z*s)ce3&j(^xZ$42=!bdYQ9sBNf)h}j0a3ZRa{_9rfCz7zT*$&38sesFF{MW)wWuh+ sXtLvUiOtidKW7w|$tWo)D7MnqFUil(Db~wOElJbMFG}A$Z)PG30GQbaEdT%j diff --git a/docs/sphinx_docs/_build/doctrees/types.doctree b/docs/sphinx_docs/_build/doctrees/types.doctree index b207837dad96ed7825539ddaea6276012a2f6e1b..dbb3cafcb75e073a47698417fe9af1fec108574e 100644 GIT binary patch delta 63 zcmaFR$oQ&}k)?rk>ivx@jn>SiC25;GtT~w!)iO#-3W}}t^-~f{5=)8_le1Hc^fFUR T()99+()CmFlQ*xhwO|GS^PLwg delta 53 zcmaFW$oQaeY=bjn>SeA#R&HtT~y)Wim=i3W}}t^-J>ebBgscQ%lnH@{7_p JZ?d&u1^^0*68!)G diff --git a/docs/sphinx_docs/_build/html/_modules/index.html b/docs/sphinx_docs/_build/html/_modules/index.html index a09f508..9ee35ef 100644 --- a/docs/sphinx_docs/_build/html/_modules/index.html +++ b/docs/sphinx_docs/_build/html/_modules/index.html @@ -102,7 +102,7 @@
Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0. diff --git a/docs/sphinx_docs/_build/html/_modules/joy/library.html b/docs/sphinx_docs/_build/html/_modules/joy/library.html index 389391f..da257c6 100644 --- a/docs/sphinx_docs/_build/html/_modules/joy/library.html +++ b/docs/sphinx_docs/_build/html/_modules/joy/library.html @@ -94,7 +94,7 @@ %s ----- end (%s) +---- end ( %s ) ''' @@ -260,15 +260,6 @@ return stack, expression, dictionary -

[docs]@inscribe -@SimpleFunctionWrapper -def parse(stack): - '''Parse the string on the stack to a Joy expression.''' - text, stack = stack - expression = text_to_expression(text) - return expression, stack
- - # @inscribe # @SimpleFunctionWrapper # def infer_(stack): @@ -373,19 +364,18 @@ Use a Boolean value to select one of two items. :: - A B False choice + A B false choice ---------------------- A - A B True choice + A B true choice --------------------- B - Currently Python semantics are used to evaluate the "truthiness" of the - Boolean value (so empty string, zero, etc. are counted as false, etc.) ''' (if_, (then, (else_, stack))) = stack + assert isinstance(if_, bool), repr(if_) return then if if_ else else_, stack @@ -396,12 +386,12 @@ Use a Boolean value to select one of two items from a sequence. :: - [A B] False select + [A B] false select ------------------------ A - [A B] True select + [A B] true select ----------------------- B @@ -625,9 +615,9 @@ Return the tuple (x//y, x%y). Invariant: q * y + r == x. ''' - a, (b, stack) = S - d, m = divmod(a, b) - return d, (m, stack) + y, (x, stack) = S + q, r = divmod(x, y) + return r, (q, stack)
[docs]def sqrt(a): @@ -1482,7 +1472,7 @@
Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
diff --git a/docs/sphinx_docs/_build/html/_modules/joy/parser.html b/docs/sphinx_docs/_build/html/_modules/joy/parser.html index 46f58ec..153d3de 100644 --- a/docs/sphinx_docs/_build/html/_modules/joy/parser.html +++ b/docs/sphinx_docs/_build/html/_modules/joy/parser.html @@ -71,6 +71,11 @@ ''' from re import Scanner from .utils.stack import list_to_stack +from .utils.snippets import ( + pat as SNIPPETS, + from_string, + Snippet, + ) BRACKETS = r'\[|\]' @@ -79,6 +84,7 @@ token_scanner = Scanner([ + (SNIPPETS, lambda _, token: from_string(token)), (BRACKETS, lambda _, token: token), (BLANKS, None), (WORDS, lambda _, token: token), @@ -138,20 +144,16 @@ v = frame try: frame = stack.pop() except IndexError: - raise ParseError('Extra closing bracket.') + raise ParseError('Extra closing bracket.') from None frame.append(list_to_stack(v)) - elif tok == 'true': - frame.append(True) - elif tok == 'false': - frame.append(False) + elif tok == 'true': frame.append(True) + elif tok == 'false': frame.append(False) + elif isinstance(tok, Snippet): frame.append(tok) else: - try: - thing = int(tok) - except ValueError: - thing = Symbol(tok) + try: thing = int(tok) + except ValueError: thing = Symbol(tok) frame.append(thing) - if stack: - raise ParseError('Unclosed bracket.') + if stack: raise ParseError('Unclosed bracket.') return list_to_stack(frame) @@ -220,7 +222,7 @@
Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0. diff --git a/docs/sphinx_docs/_build/html/_modules/joy/utils/stack.html b/docs/sphinx_docs/_build/html/_modules/joy/utils/stack.html index 945bc10..b9fa764 100644 --- a/docs/sphinx_docs/_build/html/_modules/joy/utils/stack.html +++ b/docs/sphinx_docs/_build/html/_modules/joy/utils/stack.html @@ -104,6 +104,7 @@ ''' from .errors import NotAListError +from .snippets import Snippet, to_string as snip_to_string
[docs]def list_to_stack(el, stack=()): @@ -162,24 +163,28 @@ return _to_string(expression, iter_stack)
-_JOY_BOOL_LITS = 'false', 'true' +JOY_BOOL_LITERALS = 'false', 'true' def _joy_repr(thing): - if isinstance(thing, bool): - return _JOY_BOOL_LITS[thing] - return repr(thing) + if isinstance(thing, bool): return JOY_BOOL_LITERALS[thing] + if isinstance(thing, Snippet): return snip_to_string(thing) + return repr(thing) def _to_string(stack, f): if not isinstance(stack, tuple): return _joy_repr(stack) if not stack: return '' # shortcut + if isinstance(stack, Snippet): return snip_to_string(stack) return ' '.join(map(_s, f(stack))) _s = lambda s: ( '[%s]' % expression_to_string(s) if isinstance(s, tuple) + and not isinstance(s, Snippet) + # Is it worth making a non-tuple class for Snippet? + # Doing this check on each tuple seems a bit much. else _joy_repr(s) ) @@ -351,7 +356,7 @@
Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0. diff --git a/docs/sphinx_docs/_build/html/_static/basic.css b/docs/sphinx_docs/_build/html/_static/basic.css index 603f6a8..ac9a52a 100644 --- a/docs/sphinx_docs/_build/html/_static/basic.css +++ b/docs/sphinx_docs/_build/html/_static/basic.css @@ -66,6 +66,10 @@ div.sphinxsidebar ul { list-style: none; } +div.sphinxsidebar li { + padding-bottom: 0.5em; +} + div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points { margin-left: 20px; diff --git a/docs/sphinx_docs/_build/html/_static/doctools.js b/docs/sphinx_docs/_build/html/_static/doctools.js index 8cbf1b1..e509e48 100644 --- a/docs/sphinx_docs/_build/html/_static/doctools.js +++ b/docs/sphinx_docs/_build/html/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -264,6 +264,9 @@ var Documentation = { hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); + var url = new URL(window.location); + url.searchParams.delete('highlight'); + window.history.replaceState({}, '', url); }, /** diff --git a/docs/sphinx_docs/_build/html/_static/language_data.js b/docs/sphinx_docs/_build/html/_static/language_data.js index 863704b..ebe2f03 100644 --- a/docs/sphinx_docs/_build/html/_static/language_data.js +++ b/docs/sphinx_docs/_build/html/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/sphinx_docs/_build/html/_static/pygments.css b/docs/sphinx_docs/_build/html/_static/pygments.css index f346859..691aeb8 100644 --- a/docs/sphinx_docs/_build/html/_static/pygments.css +++ b/docs/sphinx_docs/_build/html/_static/pygments.css @@ -1,7 +1,7 @@ -pre { line-height: 125%; margin: 0; } -td.linenos pre { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; } -span.linenos { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; } -td.linenos pre.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight { background: #eeffcc; } diff --git a/docs/sphinx_docs/_build/html/_static/searchtools.js b/docs/sphinx_docs/_build/html/_static/searchtools.js index 002e9c4..2d77859 100644 --- a/docs/sphinx_docs/_build/html/_static/searchtools.js +++ b/docs/sphinx_docs/_build/html/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/sphinx_docs/_build/html/genindex.html b/docs/sphinx_docs/_build/html/genindex.html index ce6c14b..f1bedb1 100644 --- a/docs/sphinx_docs/_build/html/genindex.html +++ b/docs/sphinx_docs/_build/html/genindex.html @@ -326,8 +326,6 @@

P

    -
  • parse() (in module joy.library) -
  • ParseError
  • pick() (in module joy.utils.stack) @@ -570,7 +568,7 @@
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0. diff --git a/docs/sphinx_docs/_build/html/index.html b/docs/sphinx_docs/_build/html/index.html index a8eb5af..ca81a00 100644 --- a/docs/sphinx_docs/_build/html/index.html +++ b/docs/sphinx_docs/_build/html/index.html @@ -256,7 +256,7 @@ interesting aspects. It’s quite a treasure trove.


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0. diff --git a/docs/sphinx_docs/_build/html/joy.html b/docs/sphinx_docs/_build/html/joy.html index 4a5a08e..20854d5 100644 --- a/docs/sphinx_docs/_build/html/joy.html +++ b/docs/sphinx_docs/_build/html/joy.html @@ -191,7 +191,7 @@ on every iteration, its return value is ignored.


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0. diff --git a/docs/sphinx_docs/_build/html/lib.html b/docs/sphinx_docs/_build/html/lib.html index 03f9a10..1e59f3a 100644 --- a/docs/sphinx_docs/_build/html/lib.html +++ b/docs/sphinx_docs/_build/html/lib.html @@ -1333,7 +1333,7 @@ soley of containers, without strings or numbers or anything else.)


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0. diff --git a/docs/sphinx_docs/_build/html/library.html b/docs/sphinx_docs/_build/html/library.html index 1325405..63e7a53 100644 --- a/docs/sphinx_docs/_build/html/library.html +++ b/docs/sphinx_docs/_build/html/library.html @@ -150,18 +150,16 @@ program.

    joy.library.choice(stack)[source]

    Use a Boolean value to select one of two items.

    -
       A B False choice
    +
       A B false choice
     ----------------------
        A
     
     
    -   A B True choice
    +   A B true choice
     ---------------------
          B
     
    -

    Currently Python semantics are used to evaluate the “truthiness” of the -Boolean value (so empty string, zero, etc. are counted as false, etc.)

    @@ -449,7 +447,7 @@ with the list as its stack. Does not affect the rest of the stack.

    -joy.library.inscribe(function, d={'!=': <function ne>, '%': <function mod>, '&': <function and_>, '*': <function mul>, '+': <function add>, '++': <function succ>, '-': <function sub>, '--': <function pred>, '/': <function floordiv>, '//': <function floordiv>, '/floor': <function floordiv>, '<': <function lt>, '<<': <function lshift>, '<=': <function le>, '<>': <function ne>, '=': <function eq>, '>': <function gt>, '>=': <function ge>, '>>': <function rshift>, '^': <function xor>, '_Tree_add_Ee': <function _Tree_add_Ee>, '_Tree_delete_R0': <function _Tree_delete_R0>, '_Tree_delete_clear_stuff': <function _Tree_delete_clear_stuff>, '_Tree_get_E': <function _Tree_get_E>, 'abs': <function abs>, 'add': <function add>, 'and': <function and_>, 'app1': <function app1>, 'app2': <function app2>, 'app3': <function app3>, 'at': <function getitem>, 'b': <function b>, 'bool': <function bool>, 'branch': <function branch>, 'ccons': <function ccons>, 'choice': <function choice>, 'clear': <function clear>, 'cmp': <function cmp_>, 'concat': <function concat_>, 'cond': <function cond>, 'cons': <function cons>, 'dip': <function dip>, 'dipd': <function dipd>, 'dipdd': <function dipdd>, 'disenstacken': <function disenstacken>, 'div': <function floordiv>, 'divmod': <function divmod_>, 'drop': <function drop>, 'dup': <function dup>, 'dupd': <function dupd>, 'dupdd': <function dupdd>, 'dupdip': <function dupdip>, 'eq': <function eq>, 'first': <function first>, 'first_two': <function first_two>, 'floor': <function floor>, 'floordiv': <function floordiv>, 'fourth': <function fourth>, 'gcd2': <function gcd2>, 'ge': <function ge>, 'genrec': <function genrec>, 'getitem': <function getitem>, 'gt': <function gt>, 'help': <function help_>, 'i': <function i>, 'id': <function id_>, 'ifte': <function ifte>, 'ii': <function ii>, 'infra': <function infra>, 'inscribe': <function inscribe_>, 'le': <function le>, 'loop': <function loop>, 'lshift': <function lshift>, 'lt': <function lt>, 'map': <function map_>, 'max': <function max_>, 'min': <function min_>, 'mod': <function mod>, 'modulus': <function mod>, 'mul': <function mul>, 'ne': <function ne>, 'neg': <function neg>, 'not': <function not_>, 'or': <function or_>, 'over': <function over>, 'parse': <function parse>, 'pick': <function getitem>, 'pm': <function pm>, 'pop': <function pop>, 'popd': <function popd>, 'popdd': <function popdd>, 'popop': <function popop>, 'popopd': <function popopd>, 'popopdd': <function popopdd>, 'pow': <function pow>, 'pred': <function pred>, 'primrec': <function primrec>, 'rem': <function mod>, 'remainder': <function mod>, 'remove': <function remove>, 'rest': <function rest>, 'reverse': <function reverse>, 'roll<': <function rolldown>, 'roll>': <function rollup>, 'rolldown': <function rolldown>, 'rollup': <function rollup>, 'round': <function round>, 'rrest': <function rrest>, 'rshift': <function rshift>, 'second': <function second>, 'select': <function select>, 'sharing': <function sharing>, 'shunt': <function shunt>, 'sort': <function sort_>, 'sqrt': <function sqrt>, 'stack': <function stack>, 'step': <function step>, 'stuncons': <function stuncons>, 'stununcons': <function stununcons>, 'sub': <function sub>, 'succ': <function succ>, 'sum': <function sum_>, 'swaack': <function swaack>, 'swap': <function swap>, 'swons': <function swons>, 'take': <function take>, 'third': <function third>, 'times': <function times>, 'truthy': <function bool>, 'tuck': <function tuck>, 'uncons': <function uncons>, 'unique': <function unique>, 'unit': <function unit>, 'unswons': <function unswons>, 'void': <function void>, 'warranty': <function warranty>, 'words': <function words>, 'x': <function x>, 'xor': <function xor>, 'zip': <function zip_>, '•': <function id_>})[source]
    +joy.library.inscribe(function, d={'!=': <function ne>, '%': <function mod>, '&': <function and_>, '*': <function mul>, '+': <function add>, '++': <function succ>, '-': <function sub>, '--': <function pred>, '/': <function floordiv>, '//': <function floordiv>, '/floor': <function floordiv>, '<': <function lt>, '<<': <function lshift>, '<=': <function le>, '<>': <function ne>, '=': <function eq>, '>': <function gt>, '>=': <function ge>, '>>': <function rshift>, '^': <function xor>, '_Tree_add_Ee': <function _Tree_add_Ee>, '_Tree_delete_R0': <function _Tree_delete_R0>, '_Tree_delete_clear_stuff': <function _Tree_delete_clear_stuff>, '_Tree_get_E': <function _Tree_get_E>, 'abs': <function abs>, 'add': <function add>, 'and': <function and_>, 'app1': <function app1>, 'app2': <function app2>, 'app3': <function app3>, 'at': <function getitem>, 'b': <function b>, 'bool': <function bool>, 'branch': <function branch>, 'ccons': <function ccons>, 'choice': <function choice>, 'clear': <function clear>, 'cmp': <function cmp_>, 'concat': <function concat_>, 'cond': <function cond>, 'cons': <function cons>, 'dip': <function dip>, 'dipd': <function dipd>, 'dipdd': <function dipdd>, 'disenstacken': <function disenstacken>, 'div': <function floordiv>, 'divmod': <function divmod_>, 'drop': <function drop>, 'dup': <function dup>, 'dupd': <function dupd>, 'dupdd': <function dupdd>, 'dupdip': <function dupdip>, 'eq': <function eq>, 'first': <function first>, 'first_two': <function first_two>, 'floor': <function floor>, 'floordiv': <function floordiv>, 'fourth': <function fourth>, 'gcd2': <function gcd2>, 'ge': <function ge>, 'genrec': <function genrec>, 'getitem': <function getitem>, 'gt': <function gt>, 'help': <function help_>, 'i': <function i>, 'id': <function id_>, 'ifte': <function ifte>, 'ii': <function ii>, 'infra': <function infra>, 'inscribe': <function inscribe_>, 'le': <function le>, 'loop': <function loop>, 'lshift': <function lshift>, 'lt': <function lt>, 'map': <function map_>, 'max': <function max_>, 'min': <function min_>, 'mod': <function mod>, 'modulus': <function mod>, 'mul': <function mul>, 'ne': <function ne>, 'neg': <function neg>, 'not': <function not_>, 'or': <function or_>, 'over': <function over>, 'pick': <function getitem>, 'pm': <function pm>, 'pop': <function pop>, 'popd': <function popd>, 'popdd': <function popdd>, 'popop': <function popop>, 'popopd': <function popopd>, 'popopdd': <function popopdd>, 'pow': <function pow>, 'pred': <function pred>, 'primrec': <function primrec>, 'rem': <function mod>, 'remainder': <function mod>, 'remove': <function remove>, 'rest': <function rest>, 'reverse': <function reverse>, 'roll<': <function rolldown>, 'roll>': <function rollup>, 'rolldown': <function rolldown>, 'rollup': <function rollup>, 'round': <function round>, 'rrest': <function rrest>, 'rshift': <function rshift>, 'second': <function second>, 'select': <function select>, 'sharing': <function sharing>, 'shunt': <function shunt>, 'sort': <function sort_>, 'sqrt': <function sqrt>, 'stack': <function stack>, 'step': <function step>, 'stuncons': <function stuncons>, 'stununcons': <function stununcons>, 'sub': <function sub>, 'succ': <function succ>, 'sum': <function sum_>, 'swaack': <function swaack>, 'swap': <function swap>, 'swons': <function swons>, 'take': <function take>, 'third': <function third>, 'times': <function times>, 'truthy': <function bool>, 'tuck': <function tuck>, 'uncons': <function uncons>, 'unique': <function unique>, 'unit': <function unit>, 'unswons': <function unswons>, 'void': <function void>, 'warranty': <function warranty>, 'words': <function words>, 'x': <function x>, 'xor': <function xor>, 'zip': <function zip_>, '•': <function id_>})[source]

    A decorator to inscribe functions into the default dictionary.

    @@ -498,12 +496,6 @@ new list with the results in place of the program and original list.

    Given a list find the minimum.

    -
    -
    -joy.library.parse(stack)[source]
    -

    Parse the string on the stack to a Joy expression.

    -
    -
    joy.library.pm(stack)[source]
    @@ -580,12 +572,12 @@ empty or the item isn’t in the list then the list is unchanged.

    joy.library.select(stack)[source]

    Use a Boolean value to select one of two items from a sequence.

    -
       [A B] False select
    +
       [A B] false select
     ------------------------
         A
     
     
    -   [A B] True select
    +   [A B] true select
     -----------------------
           B
     
    @@ -748,7 +740,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.ccons(stack)[source]
    -
    (a2 a1 [...1] -- [a2 a1 ...1])
    +
    (a2 a1 [...1] -- [a2 a1 ...1])
     
    @@ -756,7 +748,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.cons(stack)[source]
    -
    (a1 [...0] -- [a1 ...0])
    +
    (a1 [...0] -- [a1 ...0])
     
    @@ -788,7 +780,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.first(stack)[source]
    -
    ([a1 ...1] -- a1)
    +
    ([a1 ...1] -- a1)
     
    @@ -796,7 +788,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.first_two(stack)[source]
    -
    ([a1 a2 ...1] -- a1 a2)
    +
    ([a1 a2 ...1] -- a1 a2)
     
    @@ -804,7 +796,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.fourth(stack)[source]
    -
    ([a1 a2 a3 a4 ...1] -- a4)
    +
    ([a1 a2 a3 a4 ...1] -- a4)
     
    @@ -868,7 +860,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.rest(stack)[source]
    -
    ([a1 ...0] -- [...0])
    +
    ([a1 ...0] -- [...0])
     
    @@ -892,7 +884,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.rrest(stack)[source]
    -
    ([a1 a2 ...1] -- [...1])
    +
    ([a1 a2 ...1] -- [...1])
     
    @@ -900,7 +892,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.second(stack)[source]
    -
    ([a1 a2 ...1] -- a2)
    +
    ([a1 a2 ...1] -- a2)
     
    @@ -932,7 +924,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.swaack(stack)[source]
    -
    ([...1] -- [...0])
    +
    ([...1] -- [...0])
     
    @@ -948,7 +940,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.swons(stack)[source]
    -
    ([...1] a1 -- [a1 ...1])
    +
    ([...1] a1 -- [a1 ...1])
     
    @@ -956,7 +948,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.third(stack)[source]
    -
    ([a1 a2 a3 ...1] -- a3)
    +
    ([a1 a2 a3 ...1] -- a3)
     
    @@ -972,7 +964,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.uncons(stack)[source]
    -
    ([a1 ...0] -- a1 [...0])
    +
    ([a1 ...0] -- a1 [...0])
     
    @@ -988,7 +980,7 @@ from each list. The smallest list sets the length of the result list.

    joy.utils.generated_library.unswons(stack)[source]
    -
    ([a1 ...1] -- [...1] a1)
    +
    ([a1 ...1] -- [...1] a1)
     
    @@ -1066,7 +1058,7 @@ from each list. The smallest list sets the length of the result list.


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Categorical.html b/docs/sphinx_docs/_build/html/notebooks/Categorical.html index 420e11c..7b2020f 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Categorical.html +++ b/docs/sphinx_docs/_build/html/notebooks/Categorical.html @@ -80,6 +80,7 @@
  • Treating Trees II: treestep
  • Using x to Generate Values
  • Newton’s method
  • +
  • Square Spiral Example Joy Code
  • Traversing Datastructures with Zippers
  • The Blissful Elegance of Typing Joy
  • Type Checking
  • @@ -130,7 +131,7 @@
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Derivatives_of_Regular_Expressions.html b/docs/sphinx_docs/_build/html/notebooks/Derivatives_of_Regular_Expressions.html index 34e24eb..fc0fd9c 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Derivatives_of_Regular_Expressions.html +++ b/docs/sphinx_docs/_build/html/notebooks/Derivatives_of_Regular_Expressions.html @@ -96,15 +96,15 @@ R∘λ = λ∘R = R

    Implementation

    -
    from functools import partial as curry
    -from itertools import product
    +
    from functools import partial as curry
    +from itertools import product
     

    ϕ and λ

    The empty set and the set of just the empty string.

    -
    phi = frozenset()   # ϕ
    -y = frozenset({''}) # λ
    +
    phi = frozenset()   # ϕ
    +y = frozenset({''}) # λ
     
    @@ -115,7 +115,7 @@ illustrate the algorithm and because you can represent any other alphabet with two symbols (if you had to.)

    I chose the names O and l (uppercase “o” and lowercase “L”) to look like 0 and 1 (zero and one) respectively.

    -
    syms = O, l = frozenset({'0'}), frozenset({'1'})
    +
    syms = O, l = frozenset({'0'}), frozenset({'1'})
     
    @@ -133,7 +133,7 @@ expression is one of:

    Where R and S stand for regular expressions.

    -
    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.
     

    Because they are formed of frozenset, tuple and str objects @@ -141,36 +141,36 @@ only, these datastructures are immutable.

    String Representation of RE Datastructures

    -
    def stringy(re):
    -    '''
    -    Return a nice string repr for a regular expression datastructure.
    -    '''
    -    if re == I: return '.'
    -    if re in syms: return next(iter(re))
    -    if re == y: return '^'
    -    if re == phi: return 'X'
    +
    def stringy(re):
    +    '''
    +    Return a nice string repr for a regular expression datastructure.
    +    '''
    +    if re == I: return '.'
    +    if re in syms: return next(iter(re))
    +    if re == y: return '^'
    +    if re == phi: return 'X'
     
    -    assert isinstance(re, tuple), repr(re)
    -    tag = re[0]
    +    assert isinstance(re, tuple), repr(re)
    +    tag = re[0]
     
    -    if tag == KSTAR:
    -        body = stringy(re[1])
    -        if not body: return body
    -        if len(body) > 1: return '(' + body + ")*"
    -        return body + '*'
    +    if tag == KSTAR:
    +        body = stringy(re[1])
    +        if not body: return body
    +        if len(body) > 1: return '(' + body + ")*"
    +        return body + '*'
     
    -    if tag == NOT:
    -        body = stringy(re[1])
    -        if not body: return body
    -        if len(body) > 1: return '(' + body + ")'"
    -        return body + "'"
    +    if tag == NOT:
    +        body = stringy(re[1])
    +        if not body: return body
    +        if len(body) > 1: return '(' + body + ")'"
    +        return body + "'"
     
    -    r, s = stringy(re[1]), stringy(re[2])
    -    if tag == CONS: return r + s
    -    if tag == OR:   return '%s | %s' % (r, s)
    -    if tag == AND:  return '(%s) & (%s)' % (r, s)
    +    r, s = stringy(re[1]), stringy(re[2])
    +    if tag == CONS: return r + s
    +    if tag == OR:   return '%s | %s' % (r, s)
    +    if tag == AND:  return '(%s) & (%s)' % (r, s)
     
    -    raise ValueError
    +    raise ValueError
     
    @@ -180,10 +180,10 @@ only, these datastructures are immutable.

    I = (0|1)*
     
    -
    I = (KSTAR, (OR, O, l))
    +
    I = (KSTAR, (OR, O, l))
     
    -
    print stringy(I)
    +
    print stringy(I)
     
    .
    @@ -193,57 +193,57 @@ only, these datastructures are immutable.

    (.111.) & (.01 + 11*)'

    The example expression from Brzozowski:

    -
    (.111.) & (.01 + 11*)'
    +
    (.111.) & (.01 + 11*)'
        a    &  (b  +  c)'
     

    Note that it contains one of everything.

    -
    a = (CONS, I, (CONS, l, (CONS, l, (CONS, l, I))))
    -b = (CONS, I, (CONS, O, l))
    -c = (CONS, l, (KSTAR, l))
    -it = (AND, a, (NOT, (OR, b, c)))
    +
    a = (CONS, I, (CONS, l, (CONS, l, (CONS, l, I))))
    +b = (CONS, I, (CONS, O, l))
    +c = (CONS, l, (KSTAR, l))
    +it = (AND, a, (NOT, (OR, b, c)))
     
    -
    print stringy(it)
    +
    print stringy(it)
     
    -
    (.111.) & ((.01 | 11*)')
    +
    (.111.) & ((.01 | 11*)')
     

    nully()

    Let’s get that auxiliary predicate function δ out of the way.

    -
    def nully(R):
    -    '''
    -    δ - Return λ if λ ⊆ R otherwise ϕ.
    -    '''
    +
    def nully(R):
    +    '''
    +    δ - Return λ if λ ⊆ R otherwise ϕ.
    +    '''
     
    -    # δ(a) → ϕ
    -    # δ(ϕ) → ϕ
    -    if R in syms or R == phi:
    -        return phi
    +    # δ(a) → ϕ
    +    # δ(ϕ) → ϕ
    +    if R in syms or R == phi:
    +        return phi
     
    -    # δ(λ) → λ
    -    if R == y:
    -        return y
    +    # δ(λ) → λ
    +    if R == y:
    +        return y
     
    -    tag = R[0]
    +    tag = R[0]
     
    -    # δ(R*) → λ
    -    if tag == KSTAR:
    -        return y
    +    # δ(R*) → λ
    +    if tag == KSTAR:
    +        return y
     
    -    # δ(¬R) δ(R)≟ϕ → λ
    -    # δ(¬R) δ(R)≟λ → ϕ
    -    if tag == NOT:
    -        return phi if nully(R[1]) else y
    +    # δ(¬R) δ(R)≟ϕ → λ
    +    # δ(¬R) δ(R)≟λ → ϕ
    +    if tag == NOT:
    +        return phi if nully(R[1]) else y
     
    -    # δ(R∘S) → δ(R) ∧ δ(S)
    -    # δ(R ∧ S) → δ(R) ∧ δ(S)
    -    # δ(R ∨ S) → δ(R) ∨ δ(S)
    -    r, s = nully(R[1]), nully(R[2])
    -    return r & s if tag in {AND, CONS} else r | s
    +    # δ(R∘S) → δ(R) ∧ δ(S)
    +    # δ(R ∧ S) → δ(R) ∧ δ(S)
    +    # δ(R ∨ S) → δ(R) ∨ δ(S)
    +    r, s = nully(R[1]), nully(R[2])
    +    return r & s if tag in {AND, CONS} else r | s
     
    @@ -252,71 +252,71 @@ only, these datastructures are immutable.

    This is the straightforward version with no “compaction”. It works fine, but does waaaay too much work because the expressions grow each derivation.

    -
    def D(symbol):
    +
    def D(symbol):
     
    -    def derv(R):
    +    def derv(R):
     
    -        # ∂a(a) → λ
    -        if R == {symbol}:
    -            return y
    +        # ∂a(a) → λ
    +        if R == {symbol}:
    +            return y
     
    -        # ∂a(λ) → ϕ
    -        # ∂a(ϕ) → ϕ
    -        # ∂a(¬a) → ϕ
    -        if R == y or R == phi or R in syms:
    -            return phi
    +        # ∂a(λ) → ϕ
    +        # ∂a(ϕ) → ϕ
    +        # ∂a(¬a) → ϕ
    +        if R == y or R == phi or R in syms:
    +            return phi
     
    -        tag = R[0]
    +        tag = R[0]
     
    -        # ∂a(R*) → ∂a(R)∘R*
    -        if tag == KSTAR:
    -            return (CONS, derv(R[1]), R)
    +        # ∂a(R*) → ∂a(R)∘R*
    +        if tag == KSTAR:
    +            return (CONS, derv(R[1]), R)
     
    -        # ∂a(¬R) → ¬∂a(R)
    -        if tag == NOT:
    -            return (NOT, derv(R[1]))
    +        # ∂a(¬R) → ¬∂a(R)
    +        if tag == NOT:
    +            return (NOT, derv(R[1]))
     
    -        r, s = R[1:]
    +        r, s = R[1:]
     
    -        # ∂a(R∘S) → ∂a(R)∘S ∨ δ(R)∘∂a(S)
    -        if tag == CONS:
    -            A = (CONS, derv(r), s)  # A = ∂a(R)∘S
    -            # A ∨ δ(R) ∘ ∂a(S)
    -            # A ∨  λ   ∘ ∂a(S) → A ∨ ∂a(S)
    -            # A ∨  ϕ   ∘ ∂a(S) → A ∨ ϕ → A
    -            return (OR, A, derv(s)) if nully(r) else A
    +        # ∂a(R∘S) → ∂a(R)∘S ∨ δ(R)∘∂a(S)
    +        if tag == CONS:
    +            A = (CONS, derv(r), s)  # A = ∂a(R)∘S
    +            # A ∨ δ(R) ∘ ∂a(S)
    +            # A ∨  λ   ∘ ∂a(S) → A ∨ ∂a(S)
    +            # A ∨  ϕ   ∘ ∂a(S) → A ∨ ϕ → A
    +            return (OR, A, derv(s)) if nully(r) else A
     
    -        # ∂a(R ∧ S) → ∂a(R) ∧ ∂a(S)
    -        # ∂a(R ∨ S) → ∂a(R) ∨ ∂a(S)
    -        return (tag, derv(r), derv(s))
    +        # ∂a(R ∧ S) → ∂a(R) ∧ ∂a(S)
    +        # ∂a(R ∨ S) → ∂a(R) ∨ ∂a(S)
    +        return (tag, derv(r), derv(s))
     
    -    return derv
    +    return derv
     

    Compaction Rules

    -
    def _compaction_rule(relation, one, zero, a, b):
    -    return (
    -        b if a == one else  # R*1 = 1*R = R
    -        a if b == one else
    -        zero if a == zero or b == zero else  # R*0 = 0*R = 0
    -        (relation, a, b)
    -        )
    +
    def _compaction_rule(relation, one, zero, a, b):
    +    return (
    +        b if a == one else  # R*1 = 1*R = R
    +        a if b == one else
    +        zero if a == zero or b == zero else  # R*0 = 0*R = 0
    +        (relation, a, b)
    +        )
     

    An elegant symmetry.

    -
    # R ∧ I = I ∧ R = R
    -# R ∧ ϕ = ϕ ∧ R = ϕ
    -_and = curry(_compaction_rule, AND, I, phi)
    +
    # R ∧ I = I ∧ R = R
    +# R ∧ ϕ = ϕ ∧ R = ϕ
    +_and = curry(_compaction_rule, AND, I, phi)
     
    -# R ∨ ϕ = ϕ ∨ R = R
    -# R ∨ I = I ∨ R = I
    -_or = curry(_compaction_rule, OR, phi, I)
    +# R ∨ ϕ = ϕ ∨ R = R
    +# R ∨ I = I ∨ R = I
    +_or = curry(_compaction_rule, OR, phi, I)
     
    -# R∘λ = λ∘R = R
    -# R∘ϕ = ϕ∘R = ϕ
    -_cons = curry(_compaction_rule, CONS, y, phi)
    +# R∘λ = λ∘R = R
    +# R∘ϕ = ϕ∘R = ϕ
    +_cons = curry(_compaction_rule, CONS, y, phi)
     
    @@ -325,21 +325,21 @@ derivation.

    We can save re-processing by remembering results we have already computed. RE datastructures are immutable and the derv() functions are pure so this is fine.

    -
    class Memo(object):
    +
    class Memo(object):
     
    -    def __init__(self, f):
    -        self.f = f
    -        self.calls = self.hits = 0
    -        self.mem = {}
    +    def __init__(self, f):
    +        self.f = f
    +        self.calls = self.hits = 0
    +        self.mem = {}
     
    -    def __call__(self, key):
    -        self.calls += 1
    -        try:
    -            result = self.mem[key]
    -            self.hits += 1
    -        except KeyError:
    -            result = self.mem[key] = self.f(key)
    -        return result
    +    def __call__(self, key):
    +        self.calls += 1
    +        try:
    +            result = self.mem[key]
    +            self.hits += 1
    +        except KeyError:
    +            result = self.mem[key] = self.f(key)
    +        return result
     
    @@ -347,47 +347,47 @@ are pure so this is fine.

    With “Compaction”

    This version uses the rules above to perform compaction. It keeps the expressions from growing too large.

    -
    def D_compaction(symbol):
    +
    def D_compaction(symbol):
     
    -    @Memo
    -    def derv(R):
    +    @Memo
    +    def derv(R):
     
    -        # ∂a(a) → λ
    -        if R == {symbol}:
    -            return y
    +        # ∂a(a) → λ
    +        if R == {symbol}:
    +            return y
     
    -        # ∂a(λ) → ϕ
    -        # ∂a(ϕ) → ϕ
    -        # ∂a(¬a) → ϕ
    -        if R == y or R == phi or R in syms:
    -            return phi
    +        # ∂a(λ) → ϕ
    +        # ∂a(ϕ) → ϕ
    +        # ∂a(¬a) → ϕ
    +        if R == y or R == phi or R in syms:
    +            return phi
     
    -        tag = R[0]
    +        tag = R[0]
     
    -        # ∂a(R*) → ∂a(R)∘R*
    -        if tag == KSTAR:
    -            return _cons(derv(R[1]), R)
    +        # ∂a(R*) → ∂a(R)∘R*
    +        if tag == KSTAR:
    +            return _cons(derv(R[1]), R)
     
    -        # ∂a(¬R) → ¬∂a(R)
    -        if tag == NOT:
    -            return (NOT, derv(R[1]))
    +        # ∂a(¬R) → ¬∂a(R)
    +        if tag == NOT:
    +            return (NOT, derv(R[1]))
     
    -        r, s = R[1:]
    +        r, s = R[1:]
     
    -        # ∂a(R∘S) → ∂a(R)∘S ∨ δ(R)∘∂a(S)
    -        if tag == CONS:
    -            A = _cons(derv(r), s)  # A = ∂a(r)∘s
    -            # A ∨ δ(R) ∘ ∂a(S)
    -            # A ∨  λ   ∘ ∂a(S) → A ∨ ∂a(S)
    -            # A ∨  ϕ   ∘ ∂a(S) → A ∨ ϕ → A
    -            return _or(A, derv(s)) if nully(r) else A
    +        # ∂a(R∘S) → ∂a(R)∘S ∨ δ(R)∘∂a(S)
    +        if tag == CONS:
    +            A = _cons(derv(r), s)  # A = ∂a(r)∘s
    +            # A ∨ δ(R) ∘ ∂a(S)
    +            # A ∨  λ   ∘ ∂a(S) → A ∨ ∂a(S)
    +            # A ∨  ϕ   ∘ ∂a(S) → A ∨ ϕ → A
    +            return _or(A, derv(s)) if nully(r) else A
     
    -        # ∂a(R ∧ S) → ∂a(R) ∧ ∂a(S)
    -        # ∂a(R ∨ S) → ∂a(R) ∨ ∂a(S)
    -        dr, ds = derv(r), derv(s)
    -        return _and(dr, ds) if tag == AND else _or(dr, ds)
    +        # ∂a(R ∧ S) → ∂a(R) ∧ ∂a(S)
    +        # ∂a(R ∨ S) → ∂a(R) ∨ ∂a(S)
    +        dr, ds = derv(r), derv(s)
    +        return _and(dr, ds) if tag == AND else _or(dr, ds)
     
    -    return derv
    +    return derv
     
    @@ -395,59 +395,59 @@ expressions from growing too large.

    Let’s try it out…

    (FIXME: redo.)

    -
    o, z = D_compaction('0'), D_compaction('1')
    -REs = set()
    -N = 5
    -names = list(product(*(N * [(0, 1)])))
    -dervs = list(product(*(N * [(o, z)])))
    -for name, ds in zip(names, dervs):
    -    R = it
    -    ds = list(ds)
    -    while ds:
    -        R = ds.pop()(R)
    -        if R == phi or R == I:
    -            break
    -        REs.add(R)
    +
    o, z = D_compaction('0'), D_compaction('1')
    +REs = set()
    +N = 5
    +names = list(product(*(N * [(0, 1)])))
    +dervs = list(product(*(N * [(o, z)])))
    +for name, ds in zip(names, dervs):
    +    R = it
    +    ds = list(ds)
    +    while ds:
    +        R = ds.pop()(R)
    +        if R == phi or R == I:
    +            break
    +        REs.add(R)
     
    -print stringy(it) ; print
    -print o.hits, '/', o.calls
    -print z.hits, '/', z.calls
    -print
    -for s in sorted(map(stringy, REs), key=lambda n: (len(n), n)):
    -    print s
    +print stringy(it) ; print
    +print o.hits, '/', o.calls
    +print z.hits, '/', z.calls
    +print
    +for s in sorted(map(stringy, REs), key=lambda n: (len(n), n)):
    +    print s
     
    -
    (.111.) & ((.01 | 11*)')
    +
    (.111.) & ((.01 | 11*)')
     
     92 / 122
     92 / 122
     
    -(.01)'
    -(.01 | 1)'
    -(.01 | ^)'
    -(.01 | 1*)'
    -(.111.) & ((.01 | 1)')
    -(.111. | 11.) & ((.01 | ^)')
    -(.111. | 11. | 1.) & ((.01)')
    -(.111. | 11.) & ((.01 | 1*)')
    -(.111. | 11. | 1.) & ((.01 | 1*)')
    +(.01)'
    +(.01 | 1)'
    +(.01 | ^)'
    +(.01 | 1*)'
    +(.111.) & ((.01 | 1)')
    +(.111. | 11.) & ((.01 | ^)')
    +(.111. | 11. | 1.) & ((.01)')
    +(.111. | 11.) & ((.01 | 1*)')
    +(.111. | 11. | 1.) & ((.01 | 1*)')
     

    Should match:

    -
    (.111.) & ((.01 | 11*)')
    +
    (.111.) & ((.01 | 11*)')
     
     92 / 122
     92 / 122
     
    -(.01     )'
    -(.01 | 1 )'
    -(.01 | ^ )'
    -(.01 | 1*)'
    -(.111.)            & ((.01 | 1 )')
    -(.111. | 11.)      & ((.01 | ^ )')
    -(.111. | 11.)      & ((.01 | 1*)')
    -(.111. | 11. | 1.) & ((.01     )')
    -(.111. | 11. | 1.) & ((.01 | 1*)')
    +(.01     )'
    +(.01 | 1 )'
    +(.01 | ^ )'
    +(.01 | 1*)'
    +(.111.)            & ((.01 | 1 )')
    +(.111. | 11.)      & ((.01 | ^ )')
    +(.111. | 11.)      & ((.01 | 1*)')
    +(.111. | 11. | 1.) & ((.01     )')
    +(.111. | 11. | 1.) & ((.01 | 1*)')
     
    @@ -495,7 +495,7 @@ for now.

    State Machine

    We can drive the regular expressions to flesh out the underlying state machine transition table.

    -
    .111. & (.01 + 11*)'
    +
    .111. & (.01 + 11*)'
     

    Says, “Three or more 1’s and not ending in 01 nor composed of all 1’s.”

    @@ -540,60 +540,60 @@ a --1--> ∂1(a)

    And so on, each new unique RE is a new state in the FSM table.

    Here are the derived REs at each state:

    -
    a = (.111.) & ((.01 | 11*)')
    -b = (.111.) & ((.01 | 1)')
    -c = (.111. | 11.) & ((.01 | 1*)')
    -d = (.111. | 11.) & ((.01 | ^)')
    -e = (.111. | 11. | 1.) & ((.01 | 1*)')
    -f = (.111. | 11. | 1.) & ((.01)')
    -g = (.01 | 1*)'
    -h = (.01)'
    -i = (.01 | 1)'
    -j = (.01 | ^)'
    +
    a = (.111.) & ((.01 | 11*)')
    +b = (.111.) & ((.01 | 1)')
    +c = (.111. | 11.) & ((.01 | 1*)')
    +d = (.111. | 11.) & ((.01 | ^)')
    +e = (.111. | 11. | 1.) & ((.01 | 1*)')
    +f = (.111. | 11. | 1.) & ((.01)')
    +g = (.01 | 1*)'
    +h = (.01)'
    +i = (.01 | 1)'
    +j = (.01 | ^)'
     

    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 & disappears once it has been matched.

    -
    from collections import defaultdict
    -from pprint import pprint
    -from string import ascii_lowercase
    +
    from collections import defaultdict
    +from pprint import pprint
    +from string import ascii_lowercase
     
    -
    d0, d1 = D_compaction('0'), D_compaction('1')
    +
    d0, d1 = D_compaction('0'), D_compaction('1')
     

    explore()

    -
    def explore(re):
    +
    def explore(re):
     
    -    # Don't have more than 26 states...
    -    names = defaultdict(iter(ascii_lowercase).next)
    +    # Don't have more than 26 states...
    +    names = defaultdict(iter(ascii_lowercase).next)
     
    -    table, accepting = dict(), set()
    +    table, accepting = dict(), set()
     
    -    to_check = {re}
    -    while to_check:
    +    to_check = {re}
    +    while to_check:
     
    -        re = to_check.pop()
    -        state_name = names[re]
    +        re = to_check.pop()
    +        state_name = names[re]
     
    -        if (state_name, 0) in table:
    -            continue
    +        if (state_name, 0) in table:
    +            continue
     
    -        if nully(re):
    -            accepting.add(state_name)
    +        if nully(re):
    +            accepting.add(state_name)
     
    -        o, i = d0(re), d1(re)
    -        table[state_name, 0] = names[o] ; to_check.add(o)
    -        table[state_name, 1] = names[i] ; to_check.add(i)
    +        o, i = d0(re), d1(re)
    +        table[state_name, 0] = names[o] ; to_check.add(o)
    +        table[state_name, 1] = names[i] ; to_check.add(i)
     
    -    return table, accepting
    +    return table, accepting
     
    -
    table, accepting = explore(it)
    -table
    +
    table, accepting = explore(it)
    +table
     
    {('a', 0): 'b',
    @@ -618,7 +618,7 @@ disappears once it has been matched.

    ('j', 1): 'h'}
    -
    accepting
    +
    accepting
     
    {'h', 'i'}
    @@ -629,31 +629,31 @@ disappears once it has been matched.

    Generate Diagram

    Once we have the FSM table and the set of accepting states we can generate the diagram above.

    -
    _template = '''\
    -digraph finite_state_machine {
    -  rankdir=LR;
    -  size="8,5"
    -  node [shape = doublecircle]; %s;
    -  node [shape = circle];
    -%s
    -}
    -'''
    +
    _template = '''\
    +digraph finite_state_machine {
    +  rankdir=LR;
    +  size="8,5"
    +  node [shape = doublecircle]; %s;
    +  node [shape = circle];
    +%s
    +}
    +'''
     
    -def link(fr, nm, label):
    -    return '  %s -> %s [ label = "%s" ];' % (fr, nm, label)
    +def link(fr, nm, label):
    +    return '  %s -> %s [ label = "%s" ];' % (fr, nm, label)
     
     
    -def make_graph(table, accepting):
    -    return _template % (
    -        ' '.join(accepting),
    -        '\n'.join(
    -          link(from_, to, char)
    -          for (from_, char), (to) in sorted(table.iteritems())
    -          )
    -        )
    +def make_graph(table, accepting):
    +    return _template % (
    +        ' '.join(accepting),
    +        '\n'.join(
    +          link(from_, to, char)
    +          for (from_, char), (to) in sorted(table.iteritems())
    +          )
    +        )
     
    -
    print make_graph(table, accepting)
    +
    print make_graph(table, accepting)
     
    digraph finite_state_machine {
    @@ -699,14 +699,14 @@ hard-code the information in the table into a little patch of branches.

    Trampoline Function

    Python has no GOTO statement but we can fake it with a “trampoline” function.

    -
    def trampoline(input_, jump_from, accepting):
    -    I = iter(input_)
    -    while True:
    -        try:
    -            bounce_to = jump_from(I)
    -        except StopIteration:
    -            return jump_from in accepting
    -        jump_from = bounce_to
    +
    def trampoline(input_, jump_from, accepting):
    +    I = iter(input_)
    +    while True:
    +        try:
    +            bounce_to = jump_from(I)
    +        except StopIteration:
    +            return jump_from in accepting
    +        jump_from = bounce_to
     
    @@ -714,17 +714,17 @@ function.

    Stream Functions

    Little helpers to process the iterator of our data (a “stream” of “1” and “0” characters, not bits.)

    -
    getch = lambda I: int(next(I))
    +
    getch = lambda I: int(next(I))
     
     
    -def _1(I):
    -    '''Loop on ones.'''
    -    while getch(I): pass
    +def _1(I):
    +    '''Loop on ones.'''
    +    while getch(I): pass
     
     
    -def _0(I):
    -    '''Loop on zeros.'''
    -    while not getch(I): pass
    +def _0(I):
    +    '''Loop on zeros.'''
    +    while not getch(I): pass
     
    @@ -735,28 +735,28 @@ and “0” characters, not bits.)

    code. (You have to imagine that these are GOTO statements in C or branches in assembly and that the state names are branch destination labels.)

    -
    a = lambda I: c if getch(I) else b
    -b = lambda I: _0(I) or d
    -c = lambda I: e if getch(I) else b
    -d = lambda I: f if getch(I) else b
    -e = lambda I: g if getch(I) else b
    -f = lambda I: h if getch(I) else b
    -g = lambda I: _1(I) or i
    -h = lambda I: _1(I) or i
    -i = lambda I: _0(I) or j
    -j = lambda I: h if getch(I) else i
    +
    a = lambda I: c if getch(I) else b
    +b = lambda I: _0(I) or d
    +c = lambda I: e if getch(I) else b
    +d = lambda I: f if getch(I) else b
    +e = lambda I: g if getch(I) else b
    +f = lambda I: h if getch(I) else b
    +g = lambda I: _1(I) or i
    +h = lambda I: _1(I) or i
    +i = lambda I: _0(I) or j
    +j = lambda I: h if getch(I) else i
     

    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 accepting state and g isn’t.

    -
    def acceptable(input_):
    -    return trampoline(input_, a, {h, i})
    +
    def acceptable(input_):
    +    return trampoline(input_, a, {h, i})
     
    -
    for n in range(2**5):
    -    s = bin(n)[2:]
    -    print '%05s' % s, acceptable(s)
    +
    for n in range(2**5):
    +    s = bin(n)[2:]
    +    print '%05s' % s, acceptable(s)
     
        0 False
    @@ -928,7 +928,7 @@ derivative-with-respect-to-N of some other state/RE:


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Developing.html b/docs/sphinx_docs/_build/html/notebooks/Developing.html index 164db0d..6a2808e 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Developing.html +++ b/docs/sphinx_docs/_build/html/notebooks/Developing.html @@ -13,7 +13,7 @@ - + @@ -113,7 +113,7 @@ these differences to the counter one-by-one in a loop.

    go we need a function that will accept the sum, the counter, and the next term to add, and that adds the term to the counter and a copy of the counter to the running sum. This function will do that:

    -
    PE1.1 == + [+] dupdip
    +
    PE1.1 == + [+] dupdip
     
    define('PE1.1 == + [+] dupdip')
    @@ -122,10 +122,10 @@ the counter to the running sum. This function will do that:

    V('0 0 3 PE1.1')
     
    -
            . 0 0 3 PE1.1
    -      0 . 0 3 PE1.1
    -    0 0 . 3 PE1.1
    -  0 0 3 . PE1.1
    +
            . 0 0 3 PE1.1
    +      0 . 0 3 PE1.1
    +    0 0 . 3 PE1.1
    +  0 0 3 . PE1.1
       0 0 3 . + [+] dupdip
         0 3 . [+] dupdip
     0 3 [+] . dupdip
    @@ -137,73 +137,73 @@ the counter to the running sum. This function will do that:

    V('0 0 [3 2 1 3 1 2 3] [PE1.1] step')
     
    -
                                . 0 0 [3 2 1 3 1 2 3] [PE1.1] step
    -                          0 . 0 [3 2 1 3 1 2 3] [PE1.1] step
    -                        0 0 . [3 2 1 3 1 2 3] [PE1.1] step
    -        0 0 [3 2 1 3 1 2 3] . [PE1.1] step
    -0 0 [3 2 1 3 1 2 3] [PE1.1] . step
    -              0 0 3 [PE1.1] . i [2 1 3 1 2 3] [PE1.1] step
    -                      0 0 3 . PE1.1 [2 1 3 1 2 3] [PE1.1] step
    -                      0 0 3 . + [+] dupdip [2 1 3 1 2 3] [PE1.1] step
    -                        0 3 . [+] dupdip [2 1 3 1 2 3] [PE1.1] step
    -                    0 3 [+] . dupdip [2 1 3 1 2 3] [PE1.1] step
    -                        0 3 . + 3 [2 1 3 1 2 3] [PE1.1] step
    -                          3 . 3 [2 1 3 1 2 3] [PE1.1] step
    -                        3 3 . [2 1 3 1 2 3] [PE1.1] step
    -          3 3 [2 1 3 1 2 3] . [PE1.1] step
    -  3 3 [2 1 3 1 2 3] [PE1.1] . step
    -              3 3 2 [PE1.1] . i [1 3 1 2 3] [PE1.1] step
    -                      3 3 2 . PE1.1 [1 3 1 2 3] [PE1.1] step
    -                      3 3 2 . + [+] dupdip [1 3 1 2 3] [PE1.1] step
    -                        3 5 . [+] dupdip [1 3 1 2 3] [PE1.1] step
    -                    3 5 [+] . dupdip [1 3 1 2 3] [PE1.1] step
    -                        3 5 . + 5 [1 3 1 2 3] [PE1.1] step
    -                          8 . 5 [1 3 1 2 3] [PE1.1] step
    -                        8 5 . [1 3 1 2 3] [PE1.1] step
    -            8 5 [1 3 1 2 3] . [PE1.1] step
    -    8 5 [1 3 1 2 3] [PE1.1] . step
    -              8 5 1 [PE1.1] . i [3 1 2 3] [PE1.1] step
    -                      8 5 1 . PE1.1 [3 1 2 3] [PE1.1] step
    -                      8 5 1 . + [+] dupdip [3 1 2 3] [PE1.1] step
    -                        8 6 . [+] dupdip [3 1 2 3] [PE1.1] step
    -                    8 6 [+] . dupdip [3 1 2 3] [PE1.1] step
    -                        8 6 . + 6 [3 1 2 3] [PE1.1] step
    -                         14 . 6 [3 1 2 3] [PE1.1] step
    -                       14 6 . [3 1 2 3] [PE1.1] step
    -             14 6 [3 1 2 3] . [PE1.1] step
    -     14 6 [3 1 2 3] [PE1.1] . step
    -             14 6 3 [PE1.1] . i [1 2 3] [PE1.1] step
    -                     14 6 3 . PE1.1 [1 2 3] [PE1.1] step
    -                     14 6 3 . + [+] dupdip [1 2 3] [PE1.1] step
    -                       14 9 . [+] dupdip [1 2 3] [PE1.1] step
    -                   14 9 [+] . dupdip [1 2 3] [PE1.1] step
    -                       14 9 . + 9 [1 2 3] [PE1.1] step
    -                         23 . 9 [1 2 3] [PE1.1] step
    -                       23 9 . [1 2 3] [PE1.1] step
    -               23 9 [1 2 3] . [PE1.1] step
    -       23 9 [1 2 3] [PE1.1] . step
    -             23 9 1 [PE1.1] . i [2 3] [PE1.1] step
    -                     23 9 1 . PE1.1 [2 3] [PE1.1] step
    -                     23 9 1 . + [+] dupdip [2 3] [PE1.1] step
    -                      23 10 . [+] dupdip [2 3] [PE1.1] step
    -                  23 10 [+] . dupdip [2 3] [PE1.1] step
    -                      23 10 . + 10 [2 3] [PE1.1] step
    -                         33 . 10 [2 3] [PE1.1] step
    -                      33 10 . [2 3] [PE1.1] step
    -                33 10 [2 3] . [PE1.1] step
    -        33 10 [2 3] [PE1.1] . step
    -            33 10 2 [PE1.1] . i [3] [PE1.1] step
    -                    33 10 2 . PE1.1 [3] [PE1.1] step
    -                    33 10 2 . + [+] dupdip [3] [PE1.1] step
    -                      33 12 . [+] dupdip [3] [PE1.1] step
    -                  33 12 [+] . dupdip [3] [PE1.1] step
    -                      33 12 . + 12 [3] [PE1.1] step
    -                         45 . 12 [3] [PE1.1] step
    -                      45 12 . [3] [PE1.1] step
    -                  45 12 [3] . [PE1.1] step
    -          45 12 [3] [PE1.1] . step
    -            45 12 3 [PE1.1] . i
    -                    45 12 3 . PE1.1
    +
                                . 0 0 [3 2 1 3 1 2 3] [PE1.1] step
    +                          0 . 0 [3 2 1 3 1 2 3] [PE1.1] step
    +                        0 0 . [3 2 1 3 1 2 3] [PE1.1] step
    +        0 0 [3 2 1 3 1 2 3] . [PE1.1] step
    +0 0 [3 2 1 3 1 2 3] [PE1.1] . step
    +              0 0 3 [PE1.1] . i [2 1 3 1 2 3] [PE1.1] step
    +                      0 0 3 . PE1.1 [2 1 3 1 2 3] [PE1.1] step
    +                      0 0 3 . + [+] dupdip [2 1 3 1 2 3] [PE1.1] step
    +                        0 3 . [+] dupdip [2 1 3 1 2 3] [PE1.1] step
    +                    0 3 [+] . dupdip [2 1 3 1 2 3] [PE1.1] step
    +                        0 3 . + 3 [2 1 3 1 2 3] [PE1.1] step
    +                          3 . 3 [2 1 3 1 2 3] [PE1.1] step
    +                        3 3 . [2 1 3 1 2 3] [PE1.1] step
    +          3 3 [2 1 3 1 2 3] . [PE1.1] step
    +  3 3 [2 1 3 1 2 3] [PE1.1] . step
    +              3 3 2 [PE1.1] . i [1 3 1 2 3] [PE1.1] step
    +                      3 3 2 . PE1.1 [1 3 1 2 3] [PE1.1] step
    +                      3 3 2 . + [+] dupdip [1 3 1 2 3] [PE1.1] step
    +                        3 5 . [+] dupdip [1 3 1 2 3] [PE1.1] step
    +                    3 5 [+] . dupdip [1 3 1 2 3] [PE1.1] step
    +                        3 5 . + 5 [1 3 1 2 3] [PE1.1] step
    +                          8 . 5 [1 3 1 2 3] [PE1.1] step
    +                        8 5 . [1 3 1 2 3] [PE1.1] step
    +            8 5 [1 3 1 2 3] . [PE1.1] step
    +    8 5 [1 3 1 2 3] [PE1.1] . step
    +              8 5 1 [PE1.1] . i [3 1 2 3] [PE1.1] step
    +                      8 5 1 . PE1.1 [3 1 2 3] [PE1.1] step
    +                      8 5 1 . + [+] dupdip [3 1 2 3] [PE1.1] step
    +                        8 6 . [+] dupdip [3 1 2 3] [PE1.1] step
    +                    8 6 [+] . dupdip [3 1 2 3] [PE1.1] step
    +                        8 6 . + 6 [3 1 2 3] [PE1.1] step
    +                         14 . 6 [3 1 2 3] [PE1.1] step
    +                       14 6 . [3 1 2 3] [PE1.1] step
    +             14 6 [3 1 2 3] . [PE1.1] step
    +     14 6 [3 1 2 3] [PE1.1] . step
    +             14 6 3 [PE1.1] . i [1 2 3] [PE1.1] step
    +                     14 6 3 . PE1.1 [1 2 3] [PE1.1] step
    +                     14 6 3 . + [+] dupdip [1 2 3] [PE1.1] step
    +                       14 9 . [+] dupdip [1 2 3] [PE1.1] step
    +                   14 9 [+] . dupdip [1 2 3] [PE1.1] step
    +                       14 9 . + 9 [1 2 3] [PE1.1] step
    +                         23 . 9 [1 2 3] [PE1.1] step
    +                       23 9 . [1 2 3] [PE1.1] step
    +               23 9 [1 2 3] . [PE1.1] step
    +       23 9 [1 2 3] [PE1.1] . step
    +             23 9 1 [PE1.1] . i [2 3] [PE1.1] step
    +                     23 9 1 . PE1.1 [2 3] [PE1.1] step
    +                     23 9 1 . + [+] dupdip [2 3] [PE1.1] step
    +                      23 10 . [+] dupdip [2 3] [PE1.1] step
    +                  23 10 [+] . dupdip [2 3] [PE1.1] step
    +                      23 10 . + 10 [2 3] [PE1.1] step
    +                         33 . 10 [2 3] [PE1.1] step
    +                      33 10 . [2 3] [PE1.1] step
    +                33 10 [2 3] . [PE1.1] step
    +        33 10 [2 3] [PE1.1] . step
    +            33 10 2 [PE1.1] . i [3] [PE1.1] step
    +                    33 10 2 . PE1.1 [3] [PE1.1] step
    +                    33 10 2 . + [+] dupdip [3] [PE1.1] step
    +                      33 12 . [+] dupdip [3] [PE1.1] step
    +                  33 12 [+] . dupdip [3] [PE1.1] step
    +                      33 12 . + 12 [3] [PE1.1] step
    +                         45 . 12 [3] [PE1.1] step
    +                      45 12 . [3] [PE1.1] step
    +                  45 12 [3] . [PE1.1] step
    +          45 12 [3] [PE1.1] . step
    +            45 12 3 [PE1.1] . i
    +                    45 12 3 . PE1.1
                         45 12 3 . + [+] dupdip
                           45 15 . [+] dupdip
                       45 15 [+] . dupdip
    @@ -279,15 +279,15 @@ integer terms from the list.

    V('0 0 14811 PE1.2')
     
    -
                          . 0 0 14811 PE1.2
    -                    0 . 0 14811 PE1.2
    -                  0 0 . 14811 PE1.2
    -            0 0 14811 . PE1.2
    -            0 0 14811 . [3 & PE1.1] dupdip 2 >>
    -0 0 14811 [3 & PE1.1] . dupdip 2 >>
    -            0 0 14811 . 3 & PE1.1 14811 2 >>
    -          0 0 14811 3 . & PE1.1 14811 2 >>
    -                0 0 3 . PE1.1 14811 2 >>
    +
                          . 0 0 14811 PE1.2
    +                    0 . 0 14811 PE1.2
    +                  0 0 . 14811 PE1.2
    +            0 0 14811 . PE1.2
    +            0 0 14811 . [3 & PE1.1] dupdip 2 >>
    +0 0 14811 [3 & PE1.1] . dupdip 2 >>
    +            0 0 14811 . 3 & PE1.1 14811 2 >>
    +          0 0 14811 3 . & PE1.1 14811 2 >>
    +                0 0 3 . PE1.1 14811 2 >>
                     0 0 3 . + [+] dupdip 14811 2 >>
                       0 3 . [+] dupdip 14811 2 >>
                   0 3 [+] . dupdip 14811 2 >>
    @@ -302,15 +302,15 @@ integer terms from the list.

    V('3 3 3702 PE1.2')
     
    -
                         . 3 3 3702 PE1.2
    -                   3 . 3 3702 PE1.2
    -                 3 3 . 3702 PE1.2
    -            3 3 3702 . PE1.2
    -            3 3 3702 . [3 & PE1.1] dupdip 2 >>
    -3 3 3702 [3 & PE1.1] . dupdip 2 >>
    -            3 3 3702 . 3 & PE1.1 3702 2 >>
    -          3 3 3702 3 . & PE1.1 3702 2 >>
    -               3 3 2 . PE1.1 3702 2 >>
    +
                         . 3 3 3702 PE1.2
    +                   3 . 3 3702 PE1.2
    +                 3 3 . 3702 PE1.2
    +            3 3 3702 . PE1.2
    +            3 3 3702 . [3 & PE1.1] dupdip 2 >>
    +3 3 3702 [3 & PE1.1] . dupdip 2 >>
    +            3 3 3702 . 3 & PE1.1 3702 2 >>
    +          3 3 3702 3 . & PE1.1 3702 2 >>
    +               3 3 2 . PE1.1 3702 2 >>
                    3 3 2 . + [+] dupdip 3702 2 >>
                      3 5 . [+] dupdip 3702 2 >>
                  3 5 [+] . dupdip 3702 2 >>
    @@ -325,127 +325,127 @@ integer terms from the list.

    V('0 0 14811 7 [PE1.2] times pop')
     
    -
                          . 0 0 14811 7 [PE1.2] times pop
    -                    0 . 0 14811 7 [PE1.2] times pop
    -                  0 0 . 14811 7 [PE1.2] times pop
    -            0 0 14811 . 7 [PE1.2] times pop
    -          0 0 14811 7 . [PE1.2] times pop
    -  0 0 14811 7 [PE1.2] . times pop
    -    0 0 14811 [PE1.2] . i 6 [PE1.2] times pop
    -            0 0 14811 . PE1.2 6 [PE1.2] times pop
    -            0 0 14811 . [3 & PE1.1] dupdip 2 >> 6 [PE1.2] times pop
    -0 0 14811 [3 & PE1.1] . dupdip 2 >> 6 [PE1.2] times pop
    -            0 0 14811 . 3 & PE1.1 14811 2 >> 6 [PE1.2] times pop
    -          0 0 14811 3 . & PE1.1 14811 2 >> 6 [PE1.2] times pop
    -                0 0 3 . PE1.1 14811 2 >> 6 [PE1.2] times pop
    -                0 0 3 . + [+] dupdip 14811 2 >> 6 [PE1.2] times pop
    -                  0 3 . [+] dupdip 14811 2 >> 6 [PE1.2] times pop
    -              0 3 [+] . dupdip 14811 2 >> 6 [PE1.2] times pop
    -                  0 3 . + 3 14811 2 >> 6 [PE1.2] times pop
    -                    3 . 3 14811 2 >> 6 [PE1.2] times pop
    -                  3 3 . 14811 2 >> 6 [PE1.2] times pop
    -            3 3 14811 . 2 >> 6 [PE1.2] times pop
    -          3 3 14811 2 . >> 6 [PE1.2] times pop
    -             3 3 3702 . 6 [PE1.2] times pop
    -           3 3 3702 6 . [PE1.2] times pop
    -   3 3 3702 6 [PE1.2] . times pop
    -     3 3 3702 [PE1.2] . i 5 [PE1.2] times pop
    -             3 3 3702 . PE1.2 5 [PE1.2] times pop
    -             3 3 3702 . [3 & PE1.1] dupdip 2 >> 5 [PE1.2] times pop
    - 3 3 3702 [3 & PE1.1] . dupdip 2 >> 5 [PE1.2] times pop
    -             3 3 3702 . 3 & PE1.1 3702 2 >> 5 [PE1.2] times pop
    -           3 3 3702 3 . & PE1.1 3702 2 >> 5 [PE1.2] times pop
    -                3 3 2 . PE1.1 3702 2 >> 5 [PE1.2] times pop
    -                3 3 2 . + [+] dupdip 3702 2 >> 5 [PE1.2] times pop
    -                  3 5 . [+] dupdip 3702 2 >> 5 [PE1.2] times pop
    -              3 5 [+] . dupdip 3702 2 >> 5 [PE1.2] times pop
    -                  3 5 . + 5 3702 2 >> 5 [PE1.2] times pop
    -                    8 . 5 3702 2 >> 5 [PE1.2] times pop
    -                  8 5 . 3702 2 >> 5 [PE1.2] times pop
    -             8 5 3702 . 2 >> 5 [PE1.2] times pop
    -           8 5 3702 2 . >> 5 [PE1.2] times pop
    -              8 5 925 . 5 [PE1.2] times pop
    -            8 5 925 5 . [PE1.2] times pop
    -    8 5 925 5 [PE1.2] . times pop
    -      8 5 925 [PE1.2] . i 4 [PE1.2] times pop
    -              8 5 925 . PE1.2 4 [PE1.2] times pop
    -              8 5 925 . [3 & PE1.1] dupdip 2 >> 4 [PE1.2] times pop
    -  8 5 925 [3 & PE1.1] . dupdip 2 >> 4 [PE1.2] times pop
    -              8 5 925 . 3 & PE1.1 925 2 >> 4 [PE1.2] times pop
    -            8 5 925 3 . & PE1.1 925 2 >> 4 [PE1.2] times pop
    -                8 5 1 . PE1.1 925 2 >> 4 [PE1.2] times pop
    -                8 5 1 . + [+] dupdip 925 2 >> 4 [PE1.2] times pop
    -                  8 6 . [+] dupdip 925 2 >> 4 [PE1.2] times pop
    -              8 6 [+] . dupdip 925 2 >> 4 [PE1.2] times pop
    -                  8 6 . + 6 925 2 >> 4 [PE1.2] times pop
    -                   14 . 6 925 2 >> 4 [PE1.2] times pop
    -                 14 6 . 925 2 >> 4 [PE1.2] times pop
    -             14 6 925 . 2 >> 4 [PE1.2] times pop
    -           14 6 925 2 . >> 4 [PE1.2] times pop
    -             14 6 231 . 4 [PE1.2] times pop
    -           14 6 231 4 . [PE1.2] times pop
    -   14 6 231 4 [PE1.2] . times pop
    -     14 6 231 [PE1.2] . i 3 [PE1.2] times pop
    -             14 6 231 . PE1.2 3 [PE1.2] times pop
    -             14 6 231 . [3 & PE1.1] dupdip 2 >> 3 [PE1.2] times pop
    - 14 6 231 [3 & PE1.1] . dupdip 2 >> 3 [PE1.2] times pop
    -             14 6 231 . 3 & PE1.1 231 2 >> 3 [PE1.2] times pop
    -           14 6 231 3 . & PE1.1 231 2 >> 3 [PE1.2] times pop
    -               14 6 3 . PE1.1 231 2 >> 3 [PE1.2] times pop
    -               14 6 3 . + [+] dupdip 231 2 >> 3 [PE1.2] times pop
    -                 14 9 . [+] dupdip 231 2 >> 3 [PE1.2] times pop
    -             14 9 [+] . dupdip 231 2 >> 3 [PE1.2] times pop
    -                 14 9 . + 9 231 2 >> 3 [PE1.2] times pop
    -                   23 . 9 231 2 >> 3 [PE1.2] times pop
    -                 23 9 . 231 2 >> 3 [PE1.2] times pop
    -             23 9 231 . 2 >> 3 [PE1.2] times pop
    -           23 9 231 2 . >> 3 [PE1.2] times pop
    -              23 9 57 . 3 [PE1.2] times pop
    -            23 9 57 3 . [PE1.2] times pop
    -    23 9 57 3 [PE1.2] . times pop
    -      23 9 57 [PE1.2] . i 2 [PE1.2] times pop
    -              23 9 57 . PE1.2 2 [PE1.2] times pop
    -              23 9 57 . [3 & PE1.1] dupdip 2 >> 2 [PE1.2] times pop
    -  23 9 57 [3 & PE1.1] . dupdip 2 >> 2 [PE1.2] times pop
    -              23 9 57 . 3 & PE1.1 57 2 >> 2 [PE1.2] times pop
    -            23 9 57 3 . & PE1.1 57 2 >> 2 [PE1.2] times pop
    -               23 9 1 . PE1.1 57 2 >> 2 [PE1.2] times pop
    -               23 9 1 . + [+] dupdip 57 2 >> 2 [PE1.2] times pop
    -                23 10 . [+] dupdip 57 2 >> 2 [PE1.2] times pop
    -            23 10 [+] . dupdip 57 2 >> 2 [PE1.2] times pop
    -                23 10 . + 10 57 2 >> 2 [PE1.2] times pop
    -                   33 . 10 57 2 >> 2 [PE1.2] times pop
    -                33 10 . 57 2 >> 2 [PE1.2] times pop
    -             33 10 57 . 2 >> 2 [PE1.2] times pop
    -           33 10 57 2 . >> 2 [PE1.2] times pop
    -             33 10 14 . 2 [PE1.2] times pop
    -           33 10 14 2 . [PE1.2] times pop
    -   33 10 14 2 [PE1.2] . times pop
    -     33 10 14 [PE1.2] . i 1 [PE1.2] times pop
    -             33 10 14 . PE1.2 1 [PE1.2] times pop
    -             33 10 14 . [3 & PE1.1] dupdip 2 >> 1 [PE1.2] times pop
    - 33 10 14 [3 & PE1.1] . dupdip 2 >> 1 [PE1.2] times pop
    -             33 10 14 . 3 & PE1.1 14 2 >> 1 [PE1.2] times pop
    -           33 10 14 3 . & PE1.1 14 2 >> 1 [PE1.2] times pop
    -              33 10 2 . PE1.1 14 2 >> 1 [PE1.2] times pop
    -              33 10 2 . + [+] dupdip 14 2 >> 1 [PE1.2] times pop
    -                33 12 . [+] dupdip 14 2 >> 1 [PE1.2] times pop
    -            33 12 [+] . dupdip 14 2 >> 1 [PE1.2] times pop
    -                33 12 . + 12 14 2 >> 1 [PE1.2] times pop
    -                   45 . 12 14 2 >> 1 [PE1.2] times pop
    -                45 12 . 14 2 >> 1 [PE1.2] times pop
    -             45 12 14 . 2 >> 1 [PE1.2] times pop
    -           45 12 14 2 . >> 1 [PE1.2] times pop
    -              45 12 3 . 1 [PE1.2] times pop
    -            45 12 3 1 . [PE1.2] times pop
    -    45 12 3 1 [PE1.2] . times pop
    -      45 12 3 [PE1.2] . i pop
    -              45 12 3 . PE1.2 pop
    -              45 12 3 . [3 & PE1.1] dupdip 2 >> pop
    -  45 12 3 [3 & PE1.1] . dupdip 2 >> pop
    -              45 12 3 . 3 & PE1.1 3 2 >> pop
    -            45 12 3 3 . & PE1.1 3 2 >> pop
    -              45 12 3 . PE1.1 3 2 >> pop
    +
                          . 0 0 14811 7 [PE1.2] times pop
    +                    0 . 0 14811 7 [PE1.2] times pop
    +                  0 0 . 14811 7 [PE1.2] times pop
    +            0 0 14811 . 7 [PE1.2] times pop
    +          0 0 14811 7 . [PE1.2] times pop
    +  0 0 14811 7 [PE1.2] . times pop
    +    0 0 14811 [PE1.2] . i 6 [PE1.2] times pop
    +            0 0 14811 . PE1.2 6 [PE1.2] times pop
    +            0 0 14811 . [3 & PE1.1] dupdip 2 >> 6 [PE1.2] times pop
    +0 0 14811 [3 & PE1.1] . dupdip 2 >> 6 [PE1.2] times pop
    +            0 0 14811 . 3 & PE1.1 14811 2 >> 6 [PE1.2] times pop
    +          0 0 14811 3 . & PE1.1 14811 2 >> 6 [PE1.2] times pop
    +                0 0 3 . PE1.1 14811 2 >> 6 [PE1.2] times pop
    +                0 0 3 . + [+] dupdip 14811 2 >> 6 [PE1.2] times pop
    +                  0 3 . [+] dupdip 14811 2 >> 6 [PE1.2] times pop
    +              0 3 [+] . dupdip 14811 2 >> 6 [PE1.2] times pop
    +                  0 3 . + 3 14811 2 >> 6 [PE1.2] times pop
    +                    3 . 3 14811 2 >> 6 [PE1.2] times pop
    +                  3 3 . 14811 2 >> 6 [PE1.2] times pop
    +            3 3 14811 . 2 >> 6 [PE1.2] times pop
    +          3 3 14811 2 . >> 6 [PE1.2] times pop
    +             3 3 3702 . 6 [PE1.2] times pop
    +           3 3 3702 6 . [PE1.2] times pop
    +   3 3 3702 6 [PE1.2] . times pop
    +     3 3 3702 [PE1.2] . i 5 [PE1.2] times pop
    +             3 3 3702 . PE1.2 5 [PE1.2] times pop
    +             3 3 3702 . [3 & PE1.1] dupdip 2 >> 5 [PE1.2] times pop
    + 3 3 3702 [3 & PE1.1] . dupdip 2 >> 5 [PE1.2] times pop
    +             3 3 3702 . 3 & PE1.1 3702 2 >> 5 [PE1.2] times pop
    +           3 3 3702 3 . & PE1.1 3702 2 >> 5 [PE1.2] times pop
    +                3 3 2 . PE1.1 3702 2 >> 5 [PE1.2] times pop
    +                3 3 2 . + [+] dupdip 3702 2 >> 5 [PE1.2] times pop
    +                  3 5 . [+] dupdip 3702 2 >> 5 [PE1.2] times pop
    +              3 5 [+] . dupdip 3702 2 >> 5 [PE1.2] times pop
    +                  3 5 . + 5 3702 2 >> 5 [PE1.2] times pop
    +                    8 . 5 3702 2 >> 5 [PE1.2] times pop
    +                  8 5 . 3702 2 >> 5 [PE1.2] times pop
    +             8 5 3702 . 2 >> 5 [PE1.2] times pop
    +           8 5 3702 2 . >> 5 [PE1.2] times pop
    +              8 5 925 . 5 [PE1.2] times pop
    +            8 5 925 5 . [PE1.2] times pop
    +    8 5 925 5 [PE1.2] . times pop
    +      8 5 925 [PE1.2] . i 4 [PE1.2] times pop
    +              8 5 925 . PE1.2 4 [PE1.2] times pop
    +              8 5 925 . [3 & PE1.1] dupdip 2 >> 4 [PE1.2] times pop
    +  8 5 925 [3 & PE1.1] . dupdip 2 >> 4 [PE1.2] times pop
    +              8 5 925 . 3 & PE1.1 925 2 >> 4 [PE1.2] times pop
    +            8 5 925 3 . & PE1.1 925 2 >> 4 [PE1.2] times pop
    +                8 5 1 . PE1.1 925 2 >> 4 [PE1.2] times pop
    +                8 5 1 . + [+] dupdip 925 2 >> 4 [PE1.2] times pop
    +                  8 6 . [+] dupdip 925 2 >> 4 [PE1.2] times pop
    +              8 6 [+] . dupdip 925 2 >> 4 [PE1.2] times pop
    +                  8 6 . + 6 925 2 >> 4 [PE1.2] times pop
    +                   14 . 6 925 2 >> 4 [PE1.2] times pop
    +                 14 6 . 925 2 >> 4 [PE1.2] times pop
    +             14 6 925 . 2 >> 4 [PE1.2] times pop
    +           14 6 925 2 . >> 4 [PE1.2] times pop
    +             14 6 231 . 4 [PE1.2] times pop
    +           14 6 231 4 . [PE1.2] times pop
    +   14 6 231 4 [PE1.2] . times pop
    +     14 6 231 [PE1.2] . i 3 [PE1.2] times pop
    +             14 6 231 . PE1.2 3 [PE1.2] times pop
    +             14 6 231 . [3 & PE1.1] dupdip 2 >> 3 [PE1.2] times pop
    + 14 6 231 [3 & PE1.1] . dupdip 2 >> 3 [PE1.2] times pop
    +             14 6 231 . 3 & PE1.1 231 2 >> 3 [PE1.2] times pop
    +           14 6 231 3 . & PE1.1 231 2 >> 3 [PE1.2] times pop
    +               14 6 3 . PE1.1 231 2 >> 3 [PE1.2] times pop
    +               14 6 3 . + [+] dupdip 231 2 >> 3 [PE1.2] times pop
    +                 14 9 . [+] dupdip 231 2 >> 3 [PE1.2] times pop
    +             14 9 [+] . dupdip 231 2 >> 3 [PE1.2] times pop
    +                 14 9 . + 9 231 2 >> 3 [PE1.2] times pop
    +                   23 . 9 231 2 >> 3 [PE1.2] times pop
    +                 23 9 . 231 2 >> 3 [PE1.2] times pop
    +             23 9 231 . 2 >> 3 [PE1.2] times pop
    +           23 9 231 2 . >> 3 [PE1.2] times pop
    +              23 9 57 . 3 [PE1.2] times pop
    +            23 9 57 3 . [PE1.2] times pop
    +    23 9 57 3 [PE1.2] . times pop
    +      23 9 57 [PE1.2] . i 2 [PE1.2] times pop
    +              23 9 57 . PE1.2 2 [PE1.2] times pop
    +              23 9 57 . [3 & PE1.1] dupdip 2 >> 2 [PE1.2] times pop
    +  23 9 57 [3 & PE1.1] . dupdip 2 >> 2 [PE1.2] times pop
    +              23 9 57 . 3 & PE1.1 57 2 >> 2 [PE1.2] times pop
    +            23 9 57 3 . & PE1.1 57 2 >> 2 [PE1.2] times pop
    +               23 9 1 . PE1.1 57 2 >> 2 [PE1.2] times pop
    +               23 9 1 . + [+] dupdip 57 2 >> 2 [PE1.2] times pop
    +                23 10 . [+] dupdip 57 2 >> 2 [PE1.2] times pop
    +            23 10 [+] . dupdip 57 2 >> 2 [PE1.2] times pop
    +                23 10 . + 10 57 2 >> 2 [PE1.2] times pop
    +                   33 . 10 57 2 >> 2 [PE1.2] times pop
    +                33 10 . 57 2 >> 2 [PE1.2] times pop
    +             33 10 57 . 2 >> 2 [PE1.2] times pop
    +           33 10 57 2 . >> 2 [PE1.2] times pop
    +             33 10 14 . 2 [PE1.2] times pop
    +           33 10 14 2 . [PE1.2] times pop
    +   33 10 14 2 [PE1.2] . times pop
    +     33 10 14 [PE1.2] . i 1 [PE1.2] times pop
    +             33 10 14 . PE1.2 1 [PE1.2] times pop
    +             33 10 14 . [3 & PE1.1] dupdip 2 >> 1 [PE1.2] times pop
    + 33 10 14 [3 & PE1.1] . dupdip 2 >> 1 [PE1.2] times pop
    +             33 10 14 . 3 & PE1.1 14 2 >> 1 [PE1.2] times pop
    +           33 10 14 3 . & PE1.1 14 2 >> 1 [PE1.2] times pop
    +              33 10 2 . PE1.1 14 2 >> 1 [PE1.2] times pop
    +              33 10 2 . + [+] dupdip 14 2 >> 1 [PE1.2] times pop
    +                33 12 . [+] dupdip 14 2 >> 1 [PE1.2] times pop
    +            33 12 [+] . dupdip 14 2 >> 1 [PE1.2] times pop
    +                33 12 . + 12 14 2 >> 1 [PE1.2] times pop
    +                   45 . 12 14 2 >> 1 [PE1.2] times pop
    +                45 12 . 14 2 >> 1 [PE1.2] times pop
    +             45 12 14 . 2 >> 1 [PE1.2] times pop
    +           45 12 14 2 . >> 1 [PE1.2] times pop
    +              45 12 3 . 1 [PE1.2] times pop
    +            45 12 3 1 . [PE1.2] times pop
    +    45 12 3 1 [PE1.2] . times pop
    +      45 12 3 [PE1.2] . i pop
    +              45 12 3 . PE1.2 pop
    +              45 12 3 . [3 & PE1.1] dupdip 2 >> pop
    +  45 12 3 [3 & PE1.1] . dupdip 2 >> pop
    +              45 12 3 . 3 & PE1.1 3 2 >> pop
    +            45 12 3 3 . & PE1.1 3 2 >> pop
    +              45 12 3 . PE1.1 3 2 >> pop
                   45 12 3 . + [+] dupdip 3 2 >> pop
                     45 15 . [+] dupdip 3 2 >> pop
                 45 15 [+] . dupdip 3 2 >> pop
    @@ -471,10 +471,10 @@ integer terms from the list.

    Let’s refactor

    -
      14811 7 [PE1.2] times pop
    -  14811 4 [PE1.2] times pop
    -  14811 n [PE1.2] times pop
    -n 14811 swap [PE1.2] times pop
    +
      14811 7 [PE1.2] times pop
    +  14811 4 [PE1.2] times pop
    +  14811 n [PE1.2] times pop
    +n 14811 swap [PE1.2] times pop
     
    define('PE1.3 == 14811 swap [PE1.2] times pop')
    @@ -493,10 +493,10 @@ integer terms from the list.

    Here’s our joy program all in one place. It doesn’t make so much sense, but if you have read through the above description of how it was derived I hope it’s clear.

    -
    PE1.1 == + [+] dupdip
    -PE1.2 == [3 & PE1.1] dupdip 2 >>
    -PE1.3 == 14811 swap [PE1.2] times pop
    -PE1 == 0 0 66 [7 PE1.3] times 4 PE1.3 pop
    +
    PE1.1 == + [+] dupdip
    +PE1.2 == [3 & PE1.1] dupdip 2 >>
    +PE1.3 == 14811 swap [PE1.2] times pop
    +PE1 == 0 0 66 [7 PE1.3] times 4 PE1.3 pop
     
    @@ -697,6 +697,7 @@ is just:

  • Treating Trees II: treestep
  • Using x to Generate Values
  • Newton’s method
  • +
  • Square Spiral Example Joy Code
  • Traversing Datastructures with Zippers
  • The Blissful Elegance of Typing Joy
  • Type Checking
  • @@ -747,7 +748,7 @@ is just:


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Generator_Programs.html b/docs/sphinx_docs/_build/html/notebooks/Generator_Programs.html index 938d607..166daab 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Generator_Programs.html +++ b/docs/sphinx_docs/_build/html/notebooks/Generator_Programs.html @@ -36,7 +36,7 @@

    Using x to Generate Values

    Cf. jp-reprod.html

    -
    from notebook_preamble import J, V, define
    +
    from notebook_preamble import J, V, define
     

    Consider the x combinator:

    @@ -76,7 +76,7 @@ function C

    Let’s try it:

    -
    V('[0 swap [dup ++] dip rest cons] x')
    +
    V('[0 swap [dup ++] dip rest cons] x')
     
                                               . [0 swap [dup ++] dip rest cons] x
    @@ -95,7 +95,7 @@ function C
     

    After one application of x the quoted program contains 1 and 0 is below it on the stack.

    -
    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')
     
    0 1 2 3 4
    @@ -103,10 +103,10 @@ function C
     

    direco

    -
    define('direco == dip rest cons')
    +
    define('direco == dip rest cons')
     
    -
    V('[0 swap [dup ++] direco] x')
    +
    V('[0 swap [dup ++] direco] x')
     
                                        . [0 swap [dup ++] direco] x
    @@ -147,17 +147,17 @@ our quoted program:

    G == [direco] cons [swap] swoncat cons
    -
    define('G == [direco] cons [swap] swoncat cons')
    +
    define('G == [direco] cons [swap] swoncat cons')
     

    Let’s try it out:

    -
    J('0 [dup ++] G')
    +
    J('0 [dup ++] G')
     
    [0 swap [dup ++] direco]
     
    -
    J('0 [dup ++] G x x x pop')
    +
    J('0 [dup ++] G x x x pop')
     
    0 1 2
    @@ -165,7 +165,7 @@ our quoted program:

    Powers of 2

    -
    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')
     
    1 2 4 8 16 32 64 128 256
    @@ -176,7 +176,7 @@ our quoted program:

    [x] times

    If we have one of these quoted programs we can drive it using times with the x combinator.

    -
    J('23 [dup ++] G 5 [x] times')
    +
    J('23 [dup ++] G 5 [x] times')
     
    23 24 25 26 27 [28 swap [dup ++] direco]
    @@ -200,14 +200,14 @@ int:

    And pick them off by masking with 3 (binary 11) and then shifting the int right two bits.

    -
    define('PE1.1 == dup [3 &] dip 2 >>')
    +
    define('PE1.1 == dup [3 &] dip 2 >>')
     
    -
    V('14811 PE1.1')
    +
    V('14811 PE1.1')
     
    -
                      . 14811 PE1.1
    -            14811 . PE1.1
    +
                      . 14811 PE1.1
    +            14811 . PE1.1
                 14811 . dup [3 &] dip 2 >>
           14811 14811 . [3 &] dip 2 >>
     14811 14811 [3 &] . dip 2 >>
    @@ -220,36 +220,36 @@ int right two bits.

    If we plug 14811 and [PE1.1] into our generator form…

    -
    J('14811 [PE1.1] G')
    +
    J('14811 [PE1.1] G')
     
    -
    [14811 swap [PE1.1] direco]
    +
    [14811 swap [PE1.1] direco]
     

    …we get a generator that works for seven cycles before it reaches zero:

    -
    J('[14811 swap [PE1.1] direco] 7 [x] times')
    +
    J('[14811 swap [PE1.1] direco] 7 [x] times')
     
    -
    3 2 1 3 1 2 3 [0 swap [PE1.1] direco]
    +
    3 2 1 3 1 2 3 [0 swap [PE1.1] direco]
     

    Reset at Zero

    We need a function that checks if the int has reached zero and resets it if so.

    -
    define('PE1.1.check == dup [pop 14811] [] branch')
    +
    define('PE1.1.check == dup [pop 14811] [] branch')
     
    -
    J('14811 [PE1.1.check PE1.1] G')
    +
    J('14811 [PE1.1.check PE1.1] G')
     
    -
    [14811 swap [PE1.1.check PE1.1] direco]
    +
    [14811 swap [PE1.1.check PE1.1] direco]
     
    -
    J('[14811 swap [PE1.1.check PE1.1] direco] 21 [x] times')
    +
    J('[14811 swap [PE1.1.check PE1.1] direco] 21 [x] times')
     
    -
    3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 [0 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 [0 swap [PE1.1.check PE1.1] direco]
     

    (It would be more efficient to reset the int every seven cycles but @@ -262,20 +262,20 @@ say.)

    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 numbers sixty-six times and then four more.

    -
    J('7 66 * 4 +')
    +
    J('7 66 * 4 +')
     
    466
     

    If we drive our generator 466 times and sum the stack we get 999.

    -
    J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times')
    +
    J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times')
     
    -
    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]
     
    -
    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')
     
    999
    @@ -285,11 +285,11 @@ numbers sixty-six times and then four more.

    Project Euler Problem One

    -
    define('PE1.2 == + dup [+] dip')
    +
    define('PE1.2 == + dup [+] dip')
     

    Now we can add PE1.2 to the quoted program given to G.

    -
    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')
     
    233168
    @@ -351,13 +351,13 @@ numbers sixty-six times and then four more.

    fib_gen == [1 1 F]
    -
    define('fib == + [popdd over] cons infra uncons')
    +
    define('fib == + [popdd over] cons infra uncons')
     
    -
    define('fib_gen == [1 1 fib]')
    +
    define('fib_gen == [1 1 fib]')
     
    -
    J('fib_gen 10 [x] times')
    +
    J('fib_gen 10 [x] times')
     
    1 2 3 5 8 13 21 34 55 89 [144 89 fib]
    @@ -373,21 +373,21 @@ not exceed four million, find the sum of the even-valued terms.

    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 pops it otherwise.

    -
    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 “exceed four million”.

    -
    define('>4M == 4000000 >')
    +
    define('>4M == 4000000 >')
     

    Now it’s straightforward to define PE2 as a recursive function that generates terms in the Fibonacci sequence until they exceed four million and sums the even ones.

    -
    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')
     
    -
    J('PE2')
    +
    J('PE2')
     
    4613732
    @@ -400,8 +400,8 @@ and sums the even ones.

    even == dup 2 % >4M == 4000000 > -PE2.1 == even [+] [pop] branch -PE2 == 0 fib_gen x [pop >4M] [popop] [[PE2.1] dip x] primrec +PE2.1 == even [+] [pop] branch +PE2 == 0 fib_gen x [pop >4M] [popop] [[PE2.1] dip x] primrec
    @@ -418,23 +418,23 @@ and sums the even ones.

    Every third term is even.

    -
    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.
     
    1 1 2 [3 2 fib]
     

    Drive the generator three times and popop the two odd terms.

    -
    J('[1 0 fib] x x x [popop] dipd')
    +
    J('[1 0 fib] x x x [popop] dipd')
     
    2 [3 2 fib]
     
    -
    define('PE2.2 == x x x [popop] dipd')
    +
    define('PE2.2 == x x x [popop] dipd')
     
    -
    J('[1 0 fib] 10 [PE2.2] times')
    +
    J('[1 0 fib] 10 [PE2.2] times')
     
    2 8 34 144 610 2584 10946 46368 196418 832040 [1346269 832040 fib]
    @@ -442,7 +442,7 @@ and sums the even ones.

    Replace x with our new driver function PE2.2 and start our fib generator at 1 0.

    -
    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')
     
    4613732
    @@ -457,10 +457,10 @@ modifications to the default 
     

    An Interesting Variation

    -
    define('codireco == cons dip rest cons')
    +
    define('codireco == cons dip rest cons')
     
    -
    V('[0 [dup ++] codireco] x')
    +
    V('[0 [dup ++] codireco] x')
     
                                     . [0 [dup ++] codireco] x
    @@ -479,10 +479,10 @@ modifications to the default 0 [1 [dup ++] codireco] .
     
    -
    define('G == [codireco] cons cons')
    +
    define('G == [codireco] cons cons')
     
    -
    J('230 [dup ++] G 5 [x] times pop')
    +
    J('230 [dup ++] G 5 [x] times pop')
     
    230 231 232 233 234
    @@ -577,7 +577,7 @@ modifications to the default 
     
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Intro.html b/docs/sphinx_docs/_build/html/notebooks/Intro.html index 658704d..d56d9e0 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Intro.html +++ b/docs/sphinx_docs/_build/html/notebooks/Intro.html @@ -369,7 +369,7 @@ developing structured processes.


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Newton-Raphson.html b/docs/sphinx_docs/_build/html/notebooks/Newton-Raphson.html index 4a8ff3a..5d23612 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Newton-Raphson.html +++ b/docs/sphinx_docs/_build/html/notebooks/Newton-Raphson.html @@ -13,7 +13,7 @@ - + @@ -40,7 +40,7 @@ to write a function that can compute the square root of a number.

    Cf. “Why Functional Programming Matters” by John Hughes

    -
    from notebook_preamble import J, V, define
    +
    from notebook_preamble import J, V, define
     
    @@ -92,10 +92,10 @@ function we’re writing. If we let 1 be the initial approximation:

    1 [dup 23 over / + 2 /] make_generator
    -
    define('gsra 1 swap [over / + 2 /] cons [dup] swoncat make_generator')
    +
    define('gsra 1 swap [over / + 2 /] cons [dup] swoncat make_generator')
     
    -
    J('23 gsra')
    +
    J('23 gsra')
     
    [1 [dup 23 over / + 2 /] codireco]
    @@ -103,7 +103,7 @@ function we’re writing. If we let 1 be the initial approximation:

    Let’s drive the generator a few time (with the x combinator) and square the approximation to see how well it works…

    -
    J('23 gsra 6 [x popd] times first sqr')
    +
    J('23 gsra 6 [x popd] times first sqr')
     
    23.0000000001585
    @@ -145,7 +145,7 @@ generated already and epsilon ε is handy on the stack…

    (abs(a-b)<=ε)
    -
    define('_within_P [first - abs] dip <=')
    +
    define('_within_P [first - abs] dip <=')
     
    @@ -157,7 +157,7 @@ generated already and epsilon ε is handy on the stack…

    b
    -
    define('_within_B roll< popop first')
    +
    define('_within_B roll< popop first')
     
    @@ -182,7 +182,7 @@ generated already and epsilon ε is handy on the stack…

    b [c G] ε within
    -
    define('_within_R [popd x] dip')
    +
    define('_within_R [popd x] dip')
     
    @@ -194,33 +194,33 @@ generated already and epsilon ε is handy on the stack…

    a [b G] ε ...
    -
    define('within x 0.000000001 [_within_P] [_within_B] [_within_R] tailrec')
    -define('sqrt gsra within')
    +
    define('within x 0.000000001 [_within_P] [_within_B] [_within_R] tailrec')
    +define('sqrt gsra within')
     

    Try it out…

    -
    J('36 sqrt')
    +
    J('36 sqrt')
     
    6.0
     
    -
    J('23 sqrt')
    +
    J('23 sqrt')
     
    4.795831523312719
     

    Check it.

    -
    4.795831523312719**2
    +
    4.795831523312719**2
     
    22.999999999999996
     
    -
    from math import sqrt
    +
    from math import sqrt
     
    -sqrt(23)
    +sqrt(23)
     
    4.795831523312719
    @@ -316,7 +316,7 @@ generated already and epsilon ε is handy on the stack…


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/NoUpdates.html b/docs/sphinx_docs/_build/html/notebooks/NoUpdates.html index 65498ab..797a302 100644 --- a/docs/sphinx_docs/_build/html/notebooks/NoUpdates.html +++ b/docs/sphinx_docs/_build/html/notebooks/NoUpdates.html @@ -93,6 +93,7 @@
  • Treating Trees II: treestep
  • Using x to Generate Values
  • Newton’s method
  • +
  • Square Spiral Example Joy Code
  • Traversing Datastructures with Zippers
  • The Blissful Elegance of Typing Joy
  • Type Checking
  • @@ -143,7 +144,7 @@
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Ordered_Binary_Trees.html b/docs/sphinx_docs/_build/html/notebooks/Ordered_Binary_Trees.html index 05fa302..6d63e16 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Ordered_Binary_Trees.html +++ b/docs/sphinx_docs/_build/html/notebooks/Ordered_Binary_Trees.html @@ -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 a contingent existence predicated on the disciplined use of these functions on otherwise undistinguished Joy datastructures.)

    -
    from notebook_preamble import D, J, V, define, DefinitionWrapper
    +
    from notebook_preamble import D, J, V, define, DefinitionWrapper
     
    @@ -100,10 +100,10 @@ functions on otherwise undistinguished Joy datastructures.)

    Tree-new == swap [[] []] cons cons
     
    -
    define('Tree-new == swap [[] []] cons cons')
    +
    define('Tree-new == swap [[] []] cons cons')
     
    -
    J('"v" "k" Tree-new')
    +
    J('"v" "k" Tree-new')
     
    ['k' 'v' [] []]
    @@ -159,10 +159,10 @@ comparison operator:

    P == pop roll> pop first
    -
    define('P == pop roll> pop first')
    +
    define('P == pop roll> pop first')
     
    -
    J('["old_key" 23 [] []] 17 "new_key" ["..."] P')
    +
    J('["old_key" 23 [] []] 17 "new_key" ["..."] P')
     
    'new_key' 'old_key'
    @@ -217,10 +217,10 @@ stack:

    T == cons cons [dipdd] cons infra
     
    -
    define('T == cons cons [dipdd] cons infra')
    +
    define('T == cons cons [dipdd] cons infra')
     
    -
    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')
     
    ['old_k' 'old_value' 'left' 'Tree-add' 'new_key' 'new_value' 'right']
    @@ -234,7 +234,7 @@ stack:

    [key_n value_n left right] value key [Tree-add] [P <] [Te] [Ee] ifte
    -
    define('E == [P <] [Te] [Ee] ifte')
    +
    define('E == [P <] [Te] [Ee] ifte')
     

    In this case Te works that same as T but on the left child tree @@ -243,10 +243,10 @@ instead of the right, so the only difference is that it must use

    Te == cons cons [dipd] cons infra
     
    -
    define('Te == cons cons [dipd] cons infra')
    +
    define('Te == cons cons [dipd] cons infra')
     
    -
    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')
     
    ['old_k' 'old_value' 'Tree-add' 'new_key' 'new_value' 'left' 'right']
    @@ -274,10 +274,10 @@ instead of the right, so the only difference is that it must use
                   [key new_value left right]
     
    -
    define('Ee == pop swap roll< rest rest cons cons')
    +
    define('Ee == pop swap roll< rest rest cons cons')
     
    -
    J('["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee')
    +
    J('["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee')
     
    ['k' 'new_value' 'left' 'right']
    @@ -302,43 +302,43 @@ instead of the right, so the only difference is that it must use
     Tree-add == [popop not] [[pop] dipd Tree-new] [] [R] genrec
     
    -
    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

    -
    J('[] 23 "b" Tree-add')  # Initial
    +
    J('[] 23 "b" Tree-add')  # Initial
     
    ['b' 23 [] []]
     
    -
    J('["b" 23 [] []] 88 "c" Tree-add')  # Greater than
    +
    J('["b" 23 [] []] 88 "c" Tree-add')  # Greater than
     
    ['b' 23 [] ['c' 88 [] []]]
     
    -
    J('["b" 23 [] []] 88 "a" Tree-add')  # Less than
    +
    J('["b" 23 [] []] 88 "a" Tree-add')  # Less than
     
    ['b' 23 ['a' 88 [] []] []]
     
    -
    J('["b" 23 [] []] 88 "b" Tree-add')  # Equal to
    +
    J('["b" 23 [] []] 88 "b" Tree-add')  # Equal to
     
    ['b' 88 [] []]
     
    -
    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.
     
    ['b' 23 ['a' 88 [] []] ['c' 44 [] []]]
     
    -
    J('[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step')
    +
    J('[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step')
     
    ['b' 23 ['a' 88 [] []] ['c' 44 [] []]]
    @@ -365,19 +365,19 @@ values:

    L
    -
    J("1 0 ['G'] ['E'] ['L'] cmp")
    +
    J("1 0 ['G'] ['E'] ['L'] cmp")
     
    'G'
     
    -
    J("1 1 ['G'] ['E'] ['L'] cmp")
    +
    J("1 1 ['G'] ['E'] ['L'] cmp")
     
    'E'
     
    -
    J("0 1 ['G'] ['E'] ['L'] cmp")
    +
    J("0 1 ['G'] ['E'] ['L'] cmp")
     
    'L'
    @@ -414,7 +414,7 @@ node key (by throwing everything else away):

    P == over [popop popop first] nullary
     
    -
    define('P == over [popop popop first] nullary')
    +
    define('P == over [popop popop first] nullary')
     

    Using cmp to simplify our code above at @@ -434,10 +434,10 @@ to understand:

    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')
    +
    define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec')
     
    -
    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.
     
    ['b' 23 ['a' 88 [] []] ['c' 44 [] []]]
    @@ -545,22 +545,22 @@ with an interesting situation:

    Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec
     
    -
    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

    -
    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.
     
    -
    J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter")
    +
    J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter")
     
    'b' 'a' 'c'
     
    -
    J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter")
    +
    J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter")
     
    23 88 44
    @@ -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
     :math:`O(log_2 N) <https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2>`__
     time.

    -
    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')
     
    [3 0 [2 0 [] []] [9 0 [5 0 [4 0 [] []] [8 0 [6 0 [] [7 0 [] []]] []]] []]]
     
    -
    define('to_set == [] swap [0 swap Tree-add] step')
    +
    define('to_set == [] swap [0 swap Tree-add] step')
     
    -
    J('[3 9 5 2 8 6 7 8 4] to_set')
    +
    J('[3 9 5 2 8 6 7 8 4] to_set')
     
    [3 0 [2 0 [] []] [9 0 [5 0 [4 0 [] []] [8 0 [6 0 [] [7 0 [] []]] []]] []]]
    @@ -592,10 +592,10 @@ time.

    And with that we can write a little program unique to remove duplicate items from a list.

    -
    define('unique == [to_set [first] Tree-iter] cons run')
    +
    define('unique == [to_set [first] Tree-iter] cons run')
     
    -
    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.
     
    [7 6 8 4 5 9 2 3]
    @@ -679,23 +679,23 @@ right side:

    Now we can sort sequences.

    -
    #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')
     
     
    -DefinitionWrapper.add_definitions('''
    +DefinitionWrapper.add_definitions('''
     
    -fourth == rest rest rest first
    +fourth == rest rest rest first
     
    -proc_left == [cons dip] dupdip
    -proc_current == [[first] dupdip] dip
    -proc_right == [fourth] dip i
    +proc_left == [cons dip] dupdip
    +proc_current == [[first] dupdip] dip
    +proc_right == [fourth] dip i
     
    -Tree-iter-order == [not] [pop] [dup third] [proc_left proc_current proc_right] genrec
    +Tree-iter-order == [not] [pop] [dup third] [proc_left proc_current proc_right] genrec
     
    -''', D)
    +''', D)
     
    -
    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')
     
    2 3 4 5 6 7 8 9
    @@ -835,54 +835,54 @@ because there’s no value to discard.

    Tree-get == [pop not] swap [] [P [T>] [E] [T<] cmp] genrec
    -
    # 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
    -# definitions that are only in scope for a given definition.  I don't want to implement
    -# that (yet) so...
    +
    # 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
    +# definitions that are only in scope for a given definition.  I don't want to implement
    +# that (yet) so...
     
     
    -define('''
    -Tree-get == [pop not] swap [] [
    -  over [pop popop first] nullary
    -  [[fourth] dipd i]
    -  [popop second]
    -  [[third] dipd i]
    -  cmp
    -  ] genrec
    -''')
    +define('''
    +Tree-get == [pop not] swap [] [
    +  over [pop popop first] nullary
    +  [[fourth] dipd i]
    +  [popop second]
    +  [[third] dipd i]
    +  cmp
    +  ] genrec
    +''')
     
    -
    J('["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get')
    +
    J('["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get')
     
    'mike not in tree'
     
    -
    J('["gary" 23 [] []] "gary" [popop "err"] Tree-get')
    +
    J('["gary" 23 [] []] "gary" [popop "err"] Tree-get')
     
    23
     
    -
    J('''
    +
    J('''
     
    -    [] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step
    +    [] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step
     
    -    'c' [popop 'not found'] Tree-get
    +    'c' [popop 'not found'] Tree-get
     
    -''')
    +''')
     
    2
     
    -
    J('''
    +
    J('''
     
    -    [] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step
    +    [] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step
     
    -    'd' [popop 'not found'] Tree-get
    +    'd' [popop 'not found'] Tree-get
     
    -''')
    +''')
     
    'not found'
    @@ -1160,11 +1160,11 @@ E == [
     W == dup W.rightmost W.unpack over
     E.clear_stuff == roll> popop rest
     E.delete == cons dipd
    -E.0 == E.clear_stuff [W] dip E.delete swap
    +E.0 == E.clear_stuff [W] dip E.delete swap
     E == [
         [[pop third not] pop fourth]
         [[pop fourth not] pop third]
    -    [[E.0] cons infra]
    +    [[E.0] cons infra]
     ] cond
     T> == [dipd] cons infra
     T< == [dipdd] cons infra
    @@ -1175,61 +1175,61 @@ E == [
     

    By the standards of the code I’ve written so far, this is a huge Joy program.

    -
    DefinitionWrapper.add_definitions('''
    -first_two == uncons uncons pop
    -fourth == rest rest rest first
    -?fourth == [] [fourth] [] ifte
    -W.rightmost == [?fourth] [fourth] while
    -E.clear_stuff == roll> popop rest
    -E.delete == cons dipd
    -W == dup W.rightmost first_two over
    -E.0 == E.clear_stuff [W] dip E.delete swap
    -E == [[[pop third not] pop fourth] [[pop fourth not] pop third] [[E.0] cons infra]] cond
    -T> == [dipd] cons infra
    -T< == [dipdd] cons infra
    -R0 == over first swap dup
    -R1 == cons roll> [T>] [E] [T<] cmp
    -Tree-Delete == [pop not] [pop] [R0] [R1] genrec
    -''', D)
    +
    DefinitionWrapper.add_definitions('''
    +first_two == uncons uncons pop
    +fourth == rest rest rest first
    +?fourth == [] [fourth] [] ifte
    +W.rightmost == [?fourth] [fourth] while
    +E.clear_stuff == roll> popop rest
    +E.delete == cons dipd
    +W == dup W.rightmost first_two over
    +E.0 == E.clear_stuff [W] dip E.delete swap
    +E == [[[pop third not] pop fourth] [[pop fourth not] pop third] [[E.0] cons infra]] cond
    +T> == [dipd] cons infra
    +T< == [dipdd] cons infra
    +R0 == over first swap dup
    +R1 == cons roll> [T>] [E] [T<] cmp
    +Tree-Delete == [pop not] [pop] [R0] [R1] genrec
    +''', D)
     
    -
    J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete ")
    +
    J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete ")
     
    ['a' 23 [] ['b' 88 [] []]]
     
    -
    J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete ")
    +
    J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete ")
     
    ['a' 23 [] ['c' 44 [] []]]
     
    -
    J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete ")
    +
    J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete ")
     
    ['b' 88 [] ['c' 44 [] []]]
     
    -
    J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete ")
    +
    J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete ")
     
    ['a' 23 [] ['b' 88 [] ['c' 44 [] []]]]
     
    -
    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')
     
    [4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]]
     
    -
    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 ")
     
    [4 0 [2 0 [1 0 [] []] []] [6 0 [5 0 [] []] [7 0 [] []]]]
     
    -
    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 ")
     
    [3 0 [2 0 [1 0 [] []] []] [6 0 [5 0 [] []] [7 0 [] []]]]
    @@ -1373,7 +1373,7 @@ Tree-delete == [pop not] [pop] [_Tree_delete_R0] [_Tree_delete_R1] genrec
     
     
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Quadratic.html b/docs/sphinx_docs/_build/html/notebooks/Quadratic.html index 4c2d7c8..86fe364 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Quadratic.html +++ b/docs/sphinx_docs/_build/html/notebooks/Quadratic.html @@ -13,7 +13,7 @@ - + @@ -34,7 +34,7 @@
    -
    from notebook_preamble import J, V, define
    +  
    from notebook_preamble import J, V, define
     
    @@ -100,11 +100,11 @@ the variables:

    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:

    -
    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:

    -
    J('3 1 1 quadratic')
    +
    J('3 1 1 quadratic')
     
    -0.3819660112501051 -2.618033988749895
    @@ -114,7 +114,7 @@ the right and say it’s the definition of the dip and dipd combinators building the main program
     by incorporating the values on the stack. Then that program runs and you
     get the results. This is pretty typical of Joy code.

    -
    V('-5 1 4 quadratic')
    +
    V('-5 1 4 quadratic')
     
                                                       . -5 1 4 quadratic
    @@ -253,7 +253,7 @@ get the results. This is pretty typical of Joy code.


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Recursion_Combinators.html b/docs/sphinx_docs/_build/html/notebooks/Recursion_Combinators.html index d143e1a..385778c 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Recursion_Combinators.html +++ b/docs/sphinx_docs/_build/html/notebooks/Recursion_Combinators.html @@ -33,7 +33,7 @@
    -
    from notebook_preamble import D, DefinitionWrapper, J, V, define
    +  
    from notebook_preamble import D, DefinitionWrapper, J, V, define
     
    @@ -101,18 +101,18 @@ cons list”.

It may be helpful to see this function implemented in imperative Python code.

-
def hylomorphism(c, F, P, G):
-    '''Return a hylomorphism function H.'''
+
def hylomorphism(c, F, P, G):
+    '''Return a hylomorphism function H.'''
 
-    def H(a):
-        if P(a):
-            result = c
-        else:
-            b, aa = G(a)
-            result = F(b, H(aa))  # b is stored in the stack frame during recursive call to H().
-        return result
+    def H(a):
+        if P(a):
+            result = c
+        else:
+            b, aa = G(a)
+            result = F(b, H(aa))  # b is stored in the stack frame during recursive call to H().
+        return result
 
-    return H
+    return H
 

Cf. “Bananas, Lenses, & Barbed @@ -185,7 +185,7 @@ the left so we have a definition for

-
define('hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec')
+
define('hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec')
 
@@ -200,17 +200,17 @@ of all positive integers less than that one. (In this case the types
  • [G] is [-- dup]

  • [F] is [+]

  • -
    define('triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism')
    +
    define('triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism')
     

    Let’s try it:

    -
    J('5 triangular_number')
    +
    J('5 triangular_number')
     
    10
     
    -
    J('[0 1 2 3 4 5 6] [triangular_number] map')
    +
    J('[0 1 2 3 4 5 6] [triangular_number] map')
     
    [0 0 1 3 6 10 15]
    @@ -372,10 +372,10 @@ values.

    == [0 <=] [pop []] [-- dup] [dip swons] genrec
    -
    define('range == [0 <=] [] [-- dup] [swons] hylomorphism')
    +
    define('range == [0 <=] [] [-- dup] [swons] hylomorphism')
     
    -
    J('5 range')
    +
    J('5 range')
     
    [4 3 2 1 0]
    @@ -388,10 +388,10 @@ values.

    == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec
    -
    define('range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec')
    +
    define('range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec')
     
    -
    J('5 range_reverse')
    +
    J('5 range_reverse')
     
    [0 1 2 3 4]
    @@ -404,10 +404,10 @@ values.

    == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec
    -
    define('ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec')
    +
    define('ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec')
     
    -
    J('5 ranger')
    +
    J('5 ranger')
     
    [5 4 3 2 1]
    @@ -420,10 +420,10 @@ values.

    == [] swap [0 <=] [pop] [[swons] dupdip --] primrec
    -
    define('ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec')
    +
    define('ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec')
     
    -
    J('5 ranger_reverse')
    +
    J('5 ranger_reverse')
     
    [1 2 3 4 5]
    @@ -444,17 +444,17 @@ and makes some new value.

    C == [not] c [uncons swap] [F] hylomorphism
     
    -
    define('swuncons == uncons swap')  # Awkward name.
    +
    define('swuncons == uncons swap')  # Awkward name.
     

    An example of a catamorphism is the sum function.

    sum == [not] 0 [swuncons] [+] hylomorphism
     
    -
    define('sum == [not] 0 [swuncons] [+] hylomorphism')
    +
    define('sum == [not] 0 [swuncons] [+] hylomorphism')
     
    -
    J('[5 4 3 2 1] sum')
    +
    J('[5 4 3 2 1] sum')
     
    15
    @@ -464,7 +464,7 @@ and makes some new value.

    The step combinator

    The step combinator will usually be better to use than catamorphism.

    -
    J('[step] help')
    +
    J('[step] help')
     
    Run a quoted program on each item in a sequence.
    @@ -488,10 +488,10 @@ and makes some new value.

    on top of the stack.
    -
    define('sum == 0 swap [+] step')
    +
    define('sum == 0 swap [+] step')
     
    -
    J('[5 4 3 2 1] sum')
    +
    J('[5 4 3 2 1] sum')
     
    15
    @@ -512,10 +512,10 @@ and makes some new value.

    P == 1 <=
    -
    define('factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec')
    +
    define('factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec')
     
    -
    J('5 factorial')
    +
    J('5 factorial')
     
    120
    @@ -544,10 +544,10 @@ pattern H2P == not
     
    -
    define('tails == [] swap [not] [pop] [rest dup [swons] dip] primrec')
    +
    define('tails == [] swap [not] [pop] [rest dup [swons] dip] primrec')
     
    -
    J('[1 2 3] tails')
    +
    J('[1 2 3] tails')
     
    [[] [3] [2 3]]
    @@ -675,7 +675,7 @@ Wire”


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Replacing.html b/docs/sphinx_docs/_build/html/notebooks/Replacing.html index 01108aa..f1fcbbc 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Replacing.html +++ b/docs/sphinx_docs/_build/html/notebooks/Replacing.html @@ -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 function to the dictionary is a meta-interpreter action, you have to do it in Python, not Joy.

    -
    from notebook_preamble import D, J, V
    +
    from notebook_preamble import D, J, V
     

    A long trace

    -
    V('[23 18] average')
    +
    V('[23 18] average')
     
                                      . [23 18] average
    @@ -105,30 +105,30 @@ it in Python, not Joy.

    An efficient sum function is already in the library. But for size we can use a “compiled” version hand-written in Python to speed up evaluation and make the trace more readable.

    -
    from joy.library import SimpleFunctionWrapper
    -from joy.utils.stack import iter_stack
    +
    from joy.library import SimpleFunctionWrapper
    +from joy.utils.stack import iter_stack
     
     
    -@SimpleFunctionWrapper
    -def size(stack):
    -    '''Return the size of the sequence on the stack.'''
    -    sequence, stack = stack
    -    n = 0
    -    for _ in iter_stack(sequence):
    -        n += 1
    -    return n, stack
    +@SimpleFunctionWrapper
    +def size(stack):
    +    '''Return the size of the sequence on the stack.'''
    +    sequence, stack = stack
    +    n = 0
    +    for _ in iter_stack(sequence):
    +        n += 1
    +    return n, stack
     

    Now we replace the old version in the dictionary with the new version, and re-evaluate the expression.

    -
    D['size'] = size
    +
    D['size'] = size
     

    A shorter trace

    You can see that size now executes in a single step.

    -
    V('[23 18] average')
    +
    V('[23 18] average')
     
                                      . [23 18] average
    @@ -251,7 +251,7 @@ and re-evaluate the expression.


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Square_Spiral.html b/docs/sphinx_docs/_build/html/notebooks/Square_Spiral.html index 474d0b8..a6033ad 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Square_Spiral.html +++ b/docs/sphinx_docs/_build/html/notebooks/Square_Spiral.html @@ -33,7 +33,7 @@
    -
    from notebook_preamble import J, V, define
    +  
    from notebook_preamble import J, V, define
     
    @@ -99,8 +99,8 @@ to apply abs 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.

    -
    define('&& [nullary] cons [nullary [0]] dip branch')
    -define('|| [nullary] cons [nullary] dip [1] branch')
    +
    define('&& [nullary] cons [nullary [0]] dip branch')
    +define('|| [nullary] cons [nullary] dip [1] branch')
     

    Given those, we can define x != y || x >= 0 as:

    @@ -143,7 +143,7 @@ legible.

    “Not Negative”

    -
    define('!- 0 >=')
    +
    define('!- 0 >=')
     
    @@ -169,29 +169,29 @@ of ifte
    -
    define('spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte')
    +
    define('spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte')
     

    Let’s try it out:

    -
    J('0 0 spiral_next')
    +
    J('0 0 spiral_next')
     
    1 0
     
    -
    J('1 0 spiral_next')
    +
    J('1 0 spiral_next')
     
    1 -1
     
    -
    J('1 -1 spiral_next')
    +
    J('1 -1 spiral_next')
     
    0 -1
     
    -
    J('0 -1 spiral_next')
    +
    J('0 -1 spiral_next')
     
    -1 -1
    @@ -240,7 +240,7 @@ From:

    [x' y']
    -
    J('[0 0] [spiral_next] infra')
    +
    J('[0 0] [spiral_next] infra')
     
    [0 1]
    @@ -262,7 +262,7 @@ us out of the value and stepper function:

    Here it is in action:

    -
    J('[0 0] [dup [spiral_next] infra] make_generator x x x x pop')
    +
    J('[0 0] [dup [spiral_next] infra] make_generator x x x x pop')
     
    [0 0] [0 1] [-1 1] [-1 0]
    @@ -290,13 +290,13 @@ 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.)

    -
    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')
    +
    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')
     
    -
    V('23 18 spiral_next')
    +
    V('23 18 spiral_next')
     
                                                                   . 23 18 spiral_next
    @@ -456,7 +456,7 @@ function” to generate the next pair from that.)


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/The_Four_Operations.html b/docs/sphinx_docs/_build/html/notebooks/The_Four_Operations.html index b2ae3a1..3be8e1e 100644 --- a/docs/sphinx_docs/_build/html/notebooks/The_Four_Operations.html +++ b/docs/sphinx_docs/_build/html/notebooks/The_Four_Operations.html @@ -404,7 +404,7 @@ evaluation, yeah?)


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Treestep.html b/docs/sphinx_docs/_build/html/notebooks/Treestep.html index 5c37053..f5d8d63 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Treestep.html +++ b/docs/sphinx_docs/_build/html/notebooks/Treestep.html @@ -125,13 +125,13 @@ the desired outcome.

    Extract a couple of auxiliary definitions:

    -
    TS.0 == [[not] swap] dip
    -TS.1 == [dip] cons [uncons] swoncat
    +
    TS.0 == [[not] swap] dip
    +TS.1 == [dip] cons [uncons] swoncat
     
    -
    [B] [N] TS.1 TS.0 [map C]                         genrec
    -[B] [N]           [map C]         [TS.1 TS.0] dip genrec
    -[B] [N] [C]         [map] swoncat [TS.1 TS.0] dip genrec
    +
    [B] [N] TS.1 TS.0 [map C]                         genrec
    +[B] [N]           [map C]         [TS.1 TS.0] dip genrec
    +[B] [N] [C]         [map] swoncat [TS.1 TS.0] dip genrec
     

    The givens are all to the left so we have our definition.

    @@ -148,17 +148,17 @@ the desired outcome.

    Define treestep

    -
    from notebook_preamble import D, J, V, define, DefinitionWrapper
    +
    from notebook_preamble import D, J, V, define, DefinitionWrapper
     
    -
    DefinitionWrapper.add_definitions('''
    +
    DefinitionWrapper.add_definitions('''
     
    -    _treestep_0 == [[not] swap] dip
    -    _treestep_1 == [dip] cons [uncons] swoncat
    -    treegrind == [_treestep_1 _treestep_0] dip genrec
    -    treestep == [map] swoncat treegrind
    +    _treestep_0 == [[not] swap] dip
    +    _treestep_1 == [dip] cons [uncons] swoncat
    +    treegrind == [_treestep_1 _treestep_0] dip genrec
    +    treestep == [map] swoncat treegrind
     
    -''', D)
    +''', D)
     
    @@ -169,7 +169,7 @@ all nodes in a tree with this function:

    sumtree == [pop 0] [] [sum +] treestep
     
    -
    define('sumtree == [pop 0] [] [sum +] treestep')
    +
    define('sumtree == [pop 0] [] [sum +] treestep')
     

    Running this function on an empty tree value gives zero:

    @@ -178,7 +178,7 @@ all nodes in a tree with this function:

    0
    -
    J('[] sumtree')  # Empty tree.
    +
    J('[] sumtree')  # Empty tree.
     
    0
    @@ -192,61 +192,61 @@ all nodes in a tree with this function:

    n+m
    -
    J('[23] sumtree')  # No child trees.
    +
    J('[23] sumtree')  # No child trees.
     
    23
     
    -
    J('[23 []] sumtree')  # Child tree, empty.
    +
    J('[23 []] sumtree')  # Child tree, empty.
     
    23
     
    -
    J('[23 [2 [4]] [3]] sumtree')  # Non-empty child trees.
    +
    J('[23 [2 [4]] [3]] sumtree')  # Non-empty child trees.
     
    32
     
    -
    J('[23 [2 [8] [9]] [3] [4 []]] sumtree')  # Etc...
    +
    J('[23 [2 [8] [9]] [3] [4 []]] sumtree')  # Etc...
     
    49
     
    -
    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".
     
    49
     
    -
    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.
     
    [23 [23 [23] [23]] [23] [23 []]]
     
    -
    J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep')
    +
    J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep')
     
    [1 [1 [1] [1]] [1] [1 []]]
     
    -
    J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree')
    +
    J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree')
     
    6
     
    -
    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.
     
    6
     
    -
    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.
     
    3
    @@ -277,7 +277,7 @@ all nodes in a tree with this function:

    This doesn’t quite work:

    -
    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')
     
    3 'B' 'B'
    @@ -299,7 +299,7 @@ depositing our results directly on the stack.

    [] [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')
    +
    J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]]   [] [first] [flatten cons] treestep')
     
    [3 2 9 5 4 8 6 7]
    @@ -322,7 +322,7 @@ depositing our results directly on the stack.

    [] [i roll< swons concat] [first] 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')
    +
    J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]]   [] [uncons pop] [i roll< swons concat] treestep')
     
    [2 3 4 5 6 7 8 9]
    @@ -343,7 +343,7 @@ non-empty node is:

    [key value] N [left right] [K] C
     
    -
    J('[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind')
    +
    J('[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind')
     
    ['key' 'value'] 'N' [['left'] ['right']] [[not] ['B'] [uncons ['N'] dip] ['C'] genrec] 'C'
    @@ -353,21 +353,21 @@ non-empty node is:

    treegrind with step

    Iteration through the nodes

    -
    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')
     
    [3 0] 'N' [2 0] 'N' [9 0] 'N' [5 0] 'N' [4 0] 'N' [8 0] 'N' [6 0] 'N' [7 0] 'N'
     

    Sum the nodes’ keys.

    -
    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')
     
    44
     

    Rebuild the tree using map (imitating treestep.)

    -
    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')
     
    [[103 0] [[102 0] [] []] [[109 0] [[105 0] [[104 0] [] []] [[108 0] [[106 0] [] [[107 0] [] []]] []]] []]]
    @@ -449,37 +449,37 @@ equal):

    To me, that seems simpler than the genrec version.

    -
    DefinitionWrapper.add_definitions('''
    +
    DefinitionWrapper.add_definitions('''
     
    -    T> == pop [first] dip i
    -    T< == pop [second] dip i
    -    E == roll> popop first
    -    P == roll< [roll< uncons swap] dip
    +    T> == pop [first] dip i
    +    T< == pop [second] dip i
    +    E == roll> popop first
    +    P == roll< [roll< uncons swap] dip
     
    -    Tree-get == [P [T>] [E] [T<] cmp] treegrind
    +    Tree-get == [P [T>] [E] [T<] cmp] treegrind
     
    -''', D)
    +''', D)
     
    -
    J('''\
    +
    J('''\
     
    -[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]
    +[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]
     
    -[] [5] Tree-get
    +[] [5] Tree-get
     
    -''')
    +''')
     
    15
     
    -
    J('''\
    +
    J('''\
     
    -[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]
    +[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]
     
    -[pop "nope"] [25] Tree-get
    +[pop "nope"] [25] Tree-get
     
    -''')
    +''')
     
    'nope'
    @@ -574,7 +574,7 @@ equal):


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/TypeChecking.html b/docs/sphinx_docs/_build/html/notebooks/TypeChecking.html index 142a672..09ebb68 100644 --- a/docs/sphinx_docs/_build/html/notebooks/TypeChecking.html +++ b/docs/sphinx_docs/_build/html/notebooks/TypeChecking.html @@ -35,33 +35,33 @@

    Type Checking

    -
    import logging, sys
    +
    import logging, sys
     
    -logging.basicConfig(
    -  format='%(message)s',
    -  stream=sys.stdout,
    -  level=logging.INFO,
    -  )
    +logging.basicConfig(
    +  format='%(message)s',
    +  stream=sys.stdout,
    +  level=logging.INFO,
    +  )
     
    -
    from joy.utils.types import (
    -    doc_from_stack_effect,
    -    infer,
    -    reify,
    -    unify,
    -    FUNCTIONS,
    -    JoyTypeError,
    -)
    +
    from joy.utils.types import (
    +    doc_from_stack_effect,
    +    infer,
    +    reify,
    +    unify,
    +    FUNCTIONS,
    +    JoyTypeError,
    +)
     
    -
    D = FUNCTIONS.copy()
    -del D['product']
    -globals().update(D)
    +
    D = FUNCTIONS.copy()
    +del D['product']
    +globals().update(D)
     

    An Example

    -
    fi, fo = infer(pop, swap, rolldown, rrest, ccons)[0]
    +
    fi, fo = infer(pop, swap, rolldown, rrest, ccons)[0]
     
    25 (--) ∘ pop swap rolldown rrest ccons
    @@ -72,32 +72,32 @@
     40 ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) ∘
     
    -
    print doc_from_stack_effect(fi, fo)
    +
    print doc_from_stack_effect(fi, fo)
     
    -
    ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1])
    +
    ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1])
     
    -
    from joy.parser import text_to_expression
    -from joy.utils.stack import stack_to_string
    +
    from joy.parser import text_to_expression
    +from joy.utils.stack import stack_to_string
     
    -
    e = text_to_expression('0 1 2 [3 4]')  # reverse order
    -print stack_to_string(e)
    +
    e = text_to_expression('0 1 2 [3 4]')  # reverse order
    +print stack_to_string(e)
     
    [3 4] 2 1 0
     
    -
    u = unify(e, fi)[0]
    -u
    +
    u = unify(e, fi)[0]
    +u
     
    {a1: 0, a2: 1, a3: 2, a4: 3, a5: 4, s2: (), s1: ()}
     
    -
    g = reify(u, (fi, fo))
    -print doc_from_stack_effect(*g)
    +
    g = reify(u, (fi, fo))
    +print doc_from_stack_effect(*g)
     
    (... [3 4 ] 2 1 0 -- ... [1 2 ])
    @@ -106,18 +106,18 @@
     

    Unification Works “in Reverse”

    -
    e = text_to_expression('[2 3]')
    +
    e = text_to_expression('[2 3]')
     
    -
    u = unify(e, fo)[0]  # output side, not input side
    -u
    +
    u = unify(e, fo)[0]  # output side, not input side
    +u
     
    {a2: 2, a3: 3, s2: (), s1: ()}
     
    -
    g = reify(u, (fi, fo))
    -print doc_from_stack_effect(*g)
    +
    g = reify(u, (fi, fo))
    +print doc_from_stack_effect(*g)
     
    (... [a4 a5 ] 3 2 a1 -- ... [2 3 ])
    @@ -126,7 +126,7 @@
     

    Failing a Check

    -
    fi, fo = infer(dup, mul)[0]
    +
    fi, fo = infer(dup, mul)[0]
     
    25 (--) ∘ dup mul
    @@ -135,17 +135,17 @@
     31 (i1 -- i2) ∘
     
    -
    e = text_to_expression('"two"')
    -print stack_to_string(e)
    +
    e = text_to_expression('"two"')
    +print stack_to_string(e)
     
    'two'
     
    -
    try:
    -    unify(e, fi)
    -except JoyTypeError, err:
    -    print err
    +
    try:
    +    unify(e, fi)
    +except JoyTypeError, err:
    +    print err
     
    Cannot unify 'two' and f1.
    @@ -240,7 +240,7 @@
     
     
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Types.html b/docs/sphinx_docs/_build/html/notebooks/Types.html index 2330787..8a5b149 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Types.html +++ b/docs/sphinx_docs/_build/html/notebooks/Types.html @@ -182,8 +182,8 @@ terms in the forms:

    Compiling pop∘swap∘roll<

    The simplest way to “compile” this function would be something like:

    -
    def poswrd(s, e, d):
    -    return rolldown(*swap(*pop(s, e, d)))
    +
    def poswrd(s, e, d):
    +    return rolldown(*swap(*pop(s, e, d)))
     

    However, internally this function would still be allocating tuples @@ -193,9 +193,9 @@ terms in the forms:

    We should be able to directly write out a Python function like:

    -
    def poswrd(stack):
    -    (_, (a, (b, (c, stack)))) = stack
    -    return (c, (b, (a, stack)))
    +
    def poswrd(stack):
    +    (_, (a, (b, (c, stack)))) = stack
    +    return (c, (b, (a, stack)))
     

    This eliminates the internal work of the first version. Because this @@ -243,14 +243,14 @@ available index number for the right-side stack effect comment):

    Re-label (the tails of the lists on each side each get their own label):

    -
    ([4 .0.] 2 3 0 -- 3 2 [.0.]) ([5 .1.] -- [.1.])
    +
    ([4 .0.] 2 3 0 -- 3 2 [.0.]) ([5 .1.] -- [.1.])
     

    Unify and update (note the opening square brackets have been omited in the substitution dict, this is deliberate and I’ll explain below):

    -
    ([4 .0.]   2 3 0 -- 3 2 [.0.]  ) ([5 .1.] -- [.1.])
    -                                                    w/ { .0.] : 5 .1.] }
    -([4 5 .1.] 2 3 0 -- 3 2 [5 .1.]) ([5 .1.] -- [.1.])
    +
    ([4 .0.]   2 3 0 -- 3 2 [.0.]  ) ([5 .1.] -- [.1.])
    +                                                    w/ { .0.] : 5 .1.] }
    +([4 5 .1.] 2 3 0 -- 3 2 [5 .1.]) ([5 .1.] -- [.1.])
     

    How do we find .0.] in [4 .0.] and replace it with 5 .1.] @@ -258,15 +258,15 @@ getting the result underlying structure of the Joy list is a cons-list in Python it’s actually pretty easy. I’ll explain below.

    Next we unify and find our two terms are the same already: [5 .1.]:

    -
    ([4 5 .1.] 2 3 0 -- 3 2 [5 .1.]) ([5 .1.] -- [.1.])
    +
    ([4 5 .1.] 2 3 0 -- 3 2 [5 .1.]) ([5 .1.] -- [.1.])
     

    Giving us:

    -
    ([4 5 .1.] 2 3 0 -- 3 2) (-- [.1.])
    +
    ([4 5 .1.] 2 3 0 -- 3 2) (-- [.1.])
     

    From here we apply the first rule and get:

    -
    ([4 5 .1.] 2 3 0 -- 3 2 [.1.])
    +
    ([4 5 .1.] 2 3 0 -- 3 2 [.1.])
     

    Cleaning up the labels:

    @@ -281,19 +281,19 @@ actually pretty easy. I’ll explain below.

    Re-label:

    -
    ([4 5 .1.] 2 3 1 -- 3 2 [.1.]) (6 [.2.] -- [6 .2.])
    +
    ([4 5 .1.] 2 3 1 -- 3 2 [.1.]) (6 [.2.] -- [6 .2.])
     

    Unify:

    -
    ([4 5 .1.] 2 3 1 -- 3 2 [.1.]) (6 [.2.] -- [6 .2.])
    -                                                     w/ { .1.] : .2.] }
    -([4 5 .2.] 2 3 1 -- 3 2      ) (6       -- [6 .2.])
    +
    ([4 5 .1.] 2 3 1 -- 3 2 [.1.]) (6 [.2.] -- [6 .2.])
    +                                                     w/ { .1.] : .2.] }
    +([4 5 .2.] 2 3 1 -- 3 2      ) (6       -- [6 .2.])
                                                          w/ {2: 6}
    -([4 5 .2.] 6 3 1 -- 3        ) (        -- [6 .2.])
    +([4 5 .2.] 6 3 1 -- 3        ) (        -- [6 .2.])
     

    First rule:

    -
    ([4 5 .2.] 6 3 1 -- 3 [6 .2.])
    +
    ([4 5 .2.] 6 3 1 -- 3 [6 .2.])
     

    Re-label:

    @@ -309,19 +309,19 @@ actually pretty easy. I’ll explain below.

    Re-label:

    -
    ([4 5 .1.] 2 3 1 -- 3 [2 .1.]) (6 [.2.] -- [6 .2.])
    +
    ([4 5 .1.] 2 3 1 -- 3 [2 .1.]) (6 [.2.] -- [6 .2.])
     

    Unify:

    -
    ([4 5 .1.] 2 3 1 -- 3 [2 .1.]) (6 [.2.] -- [6 .2.]  )
    -                                                       w/ { .2.] : 2 .1.] }
    -([4 5 .1.] 2 3 1 -- 3        ) (6       -- [6 2 .1.])
    +
    ([4 5 .1.] 2 3 1 -- 3 [2 .1.]) (6 [.2.] -- [6 .2.]  )
    +                                                       w/ { .2.] : 2 .1.] }
    +([4 5 .1.] 2 3 1 -- 3        ) (6       -- [6 2 .1.])
                                                            w/ {3: 6}
    -([4 5 .1.] 2 6 1 --          ) (        -- [6 2 .1.])
    +([4 5 .1.] 2 6 1 --          ) (        -- [6 2 .1.])
     

    First or second rule:

    -
    ([4 5 .1.] 2 6 1 -- [6 2 .1.])
    +
    ([4 5 .1.] 2 6 1 -- [6 2 .1.])
     

    Clean up the labels:

    @@ -335,9 +335,9 @@ actually pretty easy. I’ll explain below.

    From this stack effect comment it should be possible to construct the following Python code:

    -
    def F(stack):
    -    (_, (d, (c, ((a, (b, S0)), stack)))) = stack
    -    return (d, (c, S0)), stack
    +
    def F(stack):
    +    (_, (d, (c, ((a, (b, S0)), stack)))) = stack
    +    return (d, (c, S0)), stack
     
    @@ -348,96 +348,96 @@ following Python code:

    Representing Stack Effect Comments in Python

    I’m going to use pairs of tuples of type descriptors, which will be integers or tuples of type descriptors:

    -
    roll_dn = (1, 2, 3), (2, 3, 1)
    +
    roll_dn = (1, 2, 3), (2, 3, 1)
     
    -pop = (1,), ()
    +pop = (1,), ()
     
    -swap = (1, 2), (2, 1)
    +swap = (1, 2), (2, 1)
     

    compose()

    -
    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
     
    -    # First rule.
    -    #
    -    #       (a -- b) (-- d)
    -    #    ---------------------
    -    #         (a -- b d)
    +    # First rule.
    +    #
    +    #       (a -- b) (-- d)
    +    #    ---------------------
    +    #         (a -- b d)
     
    -    if not g_in:
    +    if not g_in:
     
    -        fg_in, fg_out = f_in, f_out + g_out
    +        fg_in, fg_out = f_in, f_out + g_out
     
    -    # Second rule.
    -    #
    -    #       (a --) (c -- d)
    -    #    ---------------------
    -    #         (c a -- d)
    +    # Second rule.
    +    #
    +    #       (a --) (c -- d)
    +    #    ---------------------
    +    #         (c a -- d)
     
    -    elif not f_out:
    +    elif not f_out:
     
    -        fg_in, fg_out = g_in + f_in, g_out
    +        fg_in, fg_out = g_in + f_in, g_out
     
    -    else: # Unify, update, recur.
    +    else: # Unify, update, recur.
     
    -        fo, gi = f_out[-1], g_in[-1]
    +        fo, gi = f_out[-1], g_in[-1]
     
    -        s = unify(gi, fo)
    +        s = unify(gi, fo)
     
    -        if s == False:  # s can also be the empty dict, which is ok.
    -            raise TypeError('Cannot unify %r and %r.' % (fo, gi))
    +        if s == False:  # s can also be the empty dict, which is ok.
    +            raise TypeError('Cannot unify %r and %r.' % (fo, gi))
     
    -        f_g = (f_in, f_out[:-1]), (g_in[:-1], g_out)
    +        f_g = (f_in, f_out[:-1]), (g_in[:-1], g_out)
     
    -        if s: f_g = update(s, f_g)
    +        if s: f_g = update(s, f_g)
     
    -        fg_in, fg_out = compose(*f_g)
    +        fg_in, fg_out = compose(*f_g)
     
    -    return fg_in, fg_out
    +    return fg_in, fg_out
     

    unify()

    -
    def unify(u, v, s=None):
    -    if s is None:
    -        s = {}
    +
    def unify(u, v, s=None):
    +    if s is None:
    +        s = {}
     
    -    if isinstance(u, int):
    -        s[u] = v
    -    elif isinstance(v, int):
    -        s[v] = u
    -    else:
    -        s = False
    +    if isinstance(u, int):
    +        s[u] = v
    +    elif isinstance(v, int):
    +        s[v] = u
    +    else:
    +        s = False
     
    -    return s
    +    return s
     

    update()

    -
    def update(s, term):
    -    if not isinstance(term, tuple):
    -        return s.get(term, term)
    -    return tuple(update(s, inner) for inner in term)
    +
    def update(s, term):
    +    if not isinstance(term, tuple):
    +        return s.get(term, term)
    +    return tuple(update(s, inner) for inner in term)
     

    relabel()

    -
    def relabel(left, right):
    -    return left, _1000(right)
    +
    def relabel(left, right):
    +    return left, _1000(right)
     
    -def _1000(right):
    -    if not isinstance(right, tuple):
    -        return 1000 + right
    -    return tuple(_1000(n) for n in right)
    +def _1000(right):
    +    if not isinstance(right, tuple):
    +        return 1000 + right
    +    return tuple(_1000(n) for n in right)
     
    -relabel(pop, swap)
    +relabel(pop, swap)
     
    (((1,), ()), ((1001, 1002), (1002, 1001)))
    @@ -446,21 +446,21 @@ integers or tuples of type descriptors:

    delabel()

    -
    def delabel(f):
    -    s = {u: i for i, u in enumerate(sorted(_unique(f)))}
    -    return update(s, f)
    +
    def delabel(f):
    +    s = {u: i for i, u in enumerate(sorted(_unique(f)))}
    +    return update(s, f)
     
    -def _unique(f, seen=None):
    -    if seen is None:
    -        seen = set()
    -    if not isinstance(f, tuple):
    -        seen.add(f)
    -    else:
    -        for inner in f:
    -            _unique(inner, seen)
    -    return seen
    +def _unique(f, seen=None):
    +    if seen is None:
    +        seen = set()
    +    if not isinstance(f, tuple):
    +        seen.add(f)
    +    else:
    +        for inner in f:
    +            _unique(inner, seen)
    +    return seen
     
    -delabel(relabel(pop, swap))
    +delabel(relabel(pop, swap))
     
    (((0,), ()), ((1, 2), (2, 1)))
    @@ -472,39 +472,39 @@ integers or tuples of type descriptors:

    At last we put it all together in a function C() that accepts two stack effect comments and returns their composition (or raises and exception if they can’t be composed due to type conflicts.)

    -
    def C(f, g):
    -    f, g = relabel(f, g)
    -    fg = compose(f, g)
    -    return delabel(fg)
    +
    def C(f, g):
    +    f, g = relabel(f, g)
    +    fg = compose(f, g)
    +    return delabel(fg)
     

    Let’s try it out.

    -
    C(pop, swap)
    +
    C(pop, swap)
     
    ((1, 2, 0), (2, 1))
     
    -
    C(C(pop, swap), roll_dn)
    +
    C(C(pop, swap), roll_dn)
     
    ((3, 1, 2, 0), (2, 1, 3))
     
    -
    C(swap, roll_dn)
    +
    C(swap, roll_dn)
     
    ((2, 0, 1), (1, 0, 2))
     
    -
    C(pop, C(swap, roll_dn))
    +
    C(pop, C(swap, roll_dn))
     
    ((3, 1, 2, 0), (2, 1, 3))
     
    -
    poswrd = reduce(C, (pop, swap, roll_dn))
    -poswrd
    +
    poswrd = reduce(C, (pop, swap, roll_dn))
    +poswrd
     
    ((3, 1, 2, 0), (2, 1, 3))
    @@ -516,12 +516,12 @@ exception if they can’t be composed due to type conflicts.)

    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 own numbers. Then everything above already works.

    -
    rest = ((1, 2),), (2,)
    +
    rest = ((1, 2),), (2,)
     
    -cons = (1, 2), ((1, 2),)
    +cons = (1, 2), ((1, 2),)
     
    -
    C(poswrd, rest)
    +
    C(poswrd, rest)
     
    (((3, 4), 1, 2, 0), (2, 1, 4))
    @@ -542,9 +542,9 @@ own numbers. Then everything above already works.

    }
    -
    F = reduce(C, (pop, swap, roll_dn, rest, rest, cons, cons))
    +
    F = reduce(C, (pop, swap, roll_dn, rest, rest, cons, cons))
     
    -F
    +F
     
    (((3, (4, 5)), 1, 2, 0), ((2, (1, 5)),))
    @@ -560,13 +560,13 @@ own numbers. Then everything above already works.

    Dealing with cons and uncons

    However, if we try to compose e.g. cons and uncons it won’t work:

    -
    uncons = ((1, 2),), (1, 2)
    +
    uncons = ((1, 2),), (1, 2)
     
    -
    try:
    -    C(cons, uncons)
    -except Exception, e:
    -    print e
    +
    try:
    +    C(cons, uncons)
    +except Exception, e:
    +    print e
     
    Cannot unify (1, 2) and (1001, 1002).
    @@ -577,36 +577,36 @@ work:

    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 deal with this recursively:

    -
    def unify(u, v, s=None):
    -    if s is None:
    -        s = {}
    -    elif s:
    -        u = update(s, u)
    -        v = update(s, v)
    +
    def unify(u, v, s=None):
    +    if s is None:
    +        s = {}
    +    elif s:
    +        u = update(s, u)
    +        v = update(s, v)
     
    -    if isinstance(u, int):
    -        s[u] = v
    +    if isinstance(u, int):
    +        s[u] = v
     
    -    elif isinstance(v, int):
    -        s[v] = u
    +    elif isinstance(v, int):
    +        s[v] = u
     
    -    elif isinstance(u, tuple) and isinstance(v, tuple):
    +    elif isinstance(u, tuple) and isinstance(v, tuple):
     
    -        if len(u) != 2 or len(v) != 2:
    -            # Not a type error, caller passed in a bad value.
    -            raise ValueError(repr((u, v)))  # FIXME this message sucks.
    +        if len(u) != 2 or len(v) != 2:
    +            # Not a type error, caller passed in a bad value.
    +            raise ValueError(repr((u, v)))  # FIXME this message sucks.
     
    -        (a, b), (c, d) = u, v
    -        s = unify(a, c, s)
    -        if s != False:
    -            s = unify(b, d, s)
    -    else:
    -        s = False
    +        (a, b), (c, d) = u, v
    +        s = unify(a, c, s)
    +        if s != False:
    +            s = unify(b, d, s)
    +    else:
    +        s = False
     
    -    return s
    +    return s
     
    -
    C(cons, uncons)
    +
    C(cons, uncons)
     
    ((0, 1), (0, 1))
    @@ -618,13 +618,13 @@ deal with this recursively:

    Part III: Compiling Yin Functions

    Now consider the Python function we would like to derive:

    -
    def F_python(stack):
    -    (_, (d, (c, ((a, (b, S0)), stack)))) = stack
    -    return (d, (c, S0)), stack
    +
    def F_python(stack):
    +    (_, (d, (c, ((a, (b, S0)), stack)))) = stack
    +    return (d, (c, S0)), stack
     

    And compare it to the input stack effect comment tuple we just computed:

    -
    F[0]
    +
    F[0]
     
    ((3, (4, 5)), 1, 2, 0)
    @@ -646,7 +646,7 @@ stack effect comment tuple, just in the reverse order:

    Eh?

    And the return tuple

    -
    F[1]
    +
    F[1]
     
    ((2, (1, 5)),)
    @@ -666,21 +666,21 @@ effect.)

    Python Identifiers

    We want to substitute Python identifiers for the integers. I’m going to repurpose joy.parser.Symbol class for this:

    -
    from collections import defaultdict
    -from joy.parser import Symbol
    +
    from collections import defaultdict
    +from joy.parser import Symbol
     
     
    -def _names_for():
    -    I = iter(xrange(1000))
    -    return lambda: Symbol('a%i' % next(I))
    +def _names_for():
    +    I = iter(xrange(1000))
    +    return lambda: Symbol('a%i' % next(I))
     
     
    -def identifiers(term, s=None):
    -    if s is None:
    -        s = defaultdict(_names_for())
    -    if isinstance(term, int):
    -        return s[term]
    -    return tuple(identifiers(inner, s) for inner in term)
    +def identifiers(term, s=None):
    +    if s is None:
    +        s = defaultdict(_names_for())
    +    if isinstance(term, int):
    +        return s[term]
    +    return tuple(identifiers(inner, s) for inner in term)
     
    @@ -690,36 +690,36 @@ repurpose joy.parse 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 you should skip it for now and read it later if you’re interested.

    -
    def doc_from_stack_effect(inputs, outputs):
    -    return '(%s--%s)' % (
    -        ' '.join(map(_to_str, inputs + ('',))),
    -        ' '.join(map(_to_str, ('',) + outputs))
    -    )
    +
    def doc_from_stack_effect(inputs, outputs):
    +    return '(%s--%s)' % (
    +        ' '.join(map(_to_str, inputs + ('',))),
    +        ' '.join(map(_to_str, ('',) + outputs))
    +    )
     
     
    -def _to_str(term):
    -    if not isinstance(term, tuple):
    -        try:
    -            t = term.prefix == 's'
    -        except AttributeError:
    -            return str(term)
    -        return '[.%i.]' % term.number if t else str(term)
    +def _to_str(term):
    +    if not isinstance(term, tuple):
    +        try:
    +            t = term.prefix == 's'
    +        except AttributeError:
    +            return str(term)
    +        return '[.%i.]' % term.number if t else str(term)
     
    -    a = []
    -    while term and isinstance(term, tuple):
    -        item, term = term
    -        a.append(_to_str(item))
    +    a = []
    +    while term and isinstance(term, tuple):
    +        item, term = term
    +        a.append(_to_str(item))
     
    -    try:
    -        n = term.number
    -    except AttributeError:
    -        n = term
    -    else:
    -        if term.prefix != 's':
    -            raise ValueError('Stack label: %s' % (term,))
    +    try:
    +        n = term.number
    +    except AttributeError:
    +        n = term
    +    else:
    +        if term.prefix != 's':
    +            raise ValueError('Stack label: %s' % (term,))
     
    -    a.append('.%s.' % (n,))
    -    return '[%s]' % ' '.join(a)
    +    a.append('.%s.' % (n,))
    +    return '[%s]' % ' '.join(a)
     
    @@ -728,25 +728,25 @@ you should skip it for now and read it later if you’re interested.

    Now we can write a compiler function to emit Python source code. (The underscore suffix distiguishes it from the built-in compile() function.)

    -
    def compile_(name, f, doc=None):
    -    if doc is None:
    -        doc = doc_from_stack_effect(*f)
    -    inputs, outputs = identifiers(f)
    -    i = o = Symbol('stack')
    -    for term in inputs:
    -        i = term, i
    -    for term in outputs:
    -        o = term, o
    -    return '''def %s(stack):
    -    """%s"""
    -    %s = stack
    -    return %s''' % (name, doc, i, o)
    +
    def compile_(name, f, doc=None):
    +    if doc is None:
    +        doc = doc_from_stack_effect(*f)
    +    inputs, outputs = identifiers(f)
    +    i = o = Symbol('stack')
    +    for term in inputs:
    +        i = term, i
    +    for term in outputs:
    +        o = term, o
    +    return '''def %s(stack):
    +    """%s"""
    +    %s = stack
    +    return %s''' % (name, doc, i, o)
     

    Here it is in action:

    -
    source = compile_('F', F)
    +
    source = compile_('F', F)
     
    -print source
    +print source
     
    def F(stack):
    @@ -756,31 +756,31 @@ function.)

    Compare:

    -
    def F_python(stack):
    -    (_, (d, (c, ((a, (b, S0)), stack)))) = stack
    -    return ((d, (c, S0)), stack)
    +
    def F_python(stack):
    +    (_, (d, (c, ((a, (b, S0)), stack)))) = stack
    +    return ((d, (c, S0)), stack)
     

    Next steps:

    -
    L = {}
    +
    L = {}
     
    -eval(compile(source, '__main__', 'single'), {}, L)
    +eval(compile(source, '__main__', 'single'), {}, L)
     
    -L['F']
    +L['F']
     
    <function F>
     

    Let’s try it out:

    -
    from notebook_preamble import D, J, V
    -from joy.library import SimpleFunctionWrapper
    +
    from notebook_preamble import D, J, V
    +from joy.library import SimpleFunctionWrapper
     
    -
    D['F'] = SimpleFunctionWrapper(L['F'])
    +
    D['F'] = SimpleFunctionWrapper(L['F'])
     
    -
    J('[4 5 ...] 2 3 1 F')
    +
    J('[4 5 ...] 2 3 1 F')
     
    [3 2 ...]
    @@ -800,33 +800,33 @@ this might be less helpful.

    Compiling Library Functions

    We can use compile_() to generate many primitives in the library from their stack effect comments:

    -
    def defs():
    +
    def defs():
     
    -    rolldown = (1, 2, 3), (2, 3, 1)
    +    rolldown = (1, 2, 3), (2, 3, 1)
     
    -    rollup = (1, 2, 3), (3, 1, 2)
    +    rollup = (1, 2, 3), (3, 1, 2)
     
    -    pop = (1,), ()
    +    pop = (1,), ()
     
    -    swap = (1, 2), (2, 1)
    +    swap = (1, 2), (2, 1)
     
    -    rest = ((1, 2),), (2,)
    +    rest = ((1, 2),), (2,)
     
    -    rrest = C(rest, rest)
    +    rrest = C(rest, rest)
     
    -    cons = (1, 2), ((1, 2),)
    +    cons = (1, 2), ((1, 2),)
     
    -    uncons = ((1, 2),), (1, 2)
    +    uncons = ((1, 2),), (1, 2)
     
    -    swons = C(swap, cons)
    +    swons = C(swap, cons)
     
    -    return locals()
    +    return locals()
     
    -
    for name, stack_effect_comment in sorted(defs().items()):
    -    print
    -    print compile_(name, stack_effect_comment)
    -    print
    +
    for name, stack_effect_comment in sorted(defs().items()):
    +    print
    +    print compile_(name, stack_effect_comment)
    +    print
     
    def cons(stack):
    @@ -966,57 +966,57 @@ and t
     Python class hierarchy of Joy types and use the issubclass() method
     to establish domain ordering, as well as other handy behaviour that will
     make it fairly easy to reuse most of the code above.

    -
    class AnyJoyType(object):
    +
    class AnyJoyType(object):
     
    -    prefix = 'a'
    +    prefix = 'a'
     
    -    def __init__(self, number):
    -        self.number = number
    +    def __init__(self, number):
    +        self.number = number
     
    -    def __repr__(self):
    -        return self.prefix + str(self.number)
    +    def __repr__(self):
    +        return self.prefix + str(self.number)
     
    -    def __eq__(self, other):
    -        return (
    -            isinstance(other, self.__class__)
    -            and other.prefix == self.prefix
    -            and other.number == self.number
    -        )
    +    def __eq__(self, other):
    +        return (
    +            isinstance(other, self.__class__)
    +            and other.prefix == self.prefix
    +            and other.number == self.number
    +        )
     
    -    def __ge__(self, other):
    -        return issubclass(other.__class__, self.__class__)
    +    def __ge__(self, other):
    +        return issubclass(other.__class__, self.__class__)
     
    -    def __add__(self, other):
    -        return self.__class__(self.number + other)
    -    __radd__ = __add__
    +    def __add__(self, other):
    +        return self.__class__(self.number + other)
    +    __radd__ = __add__
     
    -    def __hash__(self):
    -        return hash(repr(self))
    +    def __hash__(self):
    +        return hash(repr(self))
     
     
    -class NumberJoyType(AnyJoyType): prefix = 'n'
    -class FloatJoyType(NumberJoyType): prefix = 'f'
    -class IntJoyType(FloatJoyType): prefix = 'i'
    +class NumberJoyType(AnyJoyType): prefix = 'n'
    +class FloatJoyType(NumberJoyType): prefix = 'f'
    +class IntJoyType(FloatJoyType): prefix = 'i'
     
     
    -class StackJoyType(AnyJoyType):
    -    prefix = 's'
    +class StackJoyType(AnyJoyType):
    +    prefix = 's'
     
     
    -_R = range(10)
    -A = map(AnyJoyType, _R)
    -N = map(NumberJoyType, _R)
    -S = map(StackJoyType, _R)
    +_R = range(10)
    +A = map(AnyJoyType, _R)
    +N = map(NumberJoyType, _R)
    +S = map(StackJoyType, _R)
     

    Mess with it a little:

    -
    from itertools import permutations
    +
    from itertools import permutations
     

    “Any” types can be specialized to numbers and stacks, but not vice versa:

    -
    for a, b in permutations((A[0], N[0], S[0]), 2):
    -    print a, '>=', b, '->', a >= b
    +
    for a, b in permutations((A[0], N[0], S[0]), 2):
    +    print a, '>=', b, '->', a >= b
     
    a0 >= n0 -> True
    @@ -1030,8 +1030,8 @@ versa:

    Our crude Numerical Tower of numbers > floats > integers works as well (but we’re not going to use it yet):

    -
    for a, b in permutations((A[0], N[0], FloatJoyType(0), IntJoyType(0)), 2):
    -    print a, '>=', b, '->', a >= b
    +
    for a, b in permutations((A[0], N[0], FloatJoyType(0), IntJoyType(0)), 2):
    +    print a, '>=', b, '->', a >= b
     
    a0 >= n0 -> True
    @@ -1051,18 +1051,18 @@ Tower of numbers >
     

    Typing sqr

    -
    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],)
     
    -
    dup
    +
    dup
     
    ((a1,), (a1, a1))
     
    -
    mul
    +
    mul
     
    ((n1, n2), (n3,))
    @@ -1072,9 +1072,9 @@ Tower of numbers >
     

    Modifying the Inferencer

    Re-labeling still works fine:

    -
    foo = relabel(dup, mul)
    +
    foo = relabel(dup, mul)
     
    -foo
    +foo
     
    (((a1,), (a1, a1)), ((n1001, n1002), (n1003,)))
    @@ -1084,28 +1084,28 @@ Tower of numbers >
     

    delabel() version 2

    The delabel() function needs an overhaul. It now has to keep track of how many labels of each domain it has “seen”.

    -
    from collections import Counter
    +
    from collections import Counter
     
     
    -def delabel(f, seen=None, c=None):
    -    if seen is None:
    -        assert c is None
    -        seen, c = {}, Counter()
    +def delabel(f, seen=None, c=None):
    +    if seen is None:
    +        assert c is None
    +        seen, c = {}, Counter()
     
    -    try:
    -        return seen[f]
    -    except KeyError:
    -        pass
    +    try:
    +        return seen[f]
    +    except KeyError:
    +        pass
     
    -    if not isinstance(f, tuple):
    -        seen[f] = f.__class__(c[f.prefix] + 1)
    -        c[f.prefix] += 1
    -        return seen[f]
    +    if not isinstance(f, tuple):
    +        seen[f] = f.__class__(c[f.prefix] + 1)
    +        c[f.prefix] += 1
    +        return seen[f]
     
    -    return tuple(delabel(inner, seen, c) for inner in f)
    +    return tuple(delabel(inner, seen, c) for inner in f)
     
    -
    delabel(foo)
    +
    delabel(foo)
     
    (((a1,), (a1, a1)), ((n1, n2), (n3,)))
    @@ -1114,120 +1114,120 @@ of how many labels of each domain it has “seen”.

    unify() version 3

    -
    def unify(u, v, s=None):
    -    if s is None:
    -        s = {}
    -    elif s:
    -        u = update(s, u)
    -        v = update(s, v)
    +
    def unify(u, v, s=None):
    +    if s is None:
    +        s = {}
    +    elif s:
    +        u = update(s, u)
    +        v = update(s, v)
     
    -    if u == v:
    -        return s
    +    if u == v:
    +        return s
     
    -    if isinstance(u, AnyJoyType) and isinstance(v, AnyJoyType):
    -        if u >= v:
    -            s[u] = v
    -            return s
    -        if v >= u:
    -            s[v] = u
    -            return s
    -        raise TypeError('Cannot unify %r and %r.' % (u, v))
    +    if isinstance(u, AnyJoyType) and isinstance(v, AnyJoyType):
    +        if u >= v:
    +            s[u] = v
    +            return s
    +        if v >= u:
    +            s[v] = u
    +            return s
    +        raise TypeError('Cannot unify %r and %r.' % (u, v))
     
    -    if isinstance(u, tuple) and isinstance(v, tuple):
    -        if len(u) != len(v) != 2:
    -            raise TypeError(repr((u, v)))
    -        for uu, vv in zip(u, v):
    -            s = unify(uu, vv, s)
    -            if s == False: # (instead of a substitution dict.)
    -                break
    -        return s
    +    if isinstance(u, tuple) and isinstance(v, tuple):
    +        if len(u) != len(v) != 2:
    +            raise TypeError(repr((u, v)))
    +        for uu, vv in zip(u, v):
    +            s = unify(uu, vv, s)
    +            if s == False: # (instead of a substitution dict.)
    +                break
    +        return s
     
    -    if isinstance(v, tuple):
    -        if not stacky(u):
    -            raise TypeError('Cannot unify %r and %r.' % (u, v))
    -        s[u] = v
    -        return s
    +    if isinstance(v, tuple):
    +        if not stacky(u):
    +            raise TypeError('Cannot unify %r and %r.' % (u, v))
    +        s[u] = v
    +        return s
     
    -    if isinstance(u, tuple):
    -        if not stacky(v):
    -            raise TypeError('Cannot unify %r and %r.' % (v, u))
    -        s[v] = u
    -        return s
    +    if isinstance(u, tuple):
    +        if not stacky(v):
    +            raise TypeError('Cannot unify %r and %r.' % (v, u))
    +        s[v] = u
    +        return s
     
    -    return False
    +    return False
     
     
    -def stacky(thing):
    -    return thing.__class__ in {AnyJoyType, StackJoyType}
    +def stacky(thing):
    +    return thing.__class__ in {AnyJoyType, StackJoyType}
     

    Rewrite the stack effect comments:

    -
    def defs():
    +
    def defs():
     
    -    rolldown = (A[1], A[2], A[3]), (A[2], A[3], A[1])
    +    rolldown = (A[1], A[2], A[3]), (A[2], A[3], A[1])
     
    -    rollup = (A[1], A[2], A[3]), (A[3], A[1], A[2])
    +    rollup = (A[1], A[2], A[3]), (A[3], A[1], A[2])
     
    -    pop = (A[1],), ()
    +    pop = (A[1],), ()
     
    -    popop = (A[2], A[1],), ()
    +    popop = (A[2], A[1],), ()
     
    -    popd = (A[2], A[1],), (A[1],)
    +    popd = (A[2], A[1],), (A[1],)
     
    -    popdd = (A[3], A[2], A[1],), (A[2], A[1],)
    +    popdd = (A[3], A[2], A[1],), (A[2], A[1],)
     
    -    swap = (A[1], A[2]), (A[2], A[1])
    +    swap = (A[1], A[2]), (A[2], A[1])
     
    -    rest = ((A[1], S[1]),), (S[1],)
    +    rest = ((A[1], S[1]),), (S[1],)
     
    -    rrest = C(rest, rest)
    +    rrest = C(rest, rest)
     
    -    cons = (A[1], S[1]), ((A[1], S[1]),)
    +    cons = (A[1], S[1]), ((A[1], S[1]),)
     
    -    ccons = C(cons, cons)
    +    ccons = C(cons, cons)
     
    -    uncons = ((A[1], S[1]),), (A[1], S[1])
    +    uncons = ((A[1], S[1]),), (A[1], S[1])
     
    -    swons = C(swap, cons)
    +    swons = C(swap, cons)
     
    -    dup = (A[1],), (A[1], A[1])
    +    dup = (A[1],), (A[1], A[1])
     
    -    dupd = (A[2], A[1]), (A[2], A[2], A[1])
    +    dupd = (A[2], A[1]), (A[2], A[2], A[1])
     
    -    mul = (N[1], N[2]), (N[3],)
    +    mul = (N[1], N[2]), (N[3],)
     
    -    sqrt = C(dup, mul)
    +    sqrt = C(dup, mul)
     
    -    first = ((A[1], S[1]),), (A[1],)
    +    first = ((A[1], S[1]),), (A[1],)
     
    -    second = C(rest, first)
    +    second = C(rest, first)
     
    -    third = C(rest, second)
    +    third = C(rest, second)
     
    -    tuck = (A[2], A[1]), (A[1], A[2], A[1])
    +    tuck = (A[2], A[1]), (A[1], A[2], A[1])
     
    -    over = (A[2], A[1]), (A[2], A[1], A[2])
    +    over = (A[2], A[1]), (A[2], A[1], A[2])
     
    -    succ = pred = (N[1],), (N[2],)
    +    succ = pred = (N[1],), (N[2],)
     
    -    divmod_ = pm = (N[2], N[1]), (N[4], N[3])
    +    divmod_ = pm = (N[2], N[1]), (N[4], N[3])
     
    -    return locals()
    +    return locals()
     
    -
    DEFS = defs()
    +
    DEFS = defs()
     
    -
    for name, stack_effect_comment in sorted(DEFS.items()):
    -    print name, '=', doc_from_stack_effect(*stack_effect_comment)
    +
    for name, stack_effect_comment in sorted(DEFS.items()):
    +    print name, '=', doc_from_stack_effect(*stack_effect_comment)
     
    -
    ccons = (a1 a2 [.1.] -- [a1 a2 .1.])
    -cons = (a1 [.1.] -- [a1 .1.])
    +
    ccons = (a1 a2 [.1.] -- [a1 a2 .1.])
    +cons = (a1 [.1.] -- [a1 .1.])
     divmod_ = (n2 n1 -- n4 n3)
     dup = (a1 -- a1 a1)
     dupd = (a2 a1 -- a2 a2 a1)
    -first = ([a1 .1.] -- a1)
    +first = ([a1 .1.] -- a1)
     mul = (n1 n2 -- n3)
     over = (a2 a1 -- a2 a1 a2)
     pm = (n2 n1 -- n4 n3)
    @@ -1236,68 +1236,68 @@ of how many labels of each domain it has “seen”.

    popdd = (a3 a2 a1 -- a2 a1) popop = (a2 a1 --) pred = (n1 -- n2) -rest = ([a1 .1.] -- [.1.]) +rest = ([a1 .1.] -- [.1.]) rolldown = (a1 a2 a3 -- a2 a3 a1) rollup = (a1 a2 a3 -- a3 a1 a2) -rrest = ([a1 a2 .1.] -- [.1.]) -second = ([a1 a2 .1.] -- a2) +rrest = ([a1 a2 .1.] -- [.1.]) +second = ([a1 a2 .1.] -- a2) sqrt = (n1 -- n2) succ = (n1 -- n2) swap = (a1 a2 -- a2 a1) -swons = ([.1.] a1 -- [a1 .1.]) -third = ([a1 a2 a3 .1.] -- a3) +swons = ([.1.] a1 -- [a1 .1.]) +third = ([a1 a2 a3 .1.] -- a3) tuck = (a2 a1 -- a1 a2 a1) -uncons = ([a1 .1.] -- a1 [.1.]) +uncons = ([a1 .1.] -- a1 [.1.])
    -
    globals().update(DEFS)
    +
    globals().update(DEFS)
     

    Compose dup and mul

    -
    C(dup, mul)
    +
    C(dup, mul)
     
    ((n1,), (n2,))
     

    Revisit the F function, works fine.

    -
    F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))
    -F
    +
    F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))
    +F
     
    (((a1, (a2, s1)), a3, a4, a5), ((a4, (a3, s1)),))
     
    -
    print doc_from_stack_effect(*F)
    +
    print doc_from_stack_effect(*F)
     
    -
    ([a1 a2 .1.] a3 a4 a5 -- [a4 a3 .1.])
    +
    ([a1 a2 .1.] a3 a4 a5 -- [a4 a3 .1.])
     

    Some otherwise inefficient functions are no longer to be feared. We can also get the effect of combinators in some limited cases.

    -
    def neato(*funcs):
    -    print doc_from_stack_effect(*reduce(C, funcs))
    +
    def neato(*funcs):
    +    print doc_from_stack_effect(*reduce(C, funcs))
     
    -
    # e.g. [swap] dip
    -neato(rollup, swap, rolldown)
    +
    # e.g. [swap] dip
    +neato(rollup, swap, rolldown)
     
    (a1 a2 a3 -- a2 a1 a3)
     
    -
    # e.g. [popop] dipd
    -neato(popdd, rolldown, pop)
    +
    # e.g. [popop] dipd
    +neato(popdd, rolldown, pop)
     
    (a1 a2 a3 a4 -- a3 a4)
     
    -
    # Reverse the order of the top three items.
    -neato(rollup, swap)
    +
    # Reverse the order of the top three items.
    +neato(rollup, swap)
     
    (a1 a2 a3 -- a3 a2 a1)
    @@ -1308,22 +1308,22 @@ also get the effect of combinators in some limited cases.

    compile_() version 2

    Because the type labels represent themselves as valid Python identifiers the compile_() function doesn’t need to generate them anymore:

    -
    def compile_(name, f, doc=None):
    -    inputs, outputs = f
    -    if doc is None:
    -        doc = doc_from_stack_effect(inputs, outputs)
    -    i = o = Symbol('stack')
    -    for term in inputs:
    -        i = term, i
    -    for term in outputs:
    -        o = term, o
    -    return '''def %s(stack):
    -    """%s"""
    -    %s = stack
    -    return %s''' % (name, doc, i, o)
    +
    def compile_(name, f, doc=None):
    +    inputs, outputs = f
    +    if doc is None:
    +        doc = doc_from_stack_effect(inputs, outputs)
    +    i = o = Symbol('stack')
    +    for term in inputs:
    +        i = term, i
    +    for term in outputs:
    +        o = term, o
    +    return '''def %s(stack):
    +    """%s"""
    +    %s = stack
    +    return %s''' % (name, doc, i, o)
     
    -
    print compile_('F', F)
    +
    print compile_('F', F)
     
    def F(stack):
    @@ -1334,7 +1334,7 @@ the compile_()
     

    But it cannot magically create new functions that involve e.g. math and such. Note that this is not a sqr function implementation:

    -
    print compile_('sqr', C(dup, mul))
    +
    print compile_('sqr', C(dup, mul))
     
    def sqr(stack):
    @@ -1356,38 +1356,38 @@ functions (at least) are already wrappers it should be straightforward.)

    The functions that can be compiled are the ones that have only AnyJoyType and StackJoyType labels in their stack effect comments. We can write a function to check that:

    -
    from itertools import imap
    +
    from itertools import imap
     
     
    -def compilable(f):
    -    return isinstance(f, tuple) and all(imap(compilable, f)) or stacky(f)
    +def compilable(f):
    +    return isinstance(f, tuple) and all(imap(compilable, f)) or stacky(f)
     
    -
    for name, stack_effect_comment in sorted(defs().items()):
    -    if compilable(stack_effect_comment):
    -        print name, '=', doc_from_stack_effect(*stack_effect_comment)
    +
    for name, stack_effect_comment in sorted(defs().items()):
    +    if compilable(stack_effect_comment):
    +        print name, '=', doc_from_stack_effect(*stack_effect_comment)
     
    -
    ccons = (a1 a2 [.1.] -- [a1 a2 .1.])
    -cons = (a1 [.1.] -- [a1 .1.])
    +
    ccons = (a1 a2 [.1.] -- [a1 a2 .1.])
    +cons = (a1 [.1.] -- [a1 .1.])
     dup = (a1 -- a1 a1)
     dupd = (a2 a1 -- a2 a2 a1)
    -first = ([a1 .1.] -- a1)
    +first = ([a1 .1.] -- a1)
     over = (a2 a1 -- a2 a1 a2)
     pop = (a1 --)
     popd = (a2 a1 -- a1)
     popdd = (a3 a2 a1 -- a2 a1)
     popop = (a2 a1 --)
    -rest = ([a1 .1.] -- [.1.])
    +rest = ([a1 .1.] -- [.1.])
     rolldown = (a1 a2 a3 -- a2 a3 a1)
     rollup = (a1 a2 a3 -- a3 a1 a2)
    -rrest = ([a1 a2 .1.] -- [.1.])
    -second = ([a1 a2 .1.] -- a2)
    +rrest = ([a1 a2 .1.] -- [.1.])
    +second = ([a1 a2 .1.] -- a2)
     swap = (a1 a2 -- a2 a1)
    -swons = ([.1.] a1 -- [a1 .1.])
    -third = ([a1 a2 a3 .1.] -- a3)
    +swons = ([.1.] a1 -- [a1 .1.])
    +third = ([a1 a2 a3 .1.] -- a3)
     tuck = (a2 a1 -- a1 a2 a1)
    -uncons = ([a1 .1.] -- a1 [.1.])
    +uncons = ([a1 .1.] -- a1 [.1.])
     
    @@ -1465,36 +1465,36 @@ first two rules’ the “truthiness” of StackJoyType to false to let e.g. joy.utils.stack.concat work with our stack effect comment cons-list tuples.)

    -
    def compose(f, g):
    -    (f_in, f_out), (g_in, g_out) = f, g
    -    s = unify(g_in, f_out)
    -    if s == False:  # s can also be the empty dict, which is ok.
    -        raise TypeError('Cannot unify %r and %r.' % (f_out, g_in))
    -    return update(s, (f_in, g_out))
    +
    def compose(f, g):
    +    (f_in, f_out), (g_in, g_out) = f, g
    +    s = unify(g_in, f_out)
    +    if s == False:  # s can also be the empty dict, which is ok.
    +        raise TypeError('Cannot unify %r and %r.' % (f_out, g_in))
    +    return update(s, (f_in, g_out))
     

    I don’t want to rewrite all the defs myself, so I’ll write a little conversion function instead. This is programmer’s laziness.

    -
    def sequence_to_stack(seq, stack=StackJoyType(23)):
    -    for item in seq: stack = item, stack
    -    return stack
    +
    def sequence_to_stack(seq, stack=StackJoyType(23)):
    +    for item in seq: stack = item, stack
    +    return stack
     
    -NEW_DEFS = {
    -    name: (sequence_to_stack(i), sequence_to_stack(o))
    -    for name, (i, o) in DEFS.iteritems()
    -}
    -NEW_DEFS['stack'] = S[0], (S[0], S[0])
    -NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1])
    -globals().update(NEW_DEFS)
    +NEW_DEFS = {
    +    name: (sequence_to_stack(i), sequence_to_stack(o))
    +    for name, (i, o) in DEFS.iteritems()
    +}
    +NEW_DEFS['stack'] = S[0], (S[0], S[0])
    +NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1])
    +globals().update(NEW_DEFS)
     
    -
    C(stack, uncons)
    +
    C(stack, uncons)
     
    ((a1, s1), (s1, (a1, (a1, s1))))
     
    -
    reduce(C, (stack, uncons, uncons))
    +
    reduce(C, (stack, uncons, uncons))
     
    ((a1, (a2, s1)), (s1, (a2, (a1, (a1, (a2, s1))))))
    @@ -1506,63 +1506,63 @@ conversion function instead. This is programmer’s laziness.

    doc_from_stack_effect() version 2

    Clunky junk, but it will suffice for now.

    -
    def doc_from_stack_effect(inputs, outputs):
    -    switch = [False]  # Do we need to display the '...' for the rest of the main stack?
    -    i, o = _f(inputs, switch), _f(outputs, switch)
    -    if switch[0]:
    -        i.append('...')
    -        o.append('...')
    -    return '(%s--%s)' % (
    -        ' '.join(reversed([''] + i)),
    -        ' '.join(reversed(o + [''])),
    -    )
    +
    def doc_from_stack_effect(inputs, outputs):
    +    switch = [False]  # Do we need to display the '...' for the rest of the main stack?
    +    i, o = _f(inputs, switch), _f(outputs, switch)
    +    if switch[0]:
    +        i.append('...')
    +        o.append('...')
    +    return '(%s--%s)' % (
    +        ' '.join(reversed([''] + i)),
    +        ' '.join(reversed(o + [''])),
    +    )
     
     
    -def _f(term, switch):
    -    a = []
    -    while term and isinstance(term, tuple):
    -        item, term = term
    -        a.append(item)
    -    assert isinstance(term, StackJoyType), repr(term)
    -    a = [_to_str(i, term, switch) for i in a]
    -    return a
    +def _f(term, switch):
    +    a = []
    +    while term and isinstance(term, tuple):
    +        item, term = term
    +        a.append(item)
    +    assert isinstance(term, StackJoyType), repr(term)
    +    a = [_to_str(i, term, switch) for i in a]
    +    return a
     
     
    -def _to_str(term, stack, switch):
    -    if not isinstance(term, tuple):
    -        if term == stack:
    -            switch[0] = True
    -            return '[...]'
    -        return (
    -            '[.%i.]' % term.number
    -            if isinstance(term, StackJoyType)
    -            else str(term)
    -        )
    +def _to_str(term, stack, switch):
    +    if not isinstance(term, tuple):
    +        if term == stack:
    +            switch[0] = True
    +            return '[...]'
    +        return (
    +            '[.%i.]' % term.number
    +            if isinstance(term, StackJoyType)
    +            else str(term)
    +        )
     
    -    a = []
    -    while term and isinstance(term, tuple):
    -        item, term = term
    -        a.append(_to_str(item, stack, switch))
    -    assert isinstance(term, StackJoyType), repr(term)
    -    if term == stack:
    -        switch[0] = True
    -        end = '...'
    -    else:
    -        end = '.%i.' % term.number
    -    a.append(end)
    -    return '[%s]' % ' '.join(a)
    +    a = []
    +    while term and isinstance(term, tuple):
    +        item, term = term
    +        a.append(_to_str(item, stack, switch))
    +    assert isinstance(term, StackJoyType), repr(term)
    +    if term == stack:
    +        switch[0] = True
    +        end = '...'
    +    else:
    +        end = '.%i.' % term.number
    +    a.append(end)
    +    return '[%s]' % ' '.join(a)
     
    -
    for name, stack_effect_comment in sorted(NEW_DEFS.items()):
    -    print name, '=', doc_from_stack_effect(*stack_effect_comment)
    +
    for name, stack_effect_comment in sorted(NEW_DEFS.items()):
    +    print name, '=', doc_from_stack_effect(*stack_effect_comment)
     
    -
    ccons = (a1 a2 [.1.] -- [a1 a2 .1.])
    -cons = (a1 [.1.] -- [a1 .1.])
    +
    ccons = (a1 a2 [.1.] -- [a1 a2 .1.])
    +cons = (a1 [.1.] -- [a1 .1.])
     divmod_ = (n2 n1 -- n4 n3)
     dup = (a1 -- a1 a1)
     dupd = (a2 a1 -- a2 a2 a1)
    -first = ([a1 .1.] -- a1)
    +first = ([a1 .1.] -- a1)
     mul = (n1 n2 -- n3)
     over = (a2 a1 -- a2 a1 a2)
     pm = (n2 n1 -- n4 n3)
    @@ -1571,26 +1571,26 @@ conversion function instead. This is programmer’s laziness.

    popdd = (a3 a2 a1 -- a2 a1) popop = (a2 a1 --) pred = (n1 -- n2) -rest = ([a1 .1.] -- [.1.]) +rest = ([a1 .1.] -- [.1.]) rolldown = (a1 a2 a3 -- a2 a3 a1) rollup = (a1 a2 a3 -- a3 a1 a2) -rrest = ([a1 a2 .1.] -- [.1.]) -second = ([a1 a2 .1.] -- a2) +rrest = ([a1 a2 .1.] -- [.1.]) +second = ([a1 a2 .1.] -- a2) sqrt = (n1 -- n2) stack = (... -- ... [...]) succ = (n1 -- n2) -swaack = ([.1.] -- [.0.]) +swaack = ([.1.] -- [.0.]) swap = (a1 a2 -- a2 a1) -swons = ([.1.] a1 -- [a1 .1.]) -third = ([a1 a2 a3 .1.] -- a3) +swons = ([.1.] a1 -- [a1 .1.]) +third = ([a1 a2 a3 .1.] -- a3) tuck = (a2 a1 -- a1 a2 a1) -uncons = ([a1 .1.] -- a1 [.1.]) +uncons = ([a1 .1.] -- a1 [.1.])
    -
    print ; print doc_from_stack_effect(*stack)
    -print ; print doc_from_stack_effect(*C(stack, uncons))
    -print ; print doc_from_stack_effect(*reduce(C, (stack, uncons, uncons)))
    -print ; print doc_from_stack_effect(*reduce(C, (stack, uncons, cons)))
    +
    print ; print doc_from_stack_effect(*stack)
    +print ; print doc_from_stack_effect(*C(stack, uncons))
    +print ; print doc_from_stack_effect(*reduce(C, (stack, uncons, uncons)))
    +print ; print doc_from_stack_effect(*reduce(C, (stack, uncons, cons)))
     
    (... -- ... [...])
    @@ -1602,15 +1602,15 @@ conversion function instead. This is programmer’s laziness.

    (... a1 -- ... a1 [a1 ...])
    -
    print doc_from_stack_effect(*C(ccons, stack))
    +
    print doc_from_stack_effect(*C(ccons, stack))
     
    -
    (... a2 a1 [.1.] -- ... [a2 a1 .1.] [[a2 a1 .1.] ...])
    +
    (... a2 a1 [.1.] -- ... [a2 a1 .1.] [[a2 a1 .1.] ...])
     
    -
    Q = C(ccons, stack)
    +
    Q = C(ccons, stack)
     
    -Q
    +Q
     
    ((s1, (a1, (a2, s2))), (((a2, (a1, s1)), s2), ((a2, (a1, s1)), s2)))
    @@ -1620,17 +1620,17 @@ conversion function instead. This is programmer’s laziness.

    compile_() version 3

    This makes the compile_() function pretty simple as the stack effect comments are now already in the form needed for the Python code:

    -
    def compile_(name, f, doc=None):
    -    i, o = f
    -    if doc is None:
    -        doc = doc_from_stack_effect(i, o)
    -    return '''def %s(stack):
    -    """%s"""
    -    %s = stack
    -    return %s''' % (name, doc, i, o)
    +
    def compile_(name, f, doc=None):
    +    i, o = f
    +    if doc is None:
    +        doc = doc_from_stack_effect(i, o)
    +    return '''def %s(stack):
    +    """%s"""
    +    %s = stack
    +    return %s''' % (name, doc, i, o)
     
    -
    print compile_('Q', Q)
    +
    print compile_('Q', Q)
     
    def Q(stack):
    @@ -1639,35 +1639,35 @@ comments are now already in the form needed for the Python code:

    return (((a2, (a1, s1)), s2), ((a2, (a1, s1)), s2))
    -
    unstack = (S[1], S[0]), S[1]
    -enstacken = S[0], (S[0], S[1])
    +
    unstack = (S[1], S[0]), S[1]
    +enstacken = S[0], (S[0], S[1])
     
    -
    print doc_from_stack_effect(*unstack)
    +
    print doc_from_stack_effect(*unstack)
     
    -
    ([.1.] --)
    +
    ([.1.] --)
     
    -
    print doc_from_stack_effect(*enstacken)
    +
    print doc_from_stack_effect(*enstacken)
     
    -
    (-- [.0.])
    +
    (-- [.0.])
     
    -
    print doc_from_stack_effect(*C(cons, unstack))
    +
    print doc_from_stack_effect(*C(cons, unstack))
     
    -
    (a1 [.1.] -- a1)
    +
    (a1 [.1.] -- a1)
     
    -
    print doc_from_stack_effect(*C(cons, enstacken))
    +
    print doc_from_stack_effect(*C(cons, enstacken))
     
    -
    (a1 [.1.] -- [[a1 .1.] .2.])
    +
    (a1 [.1.] -- [[a1 .1.] .2.])
     
    -
    C(cons, unstack)
    +
    C(cons, unstack)
     
    ((s1, (a1, s2)), (a1, s1))
    @@ -1679,23 +1679,23 @@ comments are now already in the form needed for the Python code:

    Part VI: Multiple Stack Effects

    -
    class IntJoyType(NumberJoyType): prefix = 'i'
    +
    class IntJoyType(NumberJoyType): prefix = 'i'
     
     
    -F = map(FloatJoyType, _R)
    -I = map(IntJoyType, _R)
    +F = map(FloatJoyType, _R)
    +I = map(IntJoyType, _R)
     
    -
    muls = [
    -     ((I[2], (I[1], S[0])), (I[3], S[0])),
    -     ((F[2], (I[1], S[0])), (F[3], S[0])),
    -     ((I[2], (F[1], S[0])), (F[3], S[0])),
    -     ((F[2], (F[1], S[0])), (F[3], S[0])),
    -]
    +
    muls = [
    +     ((I[2], (I[1], S[0])), (I[3], S[0])),
    +     ((F[2], (I[1], S[0])), (F[3], S[0])),
    +     ((I[2], (F[1], S[0])), (F[3], S[0])),
    +     ((F[2], (F[1], S[0])), (F[3], S[0])),
    +]
     
    -
    for f in muls:
    -    print doc_from_stack_effect(*f)
    +
    for f in muls:
    +    print doc_from_stack_effect(*f)
     
    (i1 i2 -- i3)
    @@ -1704,42 +1704,42 @@ comments are now already in the form needed for the Python code:

    (f1 f2 -- f3)
    -
    for f in muls:
    -    try:
    -        e = C(dup, f)
    -    except TypeError:
    -        continue
    -    print doc_from_stack_effect(*dup), doc_from_stack_effect(*f), doc_from_stack_effect(*e)
    +
    for f in muls:
    +    try:
    +        e = C(dup, f)
    +    except TypeError:
    +        continue
    +    print doc_from_stack_effect(*dup), doc_from_stack_effect(*f), doc_from_stack_effect(*e)
     
    (a1 -- a1 a1) (i1 i2 -- i3) (i1 -- i2)
     (a1 -- a1 a1) (f1 f2 -- f3) (f1 -- f2)
     
    -
    from itertools import product
    +
    from itertools import product
     
     
    -def meta_compose(F, G):
    -    for f, g in product(F, G):
    -        try:
    -            yield C(f, g)
    -        except TypeError:
    -            pass
    +def meta_compose(F, G):
    +    for f, g in product(F, G):
    +        try:
    +            yield C(f, g)
    +        except TypeError:
    +            pass
     
     
    -def MC(F, G):
    -    return sorted(set(meta_compose(F, G)))
    +def MC(F, G):
    +    return sorted(set(meta_compose(F, G)))
     
    -
    for f in MC([dup], [mul]):
    -    print doc_from_stack_effect(*f)
    +
    for f in MC([dup], [mul]):
    +    print doc_from_stack_effect(*f)
     
    (n1 -- n2)
     
    -
    for f in MC([dup], muls):
    -    print doc_from_stack_effect(*f)
    +
    for f in MC([dup], muls):
    +    print doc_from_stack_effect(*f)
     
    (f1 -- f2)
    @@ -1768,173 +1768,173 @@ to return all universes (represented by their substitution dicts, the
     “unifiers”) that don’t lead to type conflicts.

    Consider unifying two stacks (the lowercase letters are any type variables of the kinds we have defined so far):

    -
    [a A* b .0.] U [c d .1.]
    +
    [a A* b .0.] U [c d .1.]
                               w/ {c: a}
    -[  A* b .0.] U [  d .1.]
    +[  A* b .0.] U [  d .1.]
     

    Now we have to split universes to unify A*. In the first universe it disappears:

    -
    [b .0.] U [d .1.]
    -                   w/ {d: b, .1.: .0.}
    +
    [b .0.] U [d .1.]
    +                   w/ {d: b, .1.: .0.}
          [] U []
     

    While in the second it spawns an A, which we will label e:

    -
    [e A* b .0.] U [d .1.]
    +
    [e A* b .0.] U [d .1.]
                             w/ {d: e}
    -[  A* b .0.] U [  .1.]
    -                        w/ {.1.: A* b .0.}
    -[  A* b .0.] U [  A* b .0.]
    +[  A* b .0.] U [  .1.]
    +                        w/ {.1.: A* b .0.}
    +[  A* b .0.] U [  A* b .0.]
     

    Giving us two unifiers:

    -
    {c: a,  d: b,  .1.:      .0.}
    -{c: a,  d: e,  .1.: A* b .0.}
    +
    {c: a,  d: b,  .1.:      .0.}
    +{c: a,  d: e,  .1.: A* b .0.}
     
    -
    class KleeneStar(object):
    +
    class KleeneStar(object):
     
    -    kind = AnyJoyType
    +    kind = AnyJoyType
     
    -    def __init__(self, number):
    -        self.number = number
    -        self.count = 0
    -        self.prefix = repr(self)
    +    def __init__(self, number):
    +        self.number = number
    +        self.count = 0
    +        self.prefix = repr(self)
     
    -    def __repr__(self):
    -        return '%s%i*' % (self.kind.prefix, self.number)
    +    def __repr__(self):
    +        return '%s%i*' % (self.kind.prefix, self.number)
     
    -    def another(self):
    -        self.count += 1
    -        return self.kind(10000 * self.number + self.count)
    +    def another(self):
    +        self.count += 1
    +        return self.kind(10000 * self.number + self.count)
     
    -    def __eq__(self, other):
    -        return (
    -            isinstance(other, self.__class__)
    -            and other.number == self.number
    -        )
    +    def __eq__(self, other):
    +        return (
    +            isinstance(other, self.__class__)
    +            and other.number == self.number
    +        )
     
    -    def __ge__(self, other):
    -        return self.kind >= other.kind
    +    def __ge__(self, other):
    +        return self.kind >= other.kind
     
    -    def __add__(self, other):
    -        return self.__class__(self.number + other)
    -    __radd__ = __add__
    +    def __add__(self, other):
    +        return self.__class__(self.number + other)
    +    __radd__ = __add__
     
    -    def __hash__(self):
    -        return hash(repr(self))
    +    def __hash__(self):
    +        return hash(repr(self))
     
    -class AnyStarJoyType(KleeneStar): kind = AnyJoyType
    -class NumberStarJoyType(KleeneStar): kind = NumberJoyType
    -#class FloatStarJoyType(KleeneStar): kind = FloatJoyType
    -#class IntStarJoyType(KleeneStar): kind = IntJoyType
    -class StackStarJoyType(KleeneStar): kind = StackJoyType
    +class AnyStarJoyType(KleeneStar): kind = AnyJoyType
    +class NumberStarJoyType(KleeneStar): kind = NumberJoyType
    +#class FloatStarJoyType(KleeneStar): kind = FloatJoyType
    +#class IntStarJoyType(KleeneStar): kind = IntJoyType
    +class StackStarJoyType(KleeneStar): kind = StackJoyType
     
     
    -As = map(AnyStarJoyType, _R)
    -Ns = map(NumberStarJoyType, _R)
    -Ss = map(StackStarJoyType, _R)
    +As = map(AnyStarJoyType, _R)
    +Ns = map(NumberStarJoyType, _R)
    +Ss = map(StackStarJoyType, _R)
     

    unify() version 4

    Can now return multiple results…

    -
    def unify(u, v, s=None):
    -    if s is None:
    -        s = {}
    -    elif s:
    -        u = update(s, u)
    -        v = update(s, v)
    +
    def unify(u, v, s=None):
    +    if s is None:
    +        s = {}
    +    elif s:
    +        u = update(s, u)
    +        v = update(s, v)
     
    -    if u == v:
    -        return s,
    +    if u == v:
    +        return s,
     
    -    if isinstance(u, AnyJoyType) and isinstance(v, AnyJoyType):
    -        if u >= v:
    -            s[u] = v
    -            return s,
    -        if v >= u:
    -            s[v] = u
    -            return s,
    -        raise TypeError('Cannot unify %r and %r.' % (u, v))
    +    if isinstance(u, AnyJoyType) and isinstance(v, AnyJoyType):
    +        if u >= v:
    +            s[u] = v
    +            return s,
    +        if v >= u:
    +            s[v] = u
    +            return s,
    +        raise TypeError('Cannot unify %r and %r.' % (u, v))
     
    -    if isinstance(u, tuple) and isinstance(v, tuple):
    -        if len(u) != len(v) != 2:
    -            raise TypeError(repr((u, v)))
    +    if isinstance(u, tuple) and isinstance(v, tuple):
    +        if len(u) != len(v) != 2:
    +            raise TypeError(repr((u, v)))
     
    -        a, b = v
    -        if isinstance(a, KleeneStar):
    -            # Two universes, in one the Kleene star disappears and unification
    -            # continues without it...
    -            s0 = unify(u, b)
    +        a, b = v
    +        if isinstance(a, KleeneStar):
    +            # Two universes, in one the Kleene star disappears and unification
    +            # continues without it...
    +            s0 = unify(u, b)
     
    -            # In the other it spawns a new variable.
    -            s1 = unify(u, (a.another(), v))
    +            # In the other it spawns a new variable.
    +            s1 = unify(u, (a.another(), v))
     
    -            t = s0 + s1
    -            for sn in t:
    -                sn.update(s)
    -            return t
    +            t = s0 + s1
    +            for sn in t:
    +                sn.update(s)
    +            return t
     
    -        a, b = u
    -        if isinstance(a, KleeneStar):
    -            s0 = unify(v, b)
    -            s1 = unify(v, (a.another(), u))
    -            t = s0 + s1
    -            for sn in t:
    -                sn.update(s)
    -            return t
    +        a, b = u
    +        if isinstance(a, KleeneStar):
    +            s0 = unify(v, b)
    +            s1 = unify(v, (a.another(), u))
    +            t = s0 + s1
    +            for sn in t:
    +                sn.update(s)
    +            return t
     
    -        ses = unify(u[0], v[0], s)
    -        results = ()
    -        for sn in ses:
    -            results += unify(u[1], v[1], sn)
    -        return results
    +        ses = unify(u[0], v[0], s)
    +        results = ()
    +        for sn in ses:
    +            results += unify(u[1], v[1], sn)
    +        return results
     
    -    if isinstance(v, tuple):
    -        if not stacky(u):
    -            raise TypeError('Cannot unify %r and %r.' % (u, v))
    -        s[u] = v
    -        return s,
    +    if isinstance(v, tuple):
    +        if not stacky(u):
    +            raise TypeError('Cannot unify %r and %r.' % (u, v))
    +        s[u] = v
    +        return s,
     
    -    if isinstance(u, tuple):
    -        if not stacky(v):
    -            raise TypeError('Cannot unify %r and %r.' % (v, u))
    -        s[v] = u
    -        return s,
    +    if isinstance(u, tuple):
    +        if not stacky(v):
    +            raise TypeError('Cannot unify %r and %r.' % (v, u))
    +        s[v] = u
    +        return s,
     
    -    return ()
    +    return ()
     
     
    -def stacky(thing):
    -    return thing.__class__ in {AnyJoyType, StackJoyType}
    +def stacky(thing):
    +    return thing.__class__ in {AnyJoyType, StackJoyType}
     
    -
    a = (As[1], S[1])
    -a
    +
    a = (As[1], S[1])
    +a
     
    (a1*, s1)
     
    -
    b = (A[1], S[2])
    -b
    +
    b = (A[1], S[2])
    +b
     
    (a1, s2)
     
    -
    for result in unify(b, a):
    -    print result, '->', update(result, a), update(result, b)
    +
    for result in unify(b, a):
    +    print result, '->', update(result, a), update(result, b)
     
    {s1: (a1, s2)} -> (a1*, (a1, s2)) (a1, s2)
     {a1: a10001, s2: (a1*, s1)} -> (a1*, s1) (a10001, (a1*, s1))
     
    -
    for result in unify(a, b):
    -    print result, '->', update(result, a), update(result, b)
    +
    for result in unify(a, b):
    +    print result, '->', update(result, a), update(result, b)
     
    {s1: (a1, s2)} -> (a1*, (a1, s2)) (a1, s2)
    @@ -1948,24 +1948,24 @@ disappears:

    (a1*, s1) [a1*] (a2, (a1*, s1)) [a2 a1*]
    -
    sum_ = ((Ns[1], S[1]), S[0]), (N[0], S[0])
    +
    sum_ = ((Ns[1], S[1]), S[0]), (N[0], S[0])
     
    -print doc_from_stack_effect(*sum_)
    +print doc_from_stack_effect(*sum_)
     
    -
    ([n1* .1.] -- n0)
    +
    ([n1* .1.] -- n0)
     
    -
    f = (N[1], (N[2], (N[3], S[1]))), S[0]
    +
    f = (N[1], (N[2], (N[3], S[1]))), S[0]
     
    -print doc_from_stack_effect(S[0], f)
    +print doc_from_stack_effect(S[0], f)
     
    -
    (-- [n1 n2 n3 .1.])
    +
    (-- [n1 n2 n3 .1.])
     
    -
    for result in unify(sum_[0], f):
    -    print result, '->', update(result, sum_[1])
    +
    for result in unify(sum_[0], f):
    +    print result, '->', update(result, sum_[1])
     
    {s1: (n1, (n2, (n3, s1)))} -> (n0, s0)
    @@ -1978,88 +1978,88 @@ disappears:

    compose() version 3

    This function has to be modified to yield multiple results.

    -
    def compose(f, g):
    -    (f_in, f_out), (g_in, g_out) = f, g
    -    s = unify(g_in, f_out)
    -    if not s:
    -        raise TypeError('Cannot unify %r and %r.' % (f_out, g_in))
    -    for result in s:
    -        yield update(result, (f_in, g_out))
    +
    def compose(f, g):
    +    (f_in, f_out), (g_in, g_out) = f, g
    +    s = unify(g_in, f_out)
    +    if not s:
    +        raise TypeError('Cannot unify %r and %r.' % (f_out, g_in))
    +    for result in s:
    +        yield update(result, (f_in, g_out))
     
    -
    def meta_compose(F, G):
    -    for f, g in product(F, G):
    -        try:
    -            for result in C(f, g):
    -                yield result
    -        except TypeError:
    -            pass
    +
    def meta_compose(F, G):
    +    for f, g in product(F, G):
    +        try:
    +            for result in C(f, g):
    +                yield result
    +        except TypeError:
    +            pass
     
     
    -def C(f, g):
    -    f, g = relabel(f, g)
    -    for fg in compose(f, g):
    -        yield delabel(fg)
    +def C(f, g):
    +    f, g = relabel(f, g)
    +    for fg in compose(f, g):
    +        yield delabel(fg)
     
    -
    for f in MC([dup], muls):
    -    print doc_from_stack_effect(*f)
    +
    for f in MC([dup], muls):
    +    print doc_from_stack_effect(*f)
     
    (f1 -- f2)
     (i1 -- i2)
     
    -
    for f in MC([dup], [sum_]):
    -    print doc_from_stack_effect(*f)
    +
    for f in MC([dup], [sum_]):
    +    print doc_from_stack_effect(*f)
     
    -
    ([n1* .1.] -- [n1* .1.] n1)
    +
    ([n1* .1.] -- [n1* .1.] n1)
     
    -
    for f in MC([cons], [sum_]):
    -    print doc_from_stack_effect(*f)
    +
    for f in MC([cons], [sum_]):
    +    print doc_from_stack_effect(*f)
     
    -
    (a1 [.1.] -- n1)
    -(n1 [n1* .1.] -- n2)
    +
    (a1 [.1.] -- n1)
    +(n1 [n1* .1.] -- n2)
     
    -
    sum_ = (((N[1], (Ns[1], S[1])), S[0]), (N[0], S[0]))
    -print doc_from_stack_effect(*cons),
    -print doc_from_stack_effect(*sum_),
    +
    sum_ = (((N[1], (Ns[1], S[1])), S[0]), (N[0], S[0]))
    +print doc_from_stack_effect(*cons),
    +print doc_from_stack_effect(*sum_),
     
    -for f in MC([cons], [sum_]):
    -    print doc_from_stack_effect(*f)
    +for f in MC([cons], [sum_]):
    +    print doc_from_stack_effect(*f)
     
    -
    (a1 [.1.] -- [a1 .1.]) ([n1 n1* .1.] -- n0) (n1 [n1* .1.] -- n2)
    +
    (a1 [.1.] -- [a1 .1.]) ([n1 n1* .1.] -- n0) (n1 [n1* .1.] -- n2)
     
    -
    a = (A[4], (As[1], (A[3], S[1])))
    -a
    +
    a = (A[4], (As[1], (A[3], S[1])))
    +a
     
    (a4, (a1*, (a3, s1)))
     
    -
    b = (A[1], (A[2], S[2]))
    -b
    +
    b = (A[1], (A[2], S[2]))
    +b
     
    (a1, (a2, s2))
     
    -
    for result in unify(b, a):
    -    print result
    +
    for result in unify(b, a):
    +    print result
     
    {a1: a4, s2: s1, a2: a3}
     {a1: a4, s2: (a1*, (a3, s1)), a2: a10003}
     
    -
    for result in unify(a, b):
    -    print result
    +
    for result in unify(a, b):
    +    print result
     
    {s2: s1, a2: a3, a4: a1}
    @@ -2075,11 +2075,11 @@ disappears:

    have the quoted programs they expect available. In the most general case, the i combinator, you can’t say anything about its stack effect other than it expects one quote:

    -
    i (... [.1.] -- ... .1.)
    +
    i (... [.1.] -- ... .1.)
     

    Or

    -
    i (... [A* .1.] -- ... A*)
    +
    i (... [A* .1.] -- ... A*)
     

    Consider the type of:

    @@ -2087,7 +2087,7 @@ effect other than it expects one quote:

    Obviously it would be:

    -
    (a1 [..1] a2 -- [a1 ..1] a2)
    +
    (a1 [..1] a2 -- [a1 ..1] a2)
     

    dip itself could have:

    @@ -2111,19 +2111,19 @@ stack effect we have to “split universes” again and return both.

    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 name and a list of stack effects.

    -
    class FunctionJoyType(AnyJoyType):
    +
    class FunctionJoyType(AnyJoyType):
     
    -    def __init__(self, name, sec, number):
    -        self.name = name
    -        self.stack_effects = sec
    -        self.number = number
    +    def __init__(self, name, sec, number):
    +        self.name = name
    +        self.stack_effects = sec
    +        self.number = number
     
    -    def __add__(self, other):
    -        return self
    -    __radd__ = __add__
    +    def __add__(self, other):
    +        return self
    +    __radd__ = __add__
     
    -    def __repr__(self):
    -        return self.name
    +    def __repr__(self):
    +        return self.name
     
    @@ -2131,47 +2131,47 @@ name and a list of stack effects.

    Specialized for Simple Functions and Combinators

    For non-combinator functions the stack effects list contains stack effect comments (represented by pairs of cons-lists as described above.)

    -
    class SymbolJoyType(FunctionJoyType):
    -    prefix = 'F'
    +
    class SymbolJoyType(FunctionJoyType):
    +    prefix = 'F'
     

    For combinators the list contains Python functions.

    -
    class CombinatorJoyType(FunctionJoyType):
    +
    class CombinatorJoyType(FunctionJoyType):
     
    -    prefix = 'C'
    +    prefix = 'C'
     
    -    def __init__(self, name, sec, number, expect=None):
    -        super(CombinatorJoyType, self).__init__(name, sec, number)
    -        self.expect = expect
    +    def __init__(self, name, sec, number, expect=None):
    +        super(CombinatorJoyType, self).__init__(name, sec, number)
    +        self.expect = expect
     
    -    def enter_guard(self, f):
    -        if self.expect is None:
    -            return f
    -        g = self.expect, self.expect
    -        new_f = list(compose(f, g, ()))
    -        assert len(new_f) == 1, repr(new_f)
    -        return new_f[0][1]
    +    def enter_guard(self, f):
    +        if self.expect is None:
    +            return f
    +        g = self.expect, self.expect
    +        new_f = list(compose(f, g, ()))
    +        assert len(new_f) == 1, repr(new_f)
    +        return new_f[0][1]
     

    For simple combinators that have only one effect (like dip) you only need one function and it can be the combinator itself.

    -
    import joy.library
    +
    import joy.library
     
    -dip = CombinatorJoyType('dip', [joy.library.dip], 23)
    +dip = CombinatorJoyType('dip', [joy.library.dip], 23)
     

    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 effects.

    -
    def branch_true(stack, expression, dictionary):
    -    (then, (else_, (flag, stack))) = stack
    -    return stack, concat(then, expression), dictionary
    +
    def branch_true(stack, expression, dictionary):
    +    (then, (else_, (flag, stack))) = stack
    +    return stack, concat(then, expression), dictionary
     
    -def branch_false(stack, expression, dictionary):
    -    (then, (else_, (flag, stack))) = stack
    -    return stack, concat(else_, expression), dictionary
    +def branch_false(stack, expression, dictionary):
    +    (then, (else_, (flag, stack))) = stack
    +    return stack, concat(else_, expression), dictionary
     
    -branch = CombinatorJoyType('branch', [branch_true, branch_false], 100)
    +branch = CombinatorJoyType('branch', [branch_true, branch_false], 100)
     

    You can also provide an optional stack effect, input-side only, that @@ -2189,54 +2189,54 @@ that expression.

    updated along with the stack effects after doing unification or we risk losing useful information. This was a straightforward, if awkward, modification to the call structure of meta_compose() et. al.

    -
    ID = S[0], S[0]  # Identity function.
    +
    ID = S[0], S[0]  # Identity function.
     
     
    -def infer(*expression):
    -    return sorted(set(_infer(list_to_stack(expression))))
    +def infer(*expression):
    +    return sorted(set(_infer(list_to_stack(expression))))
     
     
    -def _infer(e, F=ID):
    -    _log_it(e, F)
    -    if not e:
    -        return [F]
    +def _infer(e, F=ID):
    +    _log_it(e, F)
    +    if not e:
    +        return [F]
     
    -    n, e = e
    +    n, e = e
     
    -    if isinstance(n, SymbolJoyType):
    -        eFG = meta_compose([F], n.stack_effects, e)
    -        res = flatten(_infer(e, Fn) for e, Fn in eFG)
    +    if isinstance(n, SymbolJoyType):
    +        eFG = meta_compose([F], n.stack_effects, e)
    +        res = flatten(_infer(e, Fn) for e, Fn in eFG)
     
    -    elif isinstance(n, CombinatorJoyType):
    -        fi, fo = n.enter_guard(F)
    -        res = flatten(_interpret(f, fi, fo, e) for f in n.stack_effects)
    +    elif isinstance(n, CombinatorJoyType):
    +        fi, fo = n.enter_guard(F)
    +        res = flatten(_interpret(f, fi, fo, e) for f in n.stack_effects)
     
    -    elif isinstance(n, Symbol):
    -        assert n not in FUNCTIONS, repr(n)
    -        func = joy.library._dictionary[n]
    -        res = _interpret(func, F[0], F[1], e)
    +    elif isinstance(n, Symbol):
    +        assert n not in FUNCTIONS, repr(n)
    +        func = joy.library._dictionary[n]
    +        res = _interpret(func, F[0], F[1], e)
     
    -    else:
    -        fi, fo = F
    -        res = _infer(e, (fi, (n, fo)))
    +    else:
    +        fi, fo = F
    +        res = _infer(e, (fi, (n, fo)))
     
    -    return res
    +    return res
     
     
    -def _interpret(f, fi, fo, e):
    -    new_fo, ee, _ = f(fo, e, {})
    -    ee = update(FUNCTIONS, ee)  # Fix Symbols.
    -    new_F = fi, new_fo
    -    return _infer(ee, new_F)
    +def _interpret(f, fi, fo, e):
    +    new_fo, ee, _ = f(fo, e, {})
    +    ee = update(FUNCTIONS, ee)  # Fix Symbols.
    +    new_F = fi, new_fo
    +    return _infer(ee, new_F)
     
     
    -def _log_it(e, F):
    -    _log.info(
    -        u'%3i %s%s',
    -        len(inspect_stack()),
    -        doc_from_stack_effect(*F),
    -        expression_to_string(e),
    -        )
    +def _log_it(e, F):
    +    _log.info(
    +        u'%3i %s ∘ %s',
    +        len(inspect_stack()),
    +        doc_from_stack_effect(*F),
    +        expression_to_string(e),
    +        )
     
    @@ -2249,18 +2249,18 @@ module (FIXME link to its docs here!) should be explained… There is cruft to convert the definitions in DEFS to the new SymbolJoyType objects, and some combinators. Here is an example of output from the current code :

    -
    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..)
     
    -logging.basicConfig(format='%(message)s', stream=sys.stdout, level=logging.INFO)
    +logging.basicConfig(format='%(message)s', stream=sys.stdout, level=logging.INFO)
     
    -globals().update(FUNCTIONS)
    +globals().update(FUNCTIONS)
     
    -h = infer((pred, s2), (mul, s3), (div, s4), (nullary, (bool, s5)), dipd, branch)
    +h = infer((pred, s2), (mul, s3), (div, s4), (nullary, (bool, s5)), dipd, branch)
     
    -print '-' * 40
    +print '-' * 40
     
    -for fi, fo in h:
    -    print doc_from_stack_effect(fi, fo)
    +for fi, fo in h:
    +    print doc_from_stack_effect(fi, fo)
     
    ---------------------------------------------------------------------------
    @@ -2366,14 +2366,14 @@ relational 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 types
     module. But if you’re interested in all that you should just use Prolog!

    Anyhow, type checking is a few easy steps away.

    -
    def _ge(self, other):
    -    return (issubclass(other.__class__, self.__class__)
    -            or hasattr(self, 'accept')
    -            and isinstance(other, self.accept))
    +
    def _ge(self, other):
    +    return (issubclass(other.__class__, self.__class__)
    +            or hasattr(self, 'accept')
    +            and isinstance(other, self.accept))
     
    -AnyJoyType.__ge__ = _ge
    -AnyJoyType.accept = tuple, int, float, long, str, unicode, bool, Symbol
    -StackJoyType.accept = tuple
    +AnyJoyType.__ge__ = _ge
    +AnyJoyType.accept = tuple, int, float, long, str, unicode, bool, Symbol
    +StackJoyType.accept = tuple
     
    @@ -2465,7 +2465,7 @@ module. But if you’re interested in all that you should just use Prolog!


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/Zipper.html b/docs/sphinx_docs/_build/html/notebooks/Zipper.html index 72ff9f1..7eec7cd 100644 --- a/docs/sphinx_docs/_build/html/notebooks/Zipper.html +++ b/docs/sphinx_docs/_build/html/notebooks/Zipper.html @@ -42,7 +42,7 @@ the original paper:
    from notebook_preamble import J, V, define
    +
    from notebook_preamble import J, V, define
     
    @@ -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 trees out of sequences.

    -
    J('[1 [2 [3 4 25 6] 7] 8]')
    +
    J('[1 [2 [3 4 25 6] 7] 8]')
     
    [1 [2 [3 4 25 6] 7] 8]
    @@ -75,13 +75,13 @@ datastructure used to keep track of these items is the zipper.)

    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, but see below.

    -
    define('z-down == [] swap uncons swap')
    -define('z-up == swons swap shunt')
    -define('z-right == [swons] cons dip uncons swap')
    -define('z-left == swons [uncons swap] dip swap')
    +
    define('z-down == [] swap uncons swap')
    +define('z-up == swons swap shunt')
    +define('z-right == [swons] cons dip uncons swap')
    +define('z-left == swons [uncons swap] dip swap')
     
    -
    V('[1 [2 [3 4 25 6] 7] 8] z-down')
    +
    V('[1 [2 [3 4 25 6] 7] 8] z-down')
     
                              . [1 [2 [3 4 25 6] 7] 8] z-down
    @@ -93,7 +93,7 @@ but see below.

    [] [[2 [3 4 25 6] 7] 8] 1 .
    -
    V('[] [[2 [3 4 25 6] 7] 8] 1 z-right')
    +
    V('[] [[2 [3 4 25 6] 7] 8] 1 z-right')
     
                                      . [] [[2 [3 4 25 6] 7] 8] 1 z-right
    @@ -113,43 +113,43 @@ but see below.

    [1] [8] [2 [3 4 25 6] 7] .
    -
    J('[1] [8] [2 [3 4 25 6] 7] z-down')
    +
    J('[1] [8] [2 [3 4 25 6] 7] z-down')
     
    [1] [8] [] [[3 4 25 6] 7] 2
     
    -
    J('[1] [8] [] [[3 4 25 6] 7] 2 z-right')
    +
    J('[1] [8] [] [[3 4 25 6] 7] 2 z-right')
     
    [1] [8] [2] [7] [3 4 25 6]
     
    -
    J('[1] [8] [2] [7] [3 4 25 6] z-down')
    +
    J('[1] [8] [2] [7] [3 4 25 6] z-down')
     
    [1] [8] [2] [7] [] [4 25 6] 3
     
    -
    J('[1] [8] [2] [7] [] [4 25 6] 3 z-right')
    +
    J('[1] [8] [2] [7] [] [4 25 6] 3 z-right')
     
    [1] [8] [2] [7] [3] [25 6] 4
     
    -
    J('[1] [8] [2] [7] [3] [25 6] 4 z-right')
    +
    J('[1] [8] [2] [7] [3] [25 6] 4 z-right')
     
    [1] [8] [2] [7] [4 3] [6] 25
     
    -
    J('[1] [8] [2] [7] [4 3] [6] 25 sqr')
    +
    J('[1] [8] [2] [7] [4 3] [6] 25 sqr')
     
    [1] [8] [2] [7] [4 3] [6] 625
     
    -
    V('[1] [8] [2] [7] [4 3] [6] 625 z-up')
    +
    V('[1] [8] [2] [7] [4 3] [6] 625 z-up')
     
                                  . [1] [8] [2] [7] [4 3] [6] 625 z-up
    @@ -168,13 +168,13 @@ but see below.

    [1] [8] [2] [7] [3 4 625 6] .
    -
    J('[1] [8] [2] [7] [3 4 625 6] z-up')
    +
    J('[1] [8] [2] [7] [3 4 625 6] z-up')
     
    [1] [8] [2 [3 4 625 6] 7]
     
    -
    J('[1] [8] [2 [3 4 625 6] 7] z-up')
    +
    J('[1] [8] [2 [3 4 625 6] 7] z-up')
     
    [1 [2 [3 4 625 6] 7] 8]
    @@ -185,7 +185,7 @@ but see below.

    dip and infra

    In Joy we have the dip and infra combinators which can “target” or “address” any particular item in a Joy tree structure.

    -
    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')
     
                                                                    . [1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra
    @@ -236,11 +236,11 @@ been embedded in a nested series of quoted programs, e.g.:

    The Z function isn’t hard to make.

    -
    define('Z == [[] cons cons] step i')
    +
    define('Z == [[] cons cons] step i')
     

    Here it is in action in a simplified scenario.

    -
    V('1 [2 3 4] Z')
    +
    V('1 [2 3 4] Z')
     
                                 . 1 [2 3 4] Z
    @@ -273,7 +273,7 @@ been embedded in a nested series of quoted programs, e.g.:

    And here it is doing the main thing.

    -
    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')
     
    [1 [2 [3 4 625 6] 7] 8]
    @@ -389,7 +389,7 @@ i d i d i d d Bingo!
     
     
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/notebooks/index.html b/docs/sphinx_docs/_build/html/notebooks/index.html index e742b6c..26bd28c 100644 --- a/docs/sphinx_docs/_build/html/notebooks/index.html +++ b/docs/sphinx_docs/_build/html/notebooks/index.html @@ -251,7 +251,7 @@
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/objects.inv b/docs/sphinx_docs/_build/html/objects.inv index 136209a838e8e1a7525e548ab631152e8592642f..10dedf8a60d874916a6802d88fb1799e27e9f30c 100644 GIT binary patch delta 1183 zcmV;Q1YrBP473c8vVR49-?zYGu~%6wH#EGE zB)ldCsy0y2@S-Aa9|M(I0gbT&V@VVXCFG98SaKuef<~z&&4x0xqsTrPngIu-V6}Cg z)9@8({Ek18md%NZR$$dqJk=xTtjOMs$Oz%bz zng%ZfZP$(e7`zh2+yhd$NX7SnXTT0NE^{h_4JI3Fy?B2zL)_Yl()zO+40lju)a%X& zf0|>l_o9^=6-eY`MU+S{Qu#>&b78DY7RcOMC5fooxMhk09!VyJua!=u7peSIf#eya z&mnadm|akkg3+k5EYw=2YNTyylR6CxFTKN#D){STng9|LbEDVzA5_*nbuMeJ)A)%~ za7$s5mebW~9!OsWEYw^YpXfy_E}YwDctHs@`o0EgI-aQ#V&?ST@EmST^Yq)34g)KH z+;(6lq7HG2FH+SJ!oG6!b)%uL0M++*|h6s9Hl4!Dic649u%t4_gbY;I1~@KlIy^%LCDWevc&H znF1rU$ih!;*}Z`=wIO6XaRV3+=*GalK4UGG1#D=KjQ(Ep0zEDAVN1L2Aiqb?m8me; zBBfi%Yttm#3sud~8m{oj_y?iE!mf)&T|Fzh>{2w}(I=7m z-BZmCWOrJavF+W11S_G5wX8OOH8s(9p$drP@0XCh!7FI?PW$j4-`E4dF0g_54nLoQ zH+i>Yk(!$0W}W+|a$r9-6O7IKwf8T7!#3OA;XuMjaxEZM+-kU3LjE|qATgp<#unB! z9cbBck;nn(c)Z$qjjk?X!7-)#X(PrDqMwrf63q{|gQB6Yn=SWG$6nxnk~@wEX`QhE%A`|=jaL~mNmKe06{02_x4Op89GqU1ga zby<(Uuhjgc^42BD!hO|*Lv+p^IRHc6?4N@cxXG7&VrXl(Lg>HY3z&rBCmP(o6k&Hw xpE8(H&~g5sJ9w(0Sxdtne!=qT^T&TD?l2@=6bL?yu4Q|u`v^Gn&VRNMI^(P2KD__{ delta 1187 zcmV;U1YG;H47d!CvVRGD-?zYGu~?Ar)pq(`ZJFMlRjQ~fT-?Ed* z`+%E1$VaKx@@`wrRC#5LGM);X9JCWkveP{~rU~i5Xb+v&GJg))4(1rlfG%HztK~6R zDQ1S7z6;v6K{s@L=R)Goc`ZsOv;YMlEzzMk|4RNFp4(!S`)oBFO?z%$RaODTWA5&Ku%*g;h>^W zmQd2dR*=B7MSl}>N7|!;HW)cKoJJ5%U~c_D82Iq58`DhsYw;4 zcZCQ|gExq_>&E{K-l1ad0V&+P;)}yGUh z{b+FP8Oq^|-NYA%gW^dc4)&TTWipoAKIUjsEA&r}I9b9!%h4mYNGSKN~e z11o=i?!Zh$9pV&Uq^cu?edXxuNb3gfZATOY`Z62JaYuNiurAmnQ?;Nnn!hidA?_F< z3)oAqL6 zpRxVA`Hq621ZIL8GREO!z;&kIzt_A#Pm6rm(ylwm@6mH* zDh#$r=@#taz?&x$U2J{q~Z?oO>k?-L6~gj)i;6wNdG zBvQY7s=0yeP75=(y?c;gB{Z>?)uw-@Ci*T^0g?Ru60$dV1
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/pretty.html b/docs/sphinx_docs/_build/html/pretty.html index b43aaef..8d609eb 100644 --- a/docs/sphinx_docs/_build/html/pretty.html +++ b/docs/sphinx_docs/_build/html/pretty.html @@ -182,7 +182,7 @@ trace of the evaluation


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/py-modindex.html b/docs/sphinx_docs/_build/html/py-modindex.html index 7c96010..3a3c124 100644 --- a/docs/sphinx_docs/_build/html/py-modindex.html +++ b/docs/sphinx_docs/_build/html/py-modindex.html @@ -146,7 +146,7 @@
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/search.html b/docs/sphinx_docs/_build/html/search.html index cb9bd5d..3c0ea74 100644 --- a/docs/sphinx_docs/_build/html/search.html +++ b/docs/sphinx_docs/_build/html/search.html @@ -120,7 +120,7 @@
    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/searchindex.js b/docs/sphinx_docs/_build/html/searchindex.js index a270cf5..24de0c6 100644 --- a/docs/sphinx_docs/_build/html/searchindex.js +++ b/docs/sphinx_docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["index","joy","lib","library","notebooks/Categorical","notebooks/Derivatives_of_Regular_Expressions","notebooks/Developing","notebooks/Generator_Programs","notebooks/Intro","notebooks/Newton-Raphson","notebooks/NoUpdates","notebooks/Ordered_Binary_Trees","notebooks/Quadratic","notebooks/Recursion_Combinators","notebooks/Replacing","notebooks/Square_Spiral","notebooks/The_Four_Operations","notebooks/Treestep","notebooks/TypeChecking","notebooks/Types","notebooks/Zipper","notebooks/index","parser","pretty","stack","types"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["index.rst","joy.rst","lib.rst","library.rst","notebooks/Categorical.rst","notebooks/Derivatives_of_Regular_Expressions.rst","notebooks/Developing.rst","notebooks/Generator_Programs.rst","notebooks/Intro.rst","notebooks/Newton-Raphson.rst","notebooks/NoUpdates.rst","notebooks/Ordered_Binary_Trees.rst","notebooks/Quadratic.rst","notebooks/Recursion_Combinators.rst","notebooks/Replacing.rst","notebooks/Square_Spiral.rst","notebooks/The_Four_Operations.rst","notebooks/Treestep.rst","notebooks/TypeChecking.rst","notebooks/Types.rst","notebooks/Zipper.rst","notebooks/index.rst","parser.rst","pretty.rst","stack.rst","types.rst"],objects:{"joy.joy":[[1,1,1,"","UnknownSymbolError"],[1,2,1,"","interp"],[1,2,1,"","joy"],[1,2,1,"","repl"],[1,2,1,"","run"]],"joy.library":[[3,2,1,"","BinaryBuiltinWrapper"],[3,3,1,"","Def"],[3,2,1,"","FunctionWrapper"],[3,2,1,"","SimpleFunctionWrapper"],[3,2,1,"","UnaryBuiltinWrapper"],[3,2,1,"","add_aliases"],[3,2,1,"","app1"],[3,2,1,"","app2"],[3,2,1,"","app3"],[3,2,1,"","b"],[3,2,1,"","branch"],[3,2,1,"","choice"],[3,2,1,"","clear"],[3,2,1,"","cmp_"],[3,2,1,"","concat_"],[3,2,1,"","cond"],[3,2,1,"","dip"],[3,2,1,"","dipd"],[3,2,1,"","dipdd"],[3,2,1,"","disenstacken"],[3,2,1,"","divmod_"],[3,2,1,"","drop"],[3,2,1,"","dupdip"],[3,2,1,"","floor"],[3,2,1,"","gcd2"],[3,2,1,"","genrec"],[3,2,1,"","getitem"],[3,2,1,"","help_"],[3,2,1,"","i"],[3,2,1,"","id_"],[3,2,1,"","ifte"],[3,2,1,"","ii"],[3,2,1,"","infra"],[3,2,1,"","initialize"],[3,2,1,"","inscribe"],[3,2,1,"","inscribe_"],[3,2,1,"","loop"],[3,2,1,"","map_"],[3,2,1,"","max_"],[3,2,1,"","min_"],[3,2,1,"","parse"],[3,2,1,"","pm"],[3,2,1,"","pred"],[3,2,1,"","primrec"],[3,2,1,"","remove"],[3,2,1,"","reverse"],[3,2,1,"","select"],[3,2,1,"","sharing"],[3,2,1,"","shunt"],[3,2,1,"","sort_"],[3,2,1,"","sqrt"],[3,2,1,"","step"],[3,2,1,"","succ"],[3,2,1,"","sum_"],[3,2,1,"","take"],[3,2,1,"","times"],[3,2,1,"","unique"],[3,2,1,"","void"],[3,2,1,"","warranty"],[3,2,1,"","words"],[3,2,1,"","x"],[3,2,1,"","zip_"]],"joy.parser":[[22,1,1,"","ParseError"],[22,3,1,"","Symbol"],[22,2,1,"","text_to_expression"]],"joy.utils":[[3,0,0,"-","generated_library"],[23,0,0,"-","pretty_print"],[24,0,0,"-","stack"]],"joy.utils.generated_library":[[3,2,1,"","ccons"],[3,2,1,"","cons"],[3,2,1,"","dup"],[3,2,1,"","dupd"],[3,2,1,"","dupdd"],[3,2,1,"","first"],[3,2,1,"","first_two"],[3,2,1,"","fourth"],[3,2,1,"","over"],[3,2,1,"","pop"],[3,2,1,"","popd"],[3,2,1,"","popdd"],[3,2,1,"","popop"],[3,2,1,"","popopd"],[3,2,1,"","popopdd"],[3,2,1,"","rest"],[3,2,1,"","rolldown"],[3,2,1,"","rollup"],[3,2,1,"","rrest"],[3,2,1,"","second"],[3,2,1,"","stack"],[3,2,1,"","stuncons"],[3,2,1,"","stununcons"],[3,2,1,"","swaack"],[3,2,1,"","swap"],[3,2,1,"","swons"],[3,2,1,"","third"],[3,2,1,"","tuck"],[3,2,1,"","uncons"],[3,2,1,"","unit"],[3,2,1,"","unswons"]],"joy.utils.pretty_print":[[23,3,1,"","TracePrinter"],[23,2,1,"","trace"]],"joy.utils.pretty_print.TracePrinter":[[23,4,1,"","go"],[23,4,1,"","viewer"]],"joy.utils.stack":[[24,2,1,"","concat"],[24,2,1,"","dnd"],[24,2,1,"","expression_to_string"],[24,2,1,"","iter_stack"],[24,2,1,"","list_to_stack"],[24,2,1,"","pick"],[24,2,1,"","stack_to_string"]],joy:[[1,0,0,"-","joy"],[3,0,0,"-","library"],[22,0,0,"-","parser"]]},objnames:{"0":["py","module","Python module"],"1":["py","exception","Python exception"],"2":["py","function","Python function"],"3":["py","class","Python class"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:exception","2":"py:function","3":"py:class","4":"py:method"},terms:{"0":[2,3,5,6,7,8,9,10,11,12,14,15,17,18,19,25],"0000000001585":9,"000000001":9,"01":[6,7],"03":19,"05":5,"0a":19,"0b":[6,7],"0b11100111011011":6,"1":[2,3,5,6,7,8,9,10,11,12,14,15,17,18,19,20,24,25],"10":[2,5,6,7,13,19,25],"100":[5,17,19],"1000":[5,6,7,19],"10000":[5,19],"10001":5,"1001":[5,19],"10010":5,"10011":5,"1002":19,"101":5,"1010":5,"10100":5,"10101":5,"1011":5,"10110":5,"10111":5,"102":17,"1024":2,"103":17,"104":17,"105":17,"106":17,"107":17,"108":17,"109":17,"10946":7,"11":[2,6,7,19,25],"110":[5,6],"1100":5,"11000":5,"11001":5,"1101":5,"11010":5,"11011":5,"1110":5,"11100":5,"11101":5,"1111":5,"11110":5,"11111":5,"12":[2,6,17],"120":13,"122":5,"123":8,"128":7,"13":[2,7,17,25],"1346269":7,"14":[2,6,17],"144":7,"14811":[6,7],"15":[2,6,13,17,19,25],"16":[2,7,12,17,25],"160":2,"17":[11,15,17],"18":[6,8,14,15,17,23],"19":[17,19,25],"196418":7,"1a":19,"1b":19,"2":[2,3,5,6,8,9,10,11,13,14,17,18,20,24,25],"20":[2,6,14,19,25],"2006":19,"2017":[8,19],"2020":25,"207":2,"21":[6,7],"22":[9,19,25],"23":[2,6,7,8,9,11,14,15,17,19,23],"230":7,"231":[6,7],"232":7,"233":7,"233168":[6,7],"234":7,"23rd":19,"24":[2,6,7],"25":[6,7,12,17,18,20,25],"256":7,"2584":7,"26":[2,5,7,19,25],"27":[6,7],"273":10,"28":[7,18,25],"29":[19,25],"2a":19,"2b":19,"3":[2,3,7,8,10,11,12,13,17,18,20,21,24,25],"30":[2,6,19,25],"31":18,"32":[2,7,17],"33":6,"34":[7,18,19,25],"36":9,"37":[18,19,25],"3702":[6,7],"38":[19,25],"3819660112501051":12,"3b":19,"3i":19,"4":[2,6,7,8,9,11,13,17,18,20,24,25],"40":[2,18,19],"4000000":7,"41":[14,19,25],"414":23,"44":[11,17,19,25],"45":[2,6],"46":19,"4613732":7,"46368":7,"466":6,"47":[19,25],"48":[19,25],"49":[17,19,25],"4ac":12,"4m":7,"5":[2,3,5,7,8,11,12,13,14,17,19,21,25],"50":2,"513":23,"529":[2,8],"53":[19,25],"547":8,"55":[6,7],"552":2,"5555555555555554":2,"56":[19,25],"57":[6,7],"5bkei":11,"5d":11,"6":[2,6,9,11,13,17,19,20],"60":6,"610":7,"618033988749895":12,"625":20,"64":7,"66":[6,7],"6945":6,"7":[2,6,7,11,17,19,20,25],"75":2,"795831523312719":[2,9],"8":[2,5,6,7,11,12,17,19,20,25],"80":6,"832040":7,"88":11,"8888":8,"89":7,"9":[2,6,11,12,17,19,25],"90":2,"92":5,"925":6,"978":6,"980":6,"981":6,"984":6,"985":6,"987":6,"99":23,"990":6,"991":6,"992":6,"993":6,"995":6,"996":6,"999":[6,7],"999999999999996":9,"9a9d60354c35":19,"\u03b4":5,"\u03b5":9,"abstract":[8,11],"boolean":[2,3,8,11,16],"break":[5,8,15,19],"byte":[5,6],"case":[2,3,13,16,17,19,24],"char":5,"class":[3,5,8,19,22,23,24],"const":15,"default":[3,7,11,24],"do":[2,3,4,5,6,7,8,11,13,14,15,16,19,20,21],"export":[3,22],"final":[2,11,13,15],"float":[8,19,20,22],"function":[0,1,4,6,7,10,12,15,18,20,21,22,23,24,25],"g\u00e9rard":20,"goto":5,"import":[2,5,6,7,9,11,12,13,14,15,17,18,19,20],"int":[5,7,8,13,15,19,20,22,24],"long":[11,15,19,21],"new":[0,2,3,5,7,8,10,13,14,15,19],"p\u00f6ial":21,"p\u00f6ial06typingtool":19,"public":10,"return":[1,3,5,6,8,11,13,14,16,17,19,22,23,24],"short":15,"static":[2,10],"super":19,"switch":[2,19],"throw":[11,25],"true":[2,3,5,6,13,15,16,19],"try":[7,9,12,13,15,17,18,19,21],"void":[0,3,15],"while":[3,5,8,11,19,22,24],A:[1,3,4,8,13,16,19,21,22,23,24],AND:[5,19],And:[5,6,7,9,11,13,15,16,19,20,24],As:[4,6,11,15,19],At:[6,13,19],Be:2,But:[0,4,6,7,8,11,14,15,19],By:[7,11,19],For:[0,2,3,11,13,14,19,21,24],If:[2,3,5,6,7,8,9,10,12,13,15,17,19,20],In:[2,3,4,6,7,8,13,16,19,20,21,24],It:[0,2,3,4,5,6,7,8,10,11,13,15,19,20,24,25],Its:3,NO:8,NOT:5,No:[0,17,21],Not:19,OR:[5,19],Of:6,On:[3,23],One:[2,8,16,19,21],Or:[5,10,11,15,17,19],TOS:[2,3],That:[6,11],The:[0,1,2,3,4,5,7,9,10,12,20,21,22,23,24,25],Then:[2,3,11,12,13,19],There:[5,12,13,15,16,17,19,24],These:[16,19,21,24],To:[0,5,6,7,9,11,13,17,19],With:[9,13,15,19,21,25],_0:5,_1000:19,_1:5,_:[8,14,19],__:11,__add__:19,__call__:5,__class__:19,__eq__:19,__ge__:19,__hash__:19,__init__:[5,19],__main__:19,__radd__:19,__repr__:19,__str__:23,_and:5,_compaction_rul:5,_con:5,_dictionari:19,_f:19,_ge:19,_infer:19,_interpret:19,_log:19,_log_it:19,_names_for:19,_or:5,_r:19,_spn_e:15,_spn_p:15,_spn_t:15,_templat:5,_to_str:19,_tree_add_:11,_tree_add_e:[3,11,25],_tree_add_p:11,_tree_add_r:11,_tree_add_t:11,_tree_delete_:11,_tree_delete_clear_stuff:[3,11,25],_tree_delete_del:11,_tree_delete_r0:[3,11,25],_tree_delete_r1:11,_tree_delete_rightmost:11,_tree_delete_w:11,_tree_get_:[3,11,25],_tree_get_p:11,_tree_get_r:11,_tree_get_t:11,_tree_iter_order_curr:11,_tree_iter_order_left:11,_tree_iter_order_r:11,_tree_iter_order_right:11,_tree_t:11,_treestep_0:17,_treestep_1:17,_uniqu:19,_within_b:9,_within_p:9,_within_r:9,a0:19,a10001:19,a10002:19,a10003:19,a10004:19,a1:[3,18,19,25],a2:[3,18,19,25],a3:[3,18,19,25],a4:[3,18,19,25],a5:[18,19,25],a_:9,a_i:9,aa:13,ab:[0,3,5,9,15],abbrevi:17,abl:[5,16,19,25],about:[0,8,11,16,19,20,24],abov:[0,5,6,9,11,13,16,19],absolut:8,ac:5,accept:[0,1,2,3,5,6,7,8,11,12,14,15,16,17,19,20],accord:5,accordingli:[11,16],accumul:6,act:[5,25],action:[0,8,14,15,19,20,21],actual:[2,6,8,11,16,19],ad:[4,5,8,10,14,19,21],adapt:[15,21],add:[3,5,6,7,8,14,19,23,25],add_alias:3,add_def:[],add_definit:[11,17],addit:[0,2,3,6,8,13,14,17],address:21,adjust:11,advantag:19,affect:[3,16],after:[5,6,7,8,13,16,19,24,25],afterward:8,again:[2,3,6,8,11,13,19],against:19,aggreg:20,ahead:19,aka:[5,8,20,25],al:[16,19],albrecht:0,algorithm:[5,8,19],alia:3,alias:[3,8],align:[8,23],all:[3,5,6,7,8,11,13,14,15,16,17,19,23,24],alloc:19,allow:[10,11,16],almost:11,along:[5,8,13,19],alphabet:[3,21],alreadi:[5,9,14,19,20],also:[0,5,6,8,11,16,19,23,24],alter:[5,19],altern:[4,19],although:[4,11],altogeth:7,alwai:[6,10,13,16],am:[16,21],amend:16,among:19,amort:11,an:[0,1,2,3,4,5,9,14,15,17,21,24,25],analysi:[4,21],anamorph:[8,21],and_:3,ani:[0,4,5,6,8,10,11,15,16,19,20,22],annual:8,anonym:11,anoth:[5,11,16,19,24,25],anyhow:[16,19],anyjoytyp:19,anymor:19,anystarjoytyp:19,anyth:[2,3,5,8,19,25],apart:19,api:10,app1:3,app2:[3,8,12,13,14,16],app3:[3,16],app:8,appear:[2,4,5,6,11],append:19,appendix:21,appli:[2,3,6,7,11,13,15,19],applic:7,approach:6,appropri:5,approxim:21,ar:[1,2,3,5,6,7,8,10,12,13,16,17,19,20,21,22,24,25],archiv:0,aren:20,arg:[2,3,15],argument:[2,3,8,9,12,13,15,21,23,24],arithmet:2,ariti:[2,16],around:[6,19,22,24],arrang:[15,17],arriv:[7,17],arrow:5,articl:[0,4,7,13],ascii:5,ascii_lowercas:5,ask:[4,7,19],aspect:0,assembl:[5,15],assert:[5,19],assign:[16,24],associ:11,assum:9,asterisk:17,asterix:[19,25],asyncron:16,attack:8,attempt:[0,1,19],attribut:3,attributeerror:19,author:19,auto:[0,19,25],automat:[4,16,19],auxiliari:[5,17],avail:[0,19,25],averag:[8,14],avoid:11,awai:[11,19],awar:2,awkward:[11,13,19],azur:21,b0:3,b1:[3,19,25],b2:25,b3:25,b:[3,5,7,8,9,11,13,16,17,19],back:[3,11,19],backtrack:25,backward:[10,11,12,17],bad:19,bag:8,banana:13,bar:16,barb:13,base:[0,2,3,10,13,17,19],basic:[2,3,8,11],basicconfig:[18,19],bc:5,bd:5,becaas:5,becaus:[2,3,5,8,11,16,17,19,20,24],becom:[0,11,15,17,24],becuas:19,been:[5,9,10,11,19,20],befor:[5,7,8,11],begin:[11,17],behavior:[10,17,25],behaviour:[0,1,19],behind:16,being:[0,16],below:[2,3,5,6,7,11,15,19,20],bespok:8,best:0,better:[6,11,13,19],between:[0,6],beyond:7,biannual:8,bin:5,binari:[0,7,8,21],binary_search_tre:11,binarybuiltinwrapp:3,bind:8,bingo:20,bit:[5,6,7,11,19],blank:22,bliss:[0,21],block:6,bodi:[2,3,5,8,11,16],body_text:[],booktitl:19,bool:[3,13,19,25],borrow:[8,19],both:[2,6,8,12,13,14,15,16,19,24],bottom:7,bounce_to:5,bracket:[8,19,22],branch:[3,5,6,7,13,19,21,25],branch_fals:19,branch_tru:19,breakpoint:8,bring:[6,8,19],bruijn:19,brutal:16,brzozowski:[19,21],brzozowskian:5,btree:[11,17],buck:11,bug:[0,8],build:[7,8,12,13,15,20,24],built:[12,19],bullet:23,bundl:[2,3,13],burgeon:8,c:[0,1,2,3,5,7,9,11,13,15,16,17],calculu:4,call:[1,2,5,8,10,11,13,16,19,23,24],caller:[11,19],can:[0,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,19,20,21,22,24,25],cancel:16,cannot:[18,19,22],captur:8,card:8,care:[6,24],carefulli:20,carri:[7,11],cartesian:4,catamorph:21,categor:[0,21],categori:[4,16],ccc:4,ccon:[3,11,18,19,25],cell:[13,19],certain:[8,24],certainli:11,cf:[7,9,12,13],chain:[3,16],chang:[2,10,11,15,19,20],charact:[5,20],chat:8,chatter:[0,19],check:[0,7,9,19,21],child:17,choic:[3,13],choos:10,chop:12,chose:5,cinf:11,circl:5,circuit:[4,15],cite_not:11,classmethod:[],claus:[3,19],clean:19,clear:[3,6,8],clear_stuff:11,cleav:[8,12,14],client:24,close:[0,1,4],clunki:[6,19],clv:16,cmp:[3,17,21],cmp_:3,code:[1,4,5,12,13,16,19,21,25],codireco:[7,9,15],collaps:13,collect:[4,5,7,8,19],combin:[0,3,6,7,8,9,12,15,16,17,20,21,23,25],combinatorjoytyp:19,come:[8,11,19],command:[8,11,19],comment:16,common:[2,6,16],compar:[3,4,5,15,19],comparison:[0,11],compat:16,compel:4,compil:[2,3,4,5,8,11,14,16,21,25],complement:5,complet:4,complex:[3,16,19,20,25],complic:19,compos:[5,25],composit:19,compostit:19,compound:11,comput:[2,4,5,6,8,12,15,16,19,25],con:[3,5,6,7,8,9,11,12,13,15,16,17,20,24,25],conal:[4,16],concat:[3,7,8,16,17,19,24],concat_:3,concaten:[0,5],concatin:[0,3,5,24],concern:16,conclus:21,concurr:2,cond:[3,11],condit:[3,8],condition:15,confer:19,conflict:[11,19],consecut:21,consid:[5,6,7,11,13,17,19,20],consist:[2,7,8,16,17],constant:11,constitu:13,constraint:15,construct:[0,15,16,19],consum:[15,16,19],contain:[0,2,3,5,7,8,13,15,19,22],content:19,context:2,conting:11,continu:[0,5,13,19,20],control:8,conveni:[4,16,19],convent:16,convers:19,convert:[13,14,17,19,22,24],cool:11,coordin:[0,15],copi:[2,3,6,11,13,15,16,17,18,21],copyright:8,correspond:[4,16],could:[2,4,5,6,8,10,11,16,19,20],couldn:16,count:[3,19],counter:[6,19],coupl:17,cours:[6,11,19],cout:15,cover:19,cp:8,cpu:16,crack:11,crash:11,creat:[0,2,3,6,9,11,16,19],creativ:19,crude:[11,19,22],cruft:19,curent:25,current:[2,3,8,13,15,16,17,19,20,23,25],curri:5,custom:10,cycl:[6,7],cython:8,d010101:5,d0101:5,d01:5,d0:5,d10:5,d1:5,d:[2,3,5,11,13,14,16,17,18,19,20],d_compact:5,dai:8,data:[2,3,5,13],datastructur:[0,2,13,19,21,22,24],datatyp:24,ddididi:20,de:[19,20],deal:[0,5,11,16],dealt:19,debugg:19,decid:11,declar:19,decor:3,decoupl:13,decrement:[0,3],deduc:[6,19],deeper:0,deepli:4,def:[3,5,8,13,14,19,24],defaultdict:[5,19],defi:[],defin:[2,4,5,6,7,8,9,10,12,13,14,15,16,19,20,21],definit:[0,2,3,6,7,8,10,11,13,15,17,19,21,25],definitionwrapp:[11,13,17],defint:16,del:18,deleg:8,delet:21,deliber:19,demo:19,demonstr:4,depend:[3,11,13,16],deposit:17,depth:[19,25],dequot:13,der:11,deriv:[2,3,6,8,9,11,19,21],derv:5,describ:[4,5,11,13,16,17,19,22],descript:[6,8],descriptor:19,design:[2,3,11,16,21],desir:[8,17],destin:5,destruct:11,detail:[8,11,19],detect:[5,7,11,13,19],determin:21,develop:[0,7,8,19,21],diagram:6,dialect:1,dict:[1,3,5,19,23],dictionari:[0,1,3,8,19,21,23],did:19,differ:[0,4,6,9,11,12,13,16,24],differenti:4,difficult:19,difficulti:16,dig:[11,20],digit:6,digraph:5,dinfrirst:[8,15,19,25],dip:[0,3,6,7,8,9,11,12,13,14,15,16,17,19,21,25],dipd:[3,7,8,11,12,13,15,16,19,20,25],dipdd:[3,11],direco:21,direct:8,directli:[6,16,17,19,24],disappear:[2,5,19],discard:[3,7,9,11,13],disciplin:11,disenstacken:[3,8],disk:8,displac:2,displai:19,distiguish:19,distribut:16,ditch:11,div:[3,8,19,25],dive:17,divis:[11,19],divmod:[3,25],divmod_:[3,19],dnd:24,doc:[2,3,8,19],doc_from_stack_effect:18,docstr:19,document:[19,21,22,24],doe:[0,1,3,4,5,7,8,14,16,19,21,23,25],doesn:[6,10,11,15,16,17,19,24],domain:[4,19],don:[5,6,8,11,19],done:[2,6,8,10,19],dooooc:19,door:8,dot:[5,23],doubl:[5,6,8,19],doublecircl:5,down:[2,5,9,13,20,25],down_to_zero:8,dozen:8,dr:5,draft:[4,10],drag:24,dream:8,drive:[7,9],driven:6,driver:[5,7],drop:[3,11,24],ds:5,dudipd:8,due:19,dup:[3,6,7,8,9,11,12,13,15,16,18,20,24,25],dupd:[3,19,25],dupdd:[3,25],dupdip:[3,6,11,12,13,15],duplic:[3,11,13],durat:2,dure:[2,13],e:[2,3,5,7,8,10,11,14,16,18,19,20,23,24],each:[2,3,4,5,6,8,13,14,15,16,17,19,23,25],easi:[0,11,15,17,19,20],easier:[3,11,16],easili:4,eat:5,edit:21,ee:[11,19],effect:[2,3,5,8,16,20,21,25],effici:[7,14,20],efg:19,eh:19,either:[1,2,3,5,11,13,19],el:24,elabor:19,eleg:[0,5,8,11,16,21],element:[2,3],elif:19,elimin:[5,19],elliott:[4,16],els:[2,3,5,13,15,16,19],else_:19,embed:[4,11,20],emit:19,empti:[3,5,8,17,19,24,25],en:11,encapsul:8,enclos:8,encod:7,encount:19,end:[5,6,11,13,17,19,24],endless:7,enforc:[2,8],engend:8,enough:[5,8,13,23,25],enstacken:[7,8,19],enter:8,enter_guard:19,entir:24,entri:[3,20,23],enumer:19,epsilon:9,eq:[2,3,25],equal:[3,6,17,24],equat:[8,9],equival:16,er:[0,8],ergo:[5,11],err:[11,18],error:[8,19,22],essai:0,establish:19,et:[16,19],etc:[3,17,19,20,22],euler:21,euro:19,eval:[0,19],evalu:[1,2,3,8,9,11,12,13,14,16,17,19,23],event:16,eventu:[16,19],ever:19,everi:[1,7,16],everybodi:16,everyth:[3,5,11,12,16,19],evolv:10,examin:13,exampl:[3,5,6,19,21,22,24,25],exce:7,except:[1,5,8,11,18,19,22],execut:[0,1,2,3,8,13,14,16,17,19,20,24,25],exend:19,exercis:[5,11],exist:[4,11,19],expand:11,expect:[2,3,16,17,19,24],experi:[8,17],explain:19,explan:8,explor:[8,19],express:[0,1,2,3,4,11,13,14,15,19,20,21,23,24],expression_to_str:[19,24],extend:19,extra:[1,6,7],extract:[11,12,21],extrem:8,extrememli:8,f0:19,f1:[18,19,25],f2:[18,19,25],f3:[19,25],f:[2,3,5,6,7,9,13,15,16,19],f_g:19,f_in:19,f_out:19,f_python:19,facet:0,facil:8,fact:22,factor:[2,6,8,11,15,19],factori:[3,21],fail:[2,3,11,21,22],fail_fail:[],fairli:19,fake:5,fall:19,fals:[2,3,5,6,13,15,16,19],falsei:19,familiar:[0,15],far:[9,11,13,19,25],fascin:0,favorit:16,fear:[11,19],few:[6,8,9,12,16,19],fewer:[3,8],fg:19,fg_in:19,fg_out:19,fi:[18,19],fib:7,fib_gen:7,fibonacci:21,figur:[2,3,11,13,19],file:15,filter:11,fin:6,find:[2,3,5,6,7,16,17,19,21,25],finder:9,fine:[0,5,6,11,19,25],finite_state_machin:5,first:[3,5,7,8,9,11,12,13,14,17,20,21,24,25],first_two:[3,11,25],fit:[6,8],five:[6,8,21],fix:[2,3,5,13,19],fixm:[5,19],flag:[16,19],flatten:[8,17,19],flesh:5,flexibl:21,floatjoytyp:19,floatstarjoytyp:19,floor:3,floordiv:[3,6,25],flow:8,fn:19,fo:[18,19],follow:[0,2,3,5,8,10,13,16,17,19,20],foo:[8,10,11,16,19],foo_ii:10,fork:16,form:[2,3,4,5,6,7,13,17,19,21,24],forman:8,format:[18,19,21,23],formula:[0,6,21],forth:[8,19],forum:0,forward:19,found:8,four:[0,2,3,6,7,8,11,15,21],fourteen:6,fourth:[2,3,11,13,25],fr:5,frac:[9,12],fractal:8,fraction0:8,fraction:[2,8],frame:13,framework:8,free:[4,8,11],freeli:2,from:[0,1,2,3,5,6,7,8,9,11,12,14,15,16,17,18,19,20,21,24],from_:5,from_index:24,front:[2,3,13],frozenset:5,fulin:16,full:6,fun:[5,21],func:19,functionjoytyp:19,functionwrapp:3,functool:5,fundament:[0,21],funtion:11,further:[9,19,21],futur:16,g:[2,3,5,7,8,9,10,11,13,14,16,18,19,20,23,24],g_in:19,g_out:19,garbag:8,gari:11,gcd2:3,gcd:[3,8],ge:[2,3,25],gener:[0,2,4,16,19,21,24,25],generated_librari:3,genrec:[3,8,11,13,16,17,19],geometr:6,get:[2,4,5,6,7,8,12,13,19,21],getch:5,getitem:3,getrecursionlimit:24,getsourc:8,ghc:4,gi:19,give:[4,6,11,13,15,17,19,24],given:[2,3,6,7,9,11,15,16,19,20,21,24],global:[18,19],glue:8,go:[5,6,11,12,13,15,16,17,19,20,23],goe:25,good:[6,11,19],grab:[3,19],grammar:22,grand:8,graph:[5,16],graphic:5,graphviz:5,great:[0,8,19,21],greater:24,grind:19,group:0,grow:5,gsra:9,gt:[2,3,25],guard:[11,19],h:[5,13,19],ha:[0,2,3,5,7,8,9,10,11,13,16,19,20,24],had:[5,6,20],haiku:8,half:[6,19,20],hallmark:16,hand:[5,8,14,19,21],handi:[9,19],handl:[11,19,24,25],happen:[8,19],happi:5,hard:[5,19,20],hardwar:4,hasattr:19,hash:19,haskel:4,have:[2,3,5,6,7,8,9,10,13,14,15,16,19,20,21,24,25],he:[4,9],head:24,heh:19,help:[0,3,8,11,13,15,19],help_:3,helper:5,herd:8,here:[0,5,6,7,11,15,17,19,20,25],hg:25,hide:11,hierarchi:19,higher:[5,8,11,19],highli:8,hij:5,histori:[19,23],hit:5,hmm:[5,11],hoist:3,hold:[6,19],hood:11,hope:[0,6,8,21],hopefulli:13,host:21,how:[0,4,5,9,11,13,15,19,20,21],howev:[13,14,16,19],html:[2,3,7,12,13,21],http:[11,25],huet:20,huge:11,hugh:[9,17],human:8,hybrid:[15,25],hylomorph:21,hypothet:2,i0:19,i1:[18,19,25],i2:[18,19,25],i3:[19,25],i:[0,3,6,7,8,9,13,14,15,16,17,20,21,23,25],id:[3,19],id_:3,idea:[4,6,8,19],ident:[3,5,13,19,25],if_not_empti:11,ift:[0,3,11,13,15,17,19,25],ignor:[1,3,11,19],ii:[0,3,15,21],iii:21,illustr:[5,13],imagin:[5,16,20],imap:19,imit:[5,17],immedi:[5,13],immut:[5,8,11],imper:13,implement:[0,1,2,4,8,10,11,13,14,16,21,25],implementaion:16,implicit:8,improv:19,includ:[4,11,16,17,19,25],inclus:6,incom:24,incompat:10,incorpor:12,increas:6,increment:[0,3,4,6,10,16],index:[0,8,19,24],indexerror:24,indic:[16,17,19,24,25],ineffici:19,infer:[0,18],inferenc:25,info:[18,19],inform:[3,5,19,25],infra:[3,7,8,11,12,14,15,16,17,19,21,25],infrastructur:3,initi:[2,3,5,8,9,11,19],inlin:11,inner:19,inproceed:19,input:[1,9,16,18,19],input_:5,inscrib:3,inscribe_:3,insert:[19,24],insight:13,inspect:8,inspect_stack:19,instal:0,instanc:19,instanti:[4,23],instead:[5,6,7,11,13,15,19,20,24,25],instruct:5,integ:[0,2,3,8,15,17,19,22],integr:3,intend:[0,8],interact:[8,21],interest:[0,6,11,19,21],interfer:16,interlud:21,intermedi:13,intern:[0,19,23,24],interp:1,interpret:[0,4,10,14,22,23,25],interrupt:8,intersect:5,interspers:16,interv:[4,6],intjoytyp:19,introduc:10,introduct:0,intstarjoytyp:19,intuit:19,invari:3,invent:19,involv:19,ipf:8,ipython:19,isinst:[5,19],isn:[3,5,11,20],issubclass:19,item:[2,3,8,11,13,16,17,19,21,24],iter:[1,3,5,8,13,16,17,19,21,24],iter_stack:[14,24],iteritem:[5,19],itertool:[5,19],its:[0,1,2,3,4,6,8,11,13,15,16,17,19,24],itself:[0,2,8,11,16,19],iv:21,j05cmp:[2,3,13],j:[2,5,6,7,9,11,12,13,14,15,17,19,20],jaanu:19,jmp:5,job:[16,21],john:[9,17],joi:[2,4,10,11,12,14,16,18],join:[5,19],joypi:[20,25],joytypeerror:18,jp:[7,12],js:8,jump:5,jump_from:5,junk:19,jupyt:21,just:[0,2,3,5,7,8,10,11,13,15,16,17,19,20,23],juxtaposit:16,k:[6,11,17,19],keep:[5,11,12,16,19,20],kei:[5,17,21],kevin:0,key_n:11,keyerror:[5,11,19],kind:[0,2,4,8,11,13,15,17,19,25],kinda:19,kleen:[17,19],kleenestar:19,kleffner:19,know:[6,11,19],knowledg:19,known:[4,16],kstar:5,l:[3,5,11,19],l_kei:11,l_left:11,l_right:11,l_valu:11,la:0,label:[5,19],lambda:[4,5,19],languag:[3,4,5,8,10,11,14,19],larg:[5,19],larger:[21,24],largest:3,last:[6,11,13,19],lastli:7,later:[5,8,15,17,19],law:2,layout:[0,15],lazi:19,lazili:9,lcm:6,le:[2,3,25],lead:[5,8,19],leaf:11,lean:8,learn:0,least:[2,6,13,19,24],least_fract:8,leav:[3,6,15,16],left:[5,8,12,13,16,17,19,20,23,24],leftov:13,legend:5,legibl:[0,15],len:[5,19],length:[3,6,24],lens:13,less:[6,7,8,13,19,24],let:[7,9,11,12,13,15,17,19,20,21],letter:19,level:[4,5,11,18,19],librari:[0,5,14],like:[0,2,3,5,6,8,15,16,17,19,21,22,23,25],limit:[19,25],line:[8,11,12,19,23,25],linear:24,link:[0,5,19],linux:0,list:[0,3,5,6,8,9,11,16,17,19,20,23],list_to_stack:[19,24],liter:[1,11,17,19,20,22],literatur:19,littl:[0,5,7,11,15,16,19,21],live:21,lk:17,lkei:17,ll:[5,6,7,8,13,15,17,19,20],load:[6,8],local:19,locat:2,locu:23,log:[18,19],log_2:11,logic:[0,6,15,21],longer:[11,19],look:[1,5,7,8,9,11,12,15,16,19],lookup:8,loop:[0,1,3,5,6,19,21,25],lose:19,lot:[5,8,11,19,20],love:6,low:[4,5],lower:6,lowercas:[5,19],lowest:11,lr:5,lshift:[3,25],lt:[2,3,25],m:[0,5,6,8,11,15,16,17,19],machin:[0,21],machineri:[11,19],macro:8,made:[0,8,16,19,20],magic:19,mai:[2,13,16,25],mail:0,main:[0,3,8,12,15,16,19,20],mainloop:10,maintain:20,major:10,make:[2,3,4,6,8,11,13,14,15,16,17,19,20,21],make_gener:[9,15],make_graph:5,manfr:[0,2,3,4,13],mani:[0,5,8,19],manipul:19,manner:12,map:[1,3,5,6,8,10,13,17,19,23],map_:3,marker:8,mask:[6,7,15],match:[0,1,19,21],materi:0,math:[0,8,9,11,12,19],mathemat:8,matter:[6,9,11,17],max:3,max_:3,maximum:3,mayb:[11,19],mc:19,me:[8,17,19],mean:[4,6,8,9,11,13,17,19,24],meant:[8,11,13,17,24],mem:5,member:[2,3,13],memo:5,mental:8,mention:2,mercuri:[],mess:19,messag:[18,19],meta:[8,11,14],meta_compos:19,method:[0,8,19,21,23],midpoint:6,might:[0,4,5,7,11,15,19],mike:11,million:7,min:3,min_:3,mind:19,minimum:3,minor:11,minu:3,mirror:0,miscellan:0,mismatch:19,mix:[8,19],mod:3,mode:19,model:[4,8],modern:0,modif:[7,19],modifi:[8,11,20],modul:[0,1,3,8,19,22],modulo:19,modulu:[3,8,25],moment:19,month:8,more:[0,3,4,5,6,7,8,9,13,14,16,17,19,22,24,25],most:[5,19,25],mostli:0,move:[5,11],movement:2,ms:21,much:[5,6,7,11,13,19,24],muck:11,mul:[3,8,12,18,20,23,25],multi:[],multipl:[21,25],multipli:3,must:[2,3,6,10,13,16,17,19,22],my:[0,6,8,16],myself:19,n0:19,n10001:19,n10002:19,n10003:19,n1001:19,n1002:19,n1003:19,n1:[19,25],n2:[19,25],n3:[19,25],n4:[19,25],n:[2,3,5,6,8,9,11,14,15,17,19,20,24],name:[1,3,5,8,10,11,13,19,20,21,22,23,24,25],narr:19,natur:[5,6,7,11,19],navig:20,ne:[3,25],nearli:19,neat:11,neato:19,necessarili:19,need:[2,3,6,7,9,10,11,13,15,16,19],neg:[3,12,25],neither:[16,19],ness:5,nest:[3,8,11,20],net:25,network:8,never:[5,10,13],new_def:19,new_f:19,new_fo:19,new_kei:11,new_valu:11,newton:[0,21],next:[0,5,6,15,16,17,19,25],nice:[0,5,13,24],niether:2,nk:6,nm:5,node:[5,17,21],node_kei:11,node_valu:11,non:[5,17,19],none:[1,19],nope:17,nor:5,normal:16,not_:3,notat:[0,8,11,15],note:[2,5,6,9,11,13,16,19,24],notebook:[6,7,8,19,20,21],notebook_preambl:[2,6,7,9,11,12,13,14,15,17,19,20],noth:[2,11,16],notic:6,now:[3,5,6,7,8,13,14,17,19,21],ns:19,nth:[3,24],nullari:[8,11,15,16,19,25],number:[0,1,2,3,6,7,9,15,16,24,25],numberjoytyp:19,numberstarjoytyp:19,numer:19,o:[5,7,11,19],object:[5,19,22],observ:6,obviou:7,obvious:19,occur:11,odd:[6,7],off:[2,3,6,7,12,15,19,20],often:[5,16],oh:11,ok:19,old:[0,2,14],old_k:11,old_kei:11,old_valu:11,omg:[],omit:[13,19,22],onc:[3,5,10,11],one:[0,2,3,5,6,7,11,13,15,16,17,19,23,24,25],ones:[5,7,19],onli:[2,3,5,6,11,13,15,16,19,20,24],onto:[1,2,3,8,13,24],open:[8,19],oper:[0,3,5,8,11,13,21,24],oppos:19,optim:11,option:[1,8,11,19,24],or_:3,orchestr:16,order:[0,2,3,8,13,16,18,19,21,24],org:[0,11],origin:[0,1,2,3,11,20,21],osdn:25,other:[0,2,3,4,5,8,11,13,15,17,19,24],otherwis:[3,5,6,7,11,17,19],our:[5,6,7,8,9,13,15,17,19],out:[2,3,4,6,7,8,9,11,12,13,15,16,19,20,21],outcom:17,outlin:5,output:[1,5,9,13,16,18,19,25],outsid:4,over:[3,4,6,7,8,9,11,12,16,17,19,21,25],overhaul:19,overview:[3,19],own:[11,19],p:[2,3,6,11,13,16],pack:24,packag:[0,8],page:[0,11,19,24],pair:[0,2,3,6,7,11,15,19],palidrom:6,palindrom:6,pam:8,paper:[4,8,13,16,20],paradigm:21,parallel:[2,21],param:1,paramet:[1,2,3,13,14,22,23,24],parameter:21,paramorph:13,parenthes:[11,24],pariti:7,pars:[0,3,5,8],parse_definit:[],parseerror:22,parser:[0,18,19],part:[2,3,9,13,17,21],partial:[5,19],particular:20,pass:[0,5,11,19,23],patch:5,path:[5,15,19,21],pattern:[5,6,16,17,21],pe1:[6,7],pe2:7,pearl:20,pend:[3,8,13,19,20,23],peopl:21,per:[8,17],perfectli:16,perform:[5,16,19],perhap:7,period:8,permit:[16,19,24],permut:19,persist:11,phase:2,phi:5,phrase:15,pick:[3,6,7,16,24],pickl:8,pictur:11,piec:[13,21],pip:0,place:[3,6,8,19],plai:0,plu:3,plug:[7,13,17],pm:[3,12,19,25],point:[4,5,8,11,13,15,16],pointless:2,pool:16,pop:[0,3,5,6,7,8,11,13,14,15,17,18,24,25],popd:[3,8,9,11,14,16,19,25],popdd:[3,7,12,19,25],popop:[3,6,7,8,9,11,17,19,25],popopd:[3,25],popopdd:[3,25],posit:[3,6,8,13],possibilit:11,possibl:[11,17,19,21],post:8,poswrd:19,potenti:16,pow:[3,25],power:[8,19],pprint:5,pragmat:6,preambl:9,preceed:16,precis:[0,1],pred:[3,19,25],predecessor:3,predic:[2,3,5,7,13,16],prefix:[19,23],preliminari:5,present:19,preserv:[4,17],pretti:[9,11,12,16,17,19,23,24],pretty_print:0,previou:[8,16],prime:9,primit:[2,3,19,21],primrec:[3,7,8,13],print:[0,1,2,3,5,18,19,23,24],probabl:[7,8,11,19],problem:[8,15,19,21],proc_curr:11,proc_left:11,proc_right:11,proce:[6,25],process:[5,8,17,19,23],produc:[3,6,11,13,17,19],product:[5,7,8,18,19],program:[0,2,3,7,8,9,11,13,15,16,19,20],programm:[16,19],progress:16,project:[21,25],prolog:19,promis:16,prompt:8,proper:[2,3,13,16,25],properti:0,provid:[0,4,8,16,19,25],pseudo:15,pun:[0,8],punctuat:19,pure:[0,5],puriti:8,purpos:8,push:[2,3,8,13,20,24],put:[1,2,7,8,16,19,21,24],pypi:0,python3:8,python:[0,2,3,5,11,13,16,20,21,22,24,25],q:[2,3,11,13,16,19,20],quadrat:[0,21],quasi:15,queri:[11,17],query_kei:17,queu:13,quit:[0,17],quot:[0,3,7,8,11,12,13,15,16,17,19,20,23],quotat:[2,3,13],quotient:3,r0:[9,11,17],r1:[2,3,9,11,13,17],r2:[2,3,13],r:[2,3,5,11,13,19],r_kei:11,r_left:11,r_right:11,r_valu:11,rais:[5,11,19,22,24],rang:[5,8,19],range_revers:13,range_to_zero:8,ranger:13,ranger_revers:13,rankdir:5,raphson:9,rather:[6,8,13,15,17],ratio:8,re:[0,6,7,8,9,14,15,19,21,22],reach:[5,6,7,13],read:[0,1,6,7,11,19,20],readabl:14,reader:[5,11],readi:19,readm:15,real:11,realiz:[4,11,15],rearrang:[2,11,19,24],reason:[6,8,16,19],rebuild:[17,20],rec1:[2,3,13],rec2:[2,3,13],recent:19,recogn:22,recombin:16,record:[8,23],recur:[3,13,19],recurs:[0,2,3,5,7,8,9,16,19,21,24],recus:8,redefin:21,redistribut:[3,8],redo:5,reduc:[2,19],redund:24,refactor:[8,10],refer:[0,2],referenti:16,reflect:16,regard:16,region:15,regist:2,regular:[19,21,22],reifi:18,reimplement:[16,21],rel:24,relat:[5,19],releas:10,rem:3,remain:[2,8,10,19],remaind:[3,9],rememb:5,remind:19,remot:24,remov:[3,11,19,24,25],render:21,repeat:6,repeatedli:6,repetit:5,repl:[0,1],replac:[0,2,3,7,12,13,16,17,19,20,21,24],repositori:0,repr:[5,19],repres:[2,8,11,16,22,23],represent:24,reprod:7,repurpos:19,requir:[15,16,19,24],research:19,resembl:8,resolut:16,resourc:16,respect:[5,6,16],rest:[3,6,7,8,11,13,15,20,21,24,25],rest_two:11,restart:[],restor:2,result:[1,2,3,5,6,11,12,13,16,17,19,20],resum:8,retir:2,retri:8,reus:[11,19,24],revers:[3,6,7,13,19,20,21,24],revisit:19,rewrit:[3,8,15,19],rewritten:8,rid:11,right:[7,8,12,17,19,21,23,24],rightest:11,rightmost:6,rigor:16,risk:19,rk:17,rkei:17,rob:19,roll:[3,9,11,17],roll_dn:19,rolldown:[3,18,19,25],rollup:[3,19,25],root:[3,9,12],rough:15,round:[3,19],row:5,rrest:[3,18,19,25],rshift:[3,25],rtype:1,rule:[16,21],run:[0,1,3,6,8,9,11,12,13,15,16,17,19,20],runtim:16,runtimeerror:24,s0:19,s1:[18,19,25],s2:[18,19],s3:19,s4:19,s5:19,s:[0,1,2,3,4,7,8,10,12,13,14,15,16,17,18,20,21,23,24,25],sai:[5,7,11,12,15,17,19],same:[2,4,6,11,16,19,24],sandwich:[2,3,13],save:[2,5,6,8],scan:[],scanner:[8,22],scenario:20,scm:25,scope:[7,11],script:1,se:19,search:[0,11],sec:19,second:[3,8,11,13,15,17,24,25],section:13,see:[0,5,7,8,9,10,12,13,14,15,19,20,23],seem:[0,6,8,15,17,19,25],seen:[19,20],select:3,self:[5,16,19],semant:[2,3,8,10,11,16,19],semi:8,send:8,sens:[0,2,6,19,20],separ:[8,16,19,22],seq:19,sequenc:[0,1,2,3,6,8,11,13,14,20,21,22,25],sequence_to_stack:19,seri:[6,7,11,15,20],set:[2,3,5,13,19,21],seven:[6,7],sever:[0,4,8,13],shape:[5,16],share:[3,8],shelf:2,shew:5,shift:[6,7],shorter:21,shorthand:11,should:[2,3,5,6,11,13,16,19],shouldn:8,show:[4,15,16,19,20],shunt:[3,20],side:[5,11,18,19,25],sign:[],signatur:25,signifi:[8,11],similar:[11,15,17,19],simon:8,simpl:[1,5,8,13,15,24,25],simplefunctionwrapp:[3,14,19],simpler:17,simplest:[19,21],simpli:4,simplifi:[6,11,20],sinc:[2,6,11,15,19],singl:[3,7,8,14,15,16,19,22,25],singleton:5,situ:11,situat:11,six:[6,7,8],sixti:[6,7],size:[5,8,21],skeptic:8,skip:19,slight:9,slightli:[11,13,19],smallest:3,smart:11,sn:19,so:[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20,25],softwar:8,solei:2,solut:[6,7],solvabl:8,some:[0,2,3,5,7,8,11,13,15,16,17,19,21,24,25],somehow:[11,19],someth:[2,10,11,19],sometim:11,somewher:[11,21],sort:[3,5,11,16,19],sort_:3,sourc:[0,1,3,19,21,22,23,24],space:[6,23],span:6,spawn:19,special:[7,11,21],specif:[0,4],specifi:[11,16],speed:14,spell:[5,17],sphinx:[21,24],spiral:[0,21],spiral_next:15,spirit:[0,1,17],split:[5,19],sqr:[3,8,9,12,20],sqrt:[3,9,19,25],squar:[0,3,9,19,21,22],square_spir:[],ss:19,stack:[0,1,3,6,7,9,11,12,13,14,15,16,17,18,20,21,22,23,25],stack_effect:19,stack_effect_com:19,stack_to_str:[18,24],stacki:19,stackjoytyp:19,stacklistbox:24,stackoverflow:15,stackstarjoytyp:19,stage:17,stai:[0,1],stand:[4,5],standard:[8,11],star:[17,19],stare:11,start:[5,6,7,8,9,11,13,17,19,25],state:[8,21],state_nam:5,statement:[3,5,15],stdout:[18,19],step:[3,6,8,11,14,19,20,21],stepper:15,still:[5,11,19],stop:11,stopiter:5,storag:[6,11],store:[6,13,19],stori:13,str:[1,5,19,22,23,24],straightforward:[5,7,9,15,19,21],stream:[6,18,19],stretch:11,string:[1,2,3,8,19,20,21,22,23,24],stringi:5,structur:[8,16,17,19,20,21,24],stuck:5,studi:5,stuff:[11,19],stuncon:[3,25],stununcon:[3,25],style:[0,4,19],sub:[3,10,16,25],subclass:8,subject:[16,20],subsequ:16,subset:[19,25],substitut:[5,11,19],subtract:6,subtyp:21,succ:[3,19,25],succe:19,success:9,suck:19,suffic:19,suffici:11,suffix:19,suggest:[4,5,11],suitabl:[1,3,4,6],sum:[3,7,8,12,13,14,17],sum_:[3,19],summand:6,sumtre:17,suppli:[11,22],support:[8,19,23,24],sure:16,suspect:2,svg:[],swaack:[3,12,14,15,19,20,25],swap:[3,6,7,8,9,11,13,14,15,16,17,18,20,25],swon:[3,7,8,13,17,19,20,25],swoncat:[7,8,9,13,17],swuncon:13,sy:[18,19,24],sym:5,symbol:[1,2,3,5,16,19,20,21,22,23],symboljoytyp:19,symmetr:[6,11,15],symmetri:[5,15],syntact:8,syntax:[8,24],system:[8,11,16],t0:3,t1:3,t:[2,3,5,6,8,10,11,13,15,16,19,20,24],tabl:[5,19],tag:[5,19,25],tail:[9,11,19,21,24],tailrec:[3,9],take:[3,5,6,8,9,11,13,15,16,19,24],talk:[8,11,19,24],target:20,tast:4,tbd:8,te:11,tear:13,technic:2,techniqu:[4,20],technolog:2,temporari:20,ten:6,term:[1,2,5,8,9,13,16,19,21,22,24,25],termin:[2,3,5,13],ternari:8,test:[2,3,13],text:[0,1,19],text_to_express:[8,18,22],textual:8,than:[0,3,5,6,7,8,9,13,16,17,19,24,25],thei:[2,5,6,7,8,11,13,15,16,19,20,22,24],them:[0,2,5,6,7,11,13,15,16,19,20,21,25],themselv:[16,19],theori:[2,3,13,16],therefor:7,thi:[0,1,2,3,4,5,6,7,8,9,12,13,15,16,17,19,20,21,22,23,24,25],thing:[2,7,11,13,16,19,20,22,24,25],think:[2,6,8,11,13,16,17,19],third:[3,7,8,11,25],thirti:6,those:[2,3,5,11,13,15,19,21,25],though:[6,16],thought:[8,16],thousand:6,thread:[2,16],three:[2,3,5,6,8,11,12,15,17,19,21],through:[1,6,8,17,19,20,24,25],thun:[2,3,4,10,13,16],thunder:8,thunk:16,time:[3,5,6,8,9,11,13,15,16,19,20],titl:19,to_check:5,to_index:24,to_set:11,todai:8,todo:[8,22],togeth:[7,8,16,19,21],token:22,toler:21,too:[5,13,19],tool:[8,19],tooo:19,top:[2,3,8,13,19,23,24],total:6,tower:19,trace:[0,8,12,13,15,20,21,24],traceback:19,traceprint:23,track:[12,19,20],tracker:0,transform:4,transit:5,translat:[4,12,19,21],trap:5,travers:[0,21],treasur:0,treat:[0,2,3,13,19,21],treatment:7,tree:[0,8,21],treegrind:21,treestep:[0,21],tri:6,triangl:16,triangular_numb:13,trick:[6,19],tricki:19,trobe:0,trove:0,truediv:25,truthi:[3,8,16,19],ts:17,tuck:[3,8,19,25],tupl:[3,5,8,19,24],turn:[2,3,5,19,21],twice:[11,13],two:[0,2,3,6,8,9,11,12,13,15,16,17,18,19,20,21,24,25],txt:[],type:[0,1,4,8,11,13,16,21,22,23,24],typeerror:19,typeless:19,typic:[2,3,12,13],u:[18,19],uh:19,ui:8,ulam:[0,15],unari:8,unarybuiltinwrapp:3,unbalanc:[11,22],unbound:25,unchang:[3,11],uncompil:19,uncon:[3,7,8,11,13,17,20,25],under:[2,3,8,11],underli:[5,16,19],underscor:19,understand:[0,11],undistinguish:11,undocu:8,unfinish:5,unfortun:24,unicod:19,unif:[19,21],unifi:18,union:5,uniqu:[3,5,11,19],unit:[3,8,13,16,25],univers:[0,8,16,19],unknownsymbolerror:1,unlik:16,unnecessari:21,unnecesssari:19,unpack:[2,3,11,24],unpair:6,unquot:[8,15,17,22],unread:[0,15],unrol:5,unstack:19,unswon:[3,25],untangl:13,until:[5,7,16],unus:6,unusu:11,unwrap:5,up:[1,2,3,6,7,8,11,13,14,15,16,19,20,24],updat:[0,18,21,25],uppercas:5,upward:16,us:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,20,21,22,24,25],usag:8,user:17,usual:[0,2,13],util:[0,3,14,18,19],uu:19,v0:25,v:[2,6,7,9,11,12,13,14,15,17,20,21],valid:19,valu:[0,1,2,3,6,8,9,12,13,14,15,16,17,19,21,22,24,25],value_n:11,valueerror:[5,19,24],variabl:[19,21],variant:11,variat:[13,16,21],varieti:[4,8],variou:0,ve:[11,15,19],vener:24,verbos:4,veri:[0,1,4,5,8,11,15,24],versa:[2,19],version:[0,1,2,5,7,10,17,20,21],vi:21,via:8,vice:[2,19],view:[11,21],viewer:[1,8,10,23],vii:21,visibl:19,von:[0,2,3,4,13],vs:19,vv:19,w:[3,11,13,17,19],wa:[2,6,8,11,15,16,19,24],waaaai:5,wai:[0,2,3,4,5,6,8,13,14,15,16,19],wait:16,want:[2,6,7,9,11,13,19],warranti:[3,8],wash:8,wast:8,we:[2,5,6,7,8,9,10,12,13,14,15,16,19,20,21,24],web:24,websit:[0,6],welcom:8,well:[0,4,8,9,11,19,22],went:19,were:[8,19,20],what:[2,3,4,5,8,11,13,16,17,19,23],whatev:[2,3,13,17,24],when:[6,7,8,11,13,16,19,20,22,24,25],where:[2,3,5,8,11,13,15,19,21,24],whether:[3,13],which:[0,1,3,5,6,8,9,11,15,16,17,19,20,22,24,25],whole:[2,3,6,13,17,19],whose:7,why:[9,16,17],wiki:11,wikipedia:[0,11,20],wildli:8,wind:8,wire:13,within:[8,11,14,21],without:[2,8,11,12,15,16,19],won:[11,19,24],word:[0,3,6,8,13,20],work:[0,3,5,6,7,8,9,11,12,13,15,16,17,20,21,24,25],worker:16,worri:16,worth:6,would:[2,6,7,8,9,11,13,16,19,20,24],wrap:[3,8],wrapper:19,write:[4,5,9,11,13,15,16,17,19,20,21,24],written:[0,1,9,11,14,19,24],wrong:2,wrote:19,x:[0,3,5,6,8,9,16,20,21],xor:3,xrang:19,y:[2,3,5,15,16],yang:19,yeah:16,year:[8,19],yet:[11,16,19,20],yield:[2,3,13,19,24],yin:21,you:[0,2,3,5,6,7,8,10,11,12,13,14,15,16,17,19,20,23,24,25],your:[2,3,8,13,19],yourself:[5,8,11],z:[3,5,16,19,21],zero:[3,5,11,13,16,17,19,22,24],zerodivisionerror:19,zip:[3,5,6,19],zip_:3,zipper:[0,21],zstr:20},titles:["Thun 0.4.1 Documentation","Joy Interpreter","Functions Grouped by, er, Function with Examples","Function Reference","Categorical Programming","\u2202RE","Developing a Program in Joy","Using x to Generate Values","Thun: Joy in Python","Newton\u2019s method","No Updates","Treating Trees I: Ordered Binary Trees","Quadratic formula","Recursion Combinators","Replacing Functions in the Dictionary","Square Spiral Example Joy Code","The Four Fundamental Operations of Definite Action","Treating Trees II: treestep","Type Checking","The Blissful Elegance of Typing Joy","Traversing Datastructures with Zippers","Essays about Programming in Joy","Parsing Text into Joy Expressions","Tracing Joy Execution","Stack or Quote or Sequence or List\u2026","Type Inference of Joy Expressions"],titleterms:{"0":[0,13],"01":5,"1":[0,13],"11":5,"111":5,"2":[7,12,19],"2a":12,"3":[6,19],"4":[0,12,19],"466":7,"5":6,"\u03bb":5,"\u03d5":5,"boolean":15,"case":[9,11],"do":17,"function":[2,3,5,8,9,11,13,14,16,17,19],"long":14,"new":11,"p\u00f6ial":19,"try":5,"void":2,"while":[2,16],A:[5,6,7,9,11,14],If:11,In:[11,17],No:[5,10],Not:15,One:[7,11],The:[6,8,11,13,15,16,17,19],There:8,With:[5,17],about:21,action:16,ad:11,add:[2,11],address:20,al:13,alphabet:5,altern:17,an:[6,7,8,11,13,18,19,20],ana:13,analysi:6,anamorph:[2,13],app1:2,app2:2,app3:2,appendix:[11,13,19],appli:16,approxim:9,ar:11,argument:19,auto:3,averag:2,b:[2,12],base:[9,11],binari:[2,11,17],bliss:19,both:11,branch:[2,11,15,16],brzozowski:5,c:[12,19],can:11,cata:13,catamorph:13,categor:4,chatter:2,check:18,child:11,choic:2,clear:2,cleav:[2,16],cmp:11,code:[0,8,11,15],combin:[2,11,13,19],comment:19,compact:5,compar:11,comparison:2,compil:[7,19],compile_:19,compos:19,comput:9,con:[2,19],concat:2,conclus:[13,15,19],consecut:9,continu:8,current:11,datastructur:[5,8,11,20],deal:19,decrement:15,defin:[11,17],definit:[12,16],delabel:19,delet:11,deriv:[5,12,13,17],design:13,determin:20,develop:6,diagram:5,dialect:0,dictionari:14,dip:[2,20],dipd:2,dipdd:2,direco:7,disenstacken:2,distinguish:19,div:2,doc_from_stack_effect:19,document:0,doe:11,down_to_zero:2,drive:5,drop:2,dup:[2,19],dupd:2,dupdip:2,e:17,effect:19,eleg:19,els:11,empti:11,enstacken:2,equal:11,er:2,essai:21,et:13,euler:[6,7],eval:8,even:7,exampl:[0,2,8,11,13,15,17,18],execut:23,explor:5,express:[5,8,22,25],extract:17,f:11,factori:13,fail:18,fibonacci:7,filter:6,find:[9,11,13],finish:16,finit:5,first:[2,6,15,16,19],five:7,flatten:2,flexibl:17,floordiv:2,form:15,formula:12,found:11,four:[13,16],from:13,fsm:5,fulmin:16,fun:13,fundament:16,further:6,gcd:2,gener:[3,5,6,7,9,13,15],genrec:2,get:[11,17],getitem:2,given:[13,17],greater:11,group:2,h1:13,h2:13,h3:13,h4:13,handl:16,have:[11,17],help:2,highest:11,host:0,how:[6,7],hybrid:19,hylo:13,hylomorph:13,i:[2,5,11,19],identifi:19,ift:[2,16],ii:[17,19],iii:19,implement:[5,19],increment:15,indic:0,infer:[19,25],inferenc:19,inform:0,infra:[2,20],integ:[6,13],interest:7,interlud:11,intern:22,interpret:[1,8,19],item:20,iter:[6,11],iv:19,joi:[0,1,3,6,8,13,15,19,20,21,22,23,24,25],join:16,just:6,kei:11,kind:16,languag:0,larger:5,least_fract:2,left:11,less:11,let:[5,6],letter:5,librari:[3,8,19],like:11,list:[2,13,24],literari:8,littl:6,logic:[2,19],loop:[2,8,16],lower:11,lshift:2,machin:5,make:[7,9],mani:6,map:[2,16],match:5,math:2,memoiz:5,method:9,min:2,miscellan:2,mod:2,modifi:19,modulu:2,more:11,most:11,mul:[2,19],multipl:[6,7,19],must:11,n:13,name:12,ne:2,neg:[2,15],newton:9,next:9,node:11,non:11,now:11,nullari:2,nulli:5,number:[13,19],one:8,onli:8,oper:16,order:[11,17],origin:15,osdn:0,other:16,our:11,out:5,over:2,p:17,pack:6,pam:[2,16],para:13,paradigm:19,parallel:16,parameter:[11,17],pars:[2,22],parser:[8,22],part:19,pass:8,path:20,pattern:13,per:11,piec:15,pop:[2,19],popd:2,popop:2,pow:2,power:7,pred:2,predic:[6,9,11,15,17],pretty_print:23,primit:13,primrec:2,print:8,problem:[6,7],process:11,product:2,program:[4,6,12,17,21],progress:19,project:[0,6,7],pure:8,put:[11,12,15,17],python:[8,14,19],quadrat:12,quick:0,quot:[2,24],rang:[2,6,13],range_to_zero:2,re:[5,11],read:8,recur:[9,11],recurs:[11,13,17],redefin:[11,17],refactor:[6,11],refer:3,regular:[5,8],reimplement:17,relabel:19,rem:2,remaind:2,remov:2,render:6,repl:8,replac:[11,14],repres:[5,19],represent:5,reset:7,rest:[2,19],revers:[2,5,18],right:[11,20],rightmost:11,roll:[2,19],rolldown:2,rollup:2,rshift:2,rule:[5,19],run:[2,7],s:[5,6,9,11,19],second:[2,19],select:2,sequenc:[7,16,19,24],set:[9,11],shorter:14,should:8,shunt:2,simpl:19,simplest:6,size:[2,14],sourc:11,special:[13,19],spiral:15,sqr:[2,19],sqrt:[2,12],squar:15,stack:[2,8,19,24],start:0,state:5,step:[2,13,17],straightforward:12,stream:5,string:5,structur:11,style:8,sub:[2,11],subtyp:19,succ:2,sum:[2,6],swaack:2,swap:[2,19],swon:2,swoncat:2,symbol:[8,13],t:17,tabl:0,tail:13,take:2,term:[6,7,17],ternari:2,text:22,than:11,them:12,thi:11,third:[2,19],three:7,thun:[0,8],time:[2,7],togeth:[11,12,15,17],token:8,toler:9,trace:[14,23],traceprint:8,trampolin:5,translat:15,travers:[11,17,20],treat:[11,17],tree:[11,17,20],treegrind:17,treestep:17,triangular:13,truediv:2,truthi:2,tuck:2,turn:15,two:[5,7],type:[18,19,25],unari:2,unbound:19,uncon:[2,19],unif:18,unifi:19,unit:2,unnecessari:6,unquot:2,unstack:2,up:9,updat:[10,19],us:[7,19],util:[23,24,25],v:19,valu:[7,11],variabl:12,variat:7,version:[6,11,14,19],vi:19,view:8,vii:19,we:[11,17],which:13,within:9,word:2,work:[18,19],write:12,x:[2,7,15],xor:2,yin:19,z:20,zero:7,zip:2,zipper:20}}) \ No newline at end of file +Search.setIndex({docnames:["index","joy","lib","library","notebooks/Categorical","notebooks/Derivatives_of_Regular_Expressions","notebooks/Developing","notebooks/Generator_Programs","notebooks/Intro","notebooks/Newton-Raphson","notebooks/NoUpdates","notebooks/Ordered_Binary_Trees","notebooks/Quadratic","notebooks/Recursion_Combinators","notebooks/Replacing","notebooks/Square_Spiral","notebooks/The_Four_Operations","notebooks/Treestep","notebooks/TypeChecking","notebooks/Types","notebooks/Zipper","notebooks/index","parser","pretty","stack","types"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["index.rst","joy.rst","lib.rst","library.rst","notebooks/Categorical.rst","notebooks/Derivatives_of_Regular_Expressions.rst","notebooks/Developing.rst","notebooks/Generator_Programs.rst","notebooks/Intro.rst","notebooks/Newton-Raphson.rst","notebooks/NoUpdates.rst","notebooks/Ordered_Binary_Trees.rst","notebooks/Quadratic.rst","notebooks/Recursion_Combinators.rst","notebooks/Replacing.rst","notebooks/Square_Spiral.rst","notebooks/The_Four_Operations.rst","notebooks/Treestep.rst","notebooks/TypeChecking.rst","notebooks/Types.rst","notebooks/Zipper.rst","notebooks/index.rst","parser.rst","pretty.rst","stack.rst","types.rst"],objects:{"joy.joy":[[1,1,1,"","UnknownSymbolError"],[1,2,1,"","interp"],[1,2,1,"","joy"],[1,2,1,"","repl"],[1,2,1,"","run"]],"joy.library":[[3,2,1,"","BinaryBuiltinWrapper"],[3,3,1,"","Def"],[3,2,1,"","FunctionWrapper"],[3,2,1,"","SimpleFunctionWrapper"],[3,2,1,"","UnaryBuiltinWrapper"],[3,2,1,"","add_aliases"],[3,2,1,"","app1"],[3,2,1,"","app2"],[3,2,1,"","app3"],[3,2,1,"","b"],[3,2,1,"","branch"],[3,2,1,"","choice"],[3,2,1,"","clear"],[3,2,1,"","cmp_"],[3,2,1,"","concat_"],[3,2,1,"","cond"],[3,2,1,"","dip"],[3,2,1,"","dipd"],[3,2,1,"","dipdd"],[3,2,1,"","disenstacken"],[3,2,1,"","divmod_"],[3,2,1,"","drop"],[3,2,1,"","dupdip"],[3,2,1,"","floor"],[3,2,1,"","gcd2"],[3,2,1,"","genrec"],[3,2,1,"","getitem"],[3,2,1,"","help_"],[3,2,1,"","i"],[3,2,1,"","id_"],[3,2,1,"","ifte"],[3,2,1,"","ii"],[3,2,1,"","infra"],[3,2,1,"","initialize"],[3,2,1,"","inscribe"],[3,2,1,"","inscribe_"],[3,2,1,"","loop"],[3,2,1,"","map_"],[3,2,1,"","max_"],[3,2,1,"","min_"],[3,2,1,"","pm"],[3,2,1,"","pred"],[3,2,1,"","primrec"],[3,2,1,"","remove"],[3,2,1,"","reverse"],[3,2,1,"","select"],[3,2,1,"","sharing"],[3,2,1,"","shunt"],[3,2,1,"","sort_"],[3,2,1,"","sqrt"],[3,2,1,"","step"],[3,2,1,"","succ"],[3,2,1,"","sum_"],[3,2,1,"","take"],[3,2,1,"","times"],[3,2,1,"","unique"],[3,2,1,"","void"],[3,2,1,"","warranty"],[3,2,1,"","words"],[3,2,1,"","x"],[3,2,1,"","zip_"]],"joy.parser":[[22,1,1,"","ParseError"],[22,3,1,"","Symbol"],[22,2,1,"","text_to_expression"]],"joy.utils":[[3,0,0,"-","generated_library"],[23,0,0,"-","pretty_print"],[24,0,0,"-","stack"]],"joy.utils.generated_library":[[3,2,1,"","ccons"],[3,2,1,"","cons"],[3,2,1,"","dup"],[3,2,1,"","dupd"],[3,2,1,"","dupdd"],[3,2,1,"","first"],[3,2,1,"","first_two"],[3,2,1,"","fourth"],[3,2,1,"","over"],[3,2,1,"","pop"],[3,2,1,"","popd"],[3,2,1,"","popdd"],[3,2,1,"","popop"],[3,2,1,"","popopd"],[3,2,1,"","popopdd"],[3,2,1,"","rest"],[3,2,1,"","rolldown"],[3,2,1,"","rollup"],[3,2,1,"","rrest"],[3,2,1,"","second"],[3,2,1,"","stack"],[3,2,1,"","stuncons"],[3,2,1,"","stununcons"],[3,2,1,"","swaack"],[3,2,1,"","swap"],[3,2,1,"","swons"],[3,2,1,"","third"],[3,2,1,"","tuck"],[3,2,1,"","uncons"],[3,2,1,"","unit"],[3,2,1,"","unswons"]],"joy.utils.pretty_print":[[23,3,1,"","TracePrinter"],[23,2,1,"","trace"]],"joy.utils.pretty_print.TracePrinter":[[23,4,1,"","go"],[23,4,1,"","viewer"]],"joy.utils.stack":[[24,2,1,"","concat"],[24,2,1,"","dnd"],[24,2,1,"","expression_to_string"],[24,2,1,"","iter_stack"],[24,2,1,"","list_to_stack"],[24,2,1,"","pick"],[24,2,1,"","stack_to_string"]],joy:[[1,0,0,"-","joy"],[3,0,0,"-","library"],[22,0,0,"-","parser"]]},objnames:{"0":["py","module","Python module"],"1":["py","exception","Python exception"],"2":["py","function","Python function"],"3":["py","class","Python class"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:exception","2":"py:function","3":"py:class","4":"py:method"},terms:{"0":[2,3,5,6,7,8,9,10,11,12,14,15,17,18,19,25],"0000000001585":9,"000000001":9,"01":[6,7],"03":19,"05":5,"0a":19,"0b":[6,7],"0b11100111011011":6,"1":[2,3,5,6,7,8,9,10,11,12,14,15,17,18,19,20,24,25],"10":[2,5,6,7,13,19,25],"100":[5,17,19],"1000":[5,6,7,19],"10000":[5,19],"10001":5,"1001":[5,19],"10010":5,"10011":5,"1002":19,"101":5,"1010":5,"10100":5,"10101":5,"1011":5,"10110":5,"10111":5,"102":17,"1024":2,"103":17,"104":17,"105":17,"106":17,"107":17,"108":17,"109":17,"10946":7,"11":[2,6,7,19,25],"110":[5,6],"1100":5,"11000":5,"11001":5,"1101":5,"11010":5,"11011":5,"1110":5,"11100":5,"11101":5,"1111":5,"11110":5,"11111":5,"12":[2,6,17],"120":13,"122":5,"123":8,"128":7,"13":[2,7,17,25],"1346269":7,"14":[2,6,17],"144":7,"14811":[6,7],"15":[2,6,13,17,19,25],"16":[2,7,12,17,25],"160":2,"17":[11,15,17],"18":[6,8,14,15,17,23],"19":[17,19,25],"196418":7,"1a":19,"1b":19,"2":[2,3,5,6,8,9,10,11,13,14,17,18,20,24,25],"20":[2,6,14,19,25],"2006":19,"2017":[8,19],"2020":25,"207":2,"21":[6,7],"22":[9,19,25],"23":[2,6,7,8,9,11,14,15,17,19,23],"230":7,"231":[6,7],"232":7,"233":7,"233168":[6,7],"234":7,"23rd":19,"24":[2,6,7],"25":[6,7,12,17,18,20,25],"256":7,"2584":7,"26":[2,5,7,19,25],"27":[6,7],"273":10,"28":[7,18,25],"29":[19,25],"2a":19,"2b":19,"3":[2,3,7,8,10,11,12,13,17,18,20,21,24,25],"30":[2,6,19,25],"31":18,"32":[2,7,17],"33":6,"34":[7,18,19,25],"36":9,"37":[18,19,25],"3702":[6,7],"38":[19,25],"3819660112501051":12,"3b":19,"3i":19,"4":[2,6,7,8,9,11,13,17,18,20,24,25],"40":[2,18,19],"4000000":7,"41":[14,19,25],"414":23,"44":[11,17,19,25],"45":[2,6],"46":19,"4613732":7,"46368":7,"466":6,"47":[19,25],"48":[19,25],"49":[17,19,25],"4ac":12,"4m":7,"5":[2,3,5,7,8,11,12,13,14,17,19,21,25],"50":2,"513":23,"529":[2,8],"53":[19,25],"547":8,"55":[6,7],"552":2,"5555555555555554":2,"56":[19,25],"57":[6,7],"5bkei":11,"5d":11,"6":[2,6,9,11,13,17,19,20],"60":6,"610":7,"618033988749895":12,"625":20,"64":7,"66":[6,7],"6945":6,"7":[2,6,7,11,17,19,20,25],"75":2,"795831523312719":[2,9],"8":[2,5,6,7,11,12,17,19,20,25],"80":6,"832040":7,"88":11,"8888":8,"89":7,"9":[2,6,11,12,17,19,25],"90":2,"92":5,"925":6,"978":6,"980":6,"981":6,"984":6,"985":6,"987":6,"99":23,"990":6,"991":6,"992":6,"993":6,"995":6,"996":6,"999":[6,7],"999999999999996":9,"9a9d60354c35":19,"\u03b4":5,"\u03b5":9,"abstract":[8,11],"boolean":[2,3,8,11,16],"break":[5,8,15,19],"byte":[5,6],"case":[2,3,13,16,17,19,24],"char":5,"class":[3,5,8,19,22,23,24],"const":15,"default":[3,7,11,24],"do":[2,3,4,5,6,7,8,11,13,14,15,16,19,20,21],"export":[3,22],"final":[2,11,13,15],"float":[8,19,20,22],"function":[0,1,4,6,7,10,12,15,18,20,21,22,23,24,25],"g\u00e9rard":20,"goto":5,"import":[2,5,6,7,9,11,12,13,14,15,17,18,19,20],"int":[5,7,8,13,15,19,20,22,24],"long":[11,15,19,21],"new":[0,2,3,5,7,8,10,13,14,15,19],"p\u00f6ial":21,"p\u00f6ial06typingtool":19,"public":10,"return":[1,3,5,6,8,11,13,14,16,17,19,22,23,24],"short":15,"static":[2,10],"super":19,"switch":[2,19],"throw":[11,25],"true":[2,3,5,6,13,15,16,19],"try":[7,9,12,13,15,17,18,19,21],"void":[0,3,15],"while":[3,5,8,11,19,22,24],A:[1,3,4,8,13,16,19,21,22,23,24],AND:[5,19],And:[5,6,7,9,11,13,15,16,19,20,24],As:[4,6,11,15,19],At:[6,13,19],Be:2,But:[0,4,6,7,8,11,14,15,19],By:[7,11,19],For:[0,2,3,11,13,14,19,21,24],If:[2,3,5,6,7,8,9,10,12,13,15,17,19,20],In:[2,3,4,6,7,8,13,16,19,20,21,24],It:[0,2,3,4,5,6,7,8,10,11,13,15,19,20,24,25],Its:3,NO:8,NOT:5,No:[0,17,21],Not:19,OR:[5,19],Of:6,On:[3,23],One:[2,8,16,19,21],Or:[5,10,11,15,17,19],TOS:[2,3],That:[6,11],The:[0,1,2,3,4,5,7,9,10,12,20,21,22,23,24,25],Then:[2,3,11,12,13,19],There:[5,12,13,15,16,17,19,24],These:[16,19,21,24],To:[0,5,6,7,9,11,13,17,19],With:[9,13,15,19,21,25],_0:5,_1000:19,_1:5,_:[8,14,19],__:11,__add__:19,__call__:5,__class__:19,__eq__:19,__ge__:19,__hash__:19,__init__:[5,19],__main__:19,__radd__:19,__repr__:19,__str__:23,_and:5,_compaction_rul:5,_con:5,_dictionari:19,_f:19,_ge:19,_infer:19,_interpret:19,_log:19,_log_it:19,_names_for:19,_or:5,_r:19,_spn_e:15,_spn_p:15,_spn_t:15,_templat:5,_to_str:19,_tree_add_:11,_tree_add_e:[3,11,25],_tree_add_p:11,_tree_add_r:11,_tree_add_t:11,_tree_delete_:11,_tree_delete_clear_stuff:[3,11,25],_tree_delete_del:11,_tree_delete_r0:[3,11,25],_tree_delete_r1:11,_tree_delete_rightmost:11,_tree_delete_w:11,_tree_get_:[3,11,25],_tree_get_p:11,_tree_get_r:11,_tree_get_t:11,_tree_iter_order_curr:11,_tree_iter_order_left:11,_tree_iter_order_r:11,_tree_iter_order_right:11,_tree_t:11,_treestep_0:17,_treestep_1:17,_uniqu:19,_within_b:9,_within_p:9,_within_r:9,a0:19,a10001:19,a10002:19,a10003:19,a10004:19,a1:[3,18,19,25],a2:[3,18,19,25],a3:[3,18,19,25],a4:[3,18,19,25],a5:[18,19,25],a_:9,a_i:9,aa:13,ab:[0,3,5,9,15],abbrevi:17,abl:[5,16,19,25],about:[0,8,11,16,19,20,24],abov:[0,5,6,9,11,13,16,19],absolut:8,ac:5,accept:[0,1,2,3,5,6,7,8,11,12,14,15,16,17,19,20],accord:5,accordingli:[11,16],accumul:6,act:[5,25],action:[0,8,14,15,19,20,21],actual:[2,6,8,11,16,19],ad:[4,5,8,10,14,19,21],adapt:[15,21],add:[3,5,6,7,8,14,19,23,25],add_alias:3,add_def:[],add_definit:[11,17],addit:[0,2,3,6,8,13,14,17],address:21,adjust:11,advantag:19,affect:[3,16],after:[5,6,7,8,13,16,19,24,25],afterward:8,again:[2,3,6,8,11,13,19],against:19,aggreg:20,ahead:19,aka:[5,8,20,25],al:[16,19],albrecht:0,algorithm:[5,8,19],alia:3,alias:[3,8],align:[8,23],all:[3,5,6,7,8,11,13,14,15,16,17,19,23,24],alloc:19,allow:[10,11,16],almost:11,along:[5,8,13,19],alphabet:[3,21],alreadi:[5,9,14,19,20],also:[0,5,6,8,11,16,19,23,24],alter:[5,19],altern:[4,19],although:[4,11],altogeth:7,alwai:[6,10,13,16],am:[16,21],amend:16,among:19,amort:11,an:[0,1,2,3,4,5,9,14,15,17,21,24,25],analysi:[4,21],anamorph:[8,21],and_:3,ani:[0,4,5,6,8,10,11,15,16,19,20,22],annual:8,anonym:11,anoth:[5,11,16,19,24,25],anyhow:[16,19],anyjoytyp:19,anymor:19,anystarjoytyp:19,anyth:[2,3,5,8,19,25],apart:19,api:10,app1:3,app2:[3,8,12,13,14,16],app3:[3,16],app:8,appear:[2,4,5,6,11],append:19,appendix:21,appli:[2,3,6,7,11,13,15,19],applic:7,approach:6,appropri:5,approxim:21,ar:[1,2,3,5,6,7,8,10,12,13,16,17,19,20,21,22,24,25],archiv:0,aren:20,arg:[2,3,15],argument:[2,3,8,9,12,13,15,21,23,24],arithmet:2,ariti:[2,16],around:[6,19,22,24],arrang:[15,17],arriv:[7,17],arrow:5,articl:[0,4,7,13],ascii:5,ascii_lowercas:5,ask:[4,7,19],aspect:0,assembl:[5,15],assert:[5,19],assign:[16,24],associ:11,assum:9,asterisk:17,asterix:[19,25],asyncron:16,attack:8,attempt:[0,1,19],attribut:3,attributeerror:19,author:19,auto:[0,19,25],automat:[4,16,19],auxiliari:[5,17],avail:[0,19,25],averag:[8,14],avoid:11,awai:[11,19],awar:2,awkward:[11,13,19],azur:21,b0:3,b1:[3,19,25],b2:25,b3:25,b:[3,5,7,8,9,11,13,16,17,19],back:[3,11,19],backtrack:25,backward:[10,11,12,17],bad:19,bag:8,banana:13,bar:16,barb:13,base:[0,2,3,10,13,17,19],basic:[2,3,8,11],basicconfig:[18,19],bc:5,bd:5,becaas:5,becaus:[2,3,5,8,11,16,17,19,20,24],becom:[0,11,15,17,24],becuas:19,been:[5,9,10,11,19,20],befor:[5,7,8,11],begin:[11,17],behavior:[10,17,25],behaviour:[0,1,19],behind:16,being:[0,16],below:[2,3,5,6,7,11,15,19,20],bespok:8,best:0,better:[6,11,13,19],between:[0,6],beyond:7,biannual:8,bin:5,binari:[0,7,8,21],binary_search_tre:11,binarybuiltinwrapp:3,bind:8,bingo:20,bit:[5,6,7,11,19],blank:22,bliss:[0,21],block:6,bodi:[2,3,5,8,11,16],body_text:[],booktitl:19,bool:[3,13,19,25],borrow:[8,19],both:[2,6,8,12,13,14,15,16,19,24],bottom:7,bounce_to:5,bracket:[8,19,22],branch:[3,5,6,7,13,19,21,25],branch_fals:19,branch_tru:19,breakpoint:8,bring:[6,8,19],bruijn:19,brutal:16,brzozowski:[19,21],brzozowskian:5,btree:[11,17],buck:11,bug:[0,8],build:[7,8,12,13,15,20,24],built:[12,19],bullet:23,bundl:[2,3,13],burgeon:8,c:[0,1,2,3,5,7,9,11,13,15,16,17],calculu:4,call:[1,2,5,8,10,11,13,16,19,23,24],caller:[11,19],can:[0,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,19,20,21,22,24,25],cancel:16,cannot:[18,19,22],captur:8,card:8,care:[6,24],carefulli:20,carri:[7,11],cartesian:4,catamorph:21,categor:[0,21],categori:[4,16],ccc:4,ccon:[3,11,18,19,25],cell:[13,19],certain:[8,24],certainli:11,cf:[7,9,12,13],chain:[3,16],chang:[2,10,11,15,19,20],charact:[5,20],chat:8,chatter:[0,19],check:[0,7,9,19,21],child:17,choic:[3,13],choos:10,chop:12,chose:5,cinf:11,circl:5,circuit:[4,15],cite_not:11,classmethod:[],claus:[3,19],clean:19,clear:[3,6,8],clear_stuff:11,cleav:[8,12,14],client:24,close:[0,1,4],clunki:[6,19],clv:16,cmp:[3,17,21],cmp_:3,code:[1,4,5,12,13,16,19,21,25],codireco:[7,9,15],collaps:13,collect:[4,5,7,8,19],combin:[0,3,6,7,8,9,12,15,16,17,20,21,23,25],combinatorjoytyp:19,come:[8,11,19],command:[8,11,19],comment:16,common:[2,6,16],compar:[3,4,5,15,19],comparison:[0,11],compat:16,compel:4,compil:[2,3,4,5,8,11,14,16,21,25],complement:5,complet:4,complex:[3,16,19,20,25],complic:19,compos:[5,25],composit:19,compostit:19,compound:11,comput:[2,4,5,6,8,12,15,16,19,25],con:[3,5,6,7,8,9,11,12,13,15,16,17,20,24,25],conal:[4,16],concat:[3,7,8,16,17,19,24],concat_:3,concaten:[0,5],concatin:[0,3,5,24],concern:16,conclus:21,concurr:2,cond:[3,11],condit:[3,8],condition:15,confer:19,conflict:[11,19],consecut:21,consid:[5,6,7,11,13,17,19,20],consist:[2,7,8,16,17],constant:11,constitu:13,constraint:15,construct:[0,15,16,19],consum:[15,16,19],contain:[0,2,3,5,7,8,13,15,19,22],content:19,context:2,conting:11,continu:[0,5,13,19,20],control:8,conveni:[4,16,19],convent:16,convers:19,convert:[13,14,17,19,22,24],cool:11,coordin:[0,15],copi:[2,3,6,11,13,15,16,17,18,21],copyright:8,correspond:[4,16],could:[2,4,5,6,8,10,11,16,19,20],couldn:16,count:[3,19],counter:[6,19],coupl:17,cours:[6,11,19],cout:15,cover:19,cp:8,cpu:16,crack:11,crash:11,creat:[0,2,3,6,9,11,16,19],creativ:19,crude:[11,19,22],cruft:19,curent:25,current:[2,3,8,13,15,16,17,19,20,23,25],curri:5,custom:10,cycl:[6,7],cython:8,d010101:5,d0101:5,d01:5,d0:5,d10:5,d1:5,d:[2,3,5,11,13,14,16,17,18,19,20],d_compact:5,dai:8,data:[2,3,5,13],datastructur:[0,2,13,19,21,22,24],datatyp:24,ddididi:20,de:[19,20],deal:[0,5,11,16],dealt:19,debugg:19,decid:11,declar:19,decor:3,decoupl:13,decrement:[0,3],deduc:[6,19],deeper:0,deepli:4,def:[3,5,8,13,14,19,24],defaultdict:[5,19],defi:[],defin:[2,4,5,6,7,8,9,10,12,13,14,15,16,19,20,21],definit:[0,2,3,6,7,8,10,11,13,15,17,19,21,25],definitionwrapp:[11,13,17],defint:16,del:18,deleg:8,delet:21,deliber:19,demo:19,demonstr:4,depend:[3,11,13,16],deposit:17,depth:[19,25],dequot:13,der:11,deriv:[2,3,6,8,9,11,19,21],derv:5,describ:[4,5,11,13,16,17,19,22],descript:[6,8],descriptor:19,design:[2,3,11,16,21],desir:[8,17],destin:5,destruct:11,detail:[8,11,19],detect:[5,7,11,13,19],determin:21,develop:[0,7,8,19,21],diagram:6,dialect:1,dict:[1,3,5,19,23],dictionari:[0,1,3,8,19,21,23],did:19,differ:[0,4,6,9,11,12,13,16,24],differenti:4,difficult:19,difficulti:16,dig:[11,20],digit:6,digraph:5,dinfrirst:[8,15,19,25],dip:[0,3,6,7,8,9,11,12,13,14,15,16,17,19,21,25],dipd:[3,7,8,11,12,13,15,16,19,20,25],dipdd:[3,11],direco:21,direct:8,directli:[6,16,17,19,24],disappear:[2,5,19],discard:[3,7,9,11,13],disciplin:11,disenstacken:[3,8],disk:8,displac:2,displai:19,distiguish:19,distribut:16,ditch:11,div:[3,8,19,25],dive:17,divis:[11,19],divmod:[3,25],divmod_:[3,19],dnd:24,doc:[2,3,8,19],doc_from_stack_effect:18,docstr:19,document:[19,21,22,24],doe:[0,1,3,4,5,7,8,14,16,19,21,23,25],doesn:[6,10,11,15,16,17,19,24],domain:[4,19],don:[5,6,8,11,19],done:[2,6,8,10,19],dooooc:19,door:8,dot:[5,23],doubl:[5,6,8,19],doublecircl:5,down:[2,5,9,13,20,25],down_to_zero:8,dozen:8,dr:5,draft:[4,10],drag:24,dream:8,drive:[7,9],driven:6,driver:[5,7],drop:[3,11,24],ds:5,dudipd:8,due:19,dup:[3,6,7,8,9,11,12,13,15,16,18,20,24,25],dupd:[3,19,25],dupdd:[3,25],dupdip:[3,6,11,12,13,15],duplic:[3,11,13],durat:2,dure:[2,13],e:[2,3,5,7,8,10,11,14,16,18,19,20,23,24],each:[2,3,4,5,6,8,13,14,15,16,17,19,23,25],easi:[0,11,15,17,19,20],easier:[3,11,16],easili:4,eat:5,edit:21,ee:[11,19],effect:[2,3,5,8,16,20,21,25],effici:[7,14,20],efg:19,eh:19,either:[1,2,3,5,11,13,19],el:24,elabor:19,eleg:[0,5,8,11,16,21],element:[2,3],elif:19,elimin:[5,19],elliott:[4,16],els:[2,3,5,13,15,16,19],else_:19,embed:[4,11,20],emit:19,empti:[3,5,8,17,19,24,25],en:11,encapsul:8,enclos:8,encod:7,encount:19,end:[5,6,11,13,17,19,24],endless:7,enforc:[2,8],engend:8,enough:[5,8,13,23,25],enstacken:[7,8,19],enter:8,enter_guard:19,entir:24,entri:[3,20,23],enumer:19,epsilon:9,eq:[2,3,25],equal:[3,6,17,24],equat:[8,9],equival:16,er:[0,8],ergo:[5,11],err:[11,18],error:[8,19,22],essai:0,establish:19,et:[16,19],etc:[3,17,19,20,22],euler:21,euro:19,eval:[0,19],evalu:[1,2,3,8,9,11,12,13,14,16,17,19,23],event:16,eventu:[16,19],ever:19,everi:[1,7,16],everybodi:16,everyth:[3,5,11,12,16,19],evolv:10,examin:13,exampl:[3,5,6,19,21,22,24,25],exce:7,except:[1,5,8,11,18,19,22],execut:[0,1,2,3,8,13,14,16,17,19,20,24,25],exend:19,exercis:[5,11],exist:[4,11,19],expand:11,expect:[2,3,16,17,19,24],experi:[8,17],explain:19,explan:8,explor:[8,19],express:[0,1,2,3,4,11,13,14,15,19,20,21,23,24],expression_to_str:[19,24],extend:19,extra:[1,6,7],extract:[11,12,21],extrem:8,extrememli:8,f0:19,f1:[18,19,25],f2:[18,19,25],f3:[19,25],f:[2,3,5,6,7,9,13,15,16,19],f_g:19,f_in:19,f_out:19,f_python:19,facet:0,facil:8,fact:22,factor:[2,6,8,11,15,19],factori:[3,21],fail:[2,3,11,21,22],fail_fail:[],fairli:19,fake:5,fall:19,fals:[2,3,5,6,13,15,16,19],falsei:19,familiar:[0,15],far:[9,11,13,19,25],fascin:0,favorit:16,fear:[11,19],few:[6,8,9,12,16,19],fewer:[3,8],fg:19,fg_in:19,fg_out:19,fi:[18,19],fib:7,fib_gen:7,fibonacci:21,figur:[2,3,11,13,19],file:15,filter:11,fin:6,find:[2,3,5,6,7,16,17,19,21,25],finder:9,fine:[0,5,6,11,19,25],finite_state_machin:5,first:[3,5,7,8,9,11,12,13,14,17,20,21,24,25],first_two:[3,11,25],fit:[6,8],five:[6,8,21],fix:[2,3,5,13,19],fixm:[5,19],flag:[16,19],flatten:[8,17,19],flesh:5,flexibl:21,floatjoytyp:19,floatstarjoytyp:19,floor:3,floordiv:[3,6,25],flow:8,fn:19,fo:[18,19],follow:[0,2,3,5,8,10,13,16,17,19,20],foo:[8,10,11,16,19],foo_ii:10,fork:16,form:[2,3,4,5,6,7,13,17,19,21,24],forman:8,format:[18,19,21,23],formula:[0,6,21],forth:[8,19],forum:0,forward:19,found:8,four:[0,2,3,6,7,8,11,15,21],fourteen:6,fourth:[2,3,11,13,25],fr:5,frac:[9,12],fractal:8,fraction0:8,fraction:[2,8],frame:13,framework:8,free:[4,8,11],freeli:2,from:[0,1,2,3,5,6,7,8,9,11,12,14,15,16,17,18,19,20,21,24],from_:5,from_index:24,front:[2,3,13],frozenset:5,fulin:16,full:6,fun:[5,21],func:19,functionjoytyp:19,functionwrapp:3,functool:5,fundament:[0,21],funtion:11,further:[9,19,21],futur:16,g:[2,3,5,7,8,9,10,11,13,14,16,18,19,20,23,24],g_in:19,g_out:19,garbag:8,gari:11,gcd2:3,gcd:[3,8],ge:[2,3,25],gener:[0,2,4,16,19,21,24,25],generated_librari:3,genrec:[3,8,11,13,16,17,19],geometr:6,get:[2,4,5,6,7,8,12,13,19,21],getch:5,getitem:3,getrecursionlimit:24,getsourc:8,ghc:4,gi:19,give:[4,6,11,13,15,17,19,24],given:[2,3,6,7,9,11,15,16,19,20,21,24],global:[18,19],glue:8,go:[5,6,11,12,13,15,16,17,19,20,23],goe:25,good:[6,11,19],grab:[3,19],grammar:22,grand:8,graph:[5,16],graphic:5,graphviz:5,great:[0,8,19,21],greater:24,grind:19,group:0,grow:5,gsra:9,gt:[2,3,25],guard:[11,19],h:[5,13,19],ha:[0,2,3,5,7,8,9,10,11,13,16,19,20,24],had:[5,6,20],haiku:8,half:[6,19,20],hallmark:16,hand:[5,8,14,19,21],handi:[9,19],handl:[11,19,24,25],happen:[8,19],happi:5,hard:[5,19,20],hardwar:4,hasattr:19,hash:19,haskel:4,have:[2,3,5,6,7,8,9,10,13,14,15,16,19,20,21,24,25],he:[4,9],head:24,heh:19,help:[0,3,8,11,13,15,19],help_:3,helper:5,herd:8,here:[0,5,6,7,11,15,17,19,20,25],hg:25,hide:11,hierarchi:19,higher:[5,8,11,19],highli:8,hij:5,histori:[19,23],hit:5,hmm:[5,11],hoist:3,hold:[6,19],hood:11,hope:[0,6,8,21],hopefulli:13,host:21,how:[0,4,5,9,11,13,15,19,20,21],howev:[13,14,16,19],html:[2,3,7,12,13,21],http:[11,25],huet:20,huge:11,hugh:[9,17],human:8,hybrid:[15,25],hylomorph:21,hypothet:2,i0:19,i1:[18,19,25],i2:[18,19,25],i3:[19,25],i:[0,3,6,7,8,9,13,14,15,16,17,20,21,23,25],id:[3,19],id_:3,idea:[4,6,8,19],ident:[3,5,13,19,25],if_not_empti:11,ift:[0,3,11,13,15,17,19,25],ignor:[1,3,11,19],ii:[0,3,15,21],iii:21,illustr:[5,13],imagin:[5,16,20],imap:19,imit:[5,17],immedi:[5,13],immut:[5,8,11],imper:13,implement:[0,1,2,4,8,10,11,13,14,16,21,25],implementaion:16,implicit:8,improv:19,includ:[4,11,16,17,19,25],inclus:6,incom:24,incompat:10,incorpor:12,increas:6,increment:[0,3,4,6,10,16],index:[0,8,19,24],indexerror:24,indic:[16,17,19,24,25],ineffici:19,infer:[0,18],inferenc:25,info:[18,19],inform:[3,5,19,25],infra:[3,7,8,11,12,14,15,16,17,19,21,25],infrastructur:3,initi:[2,3,5,8,9,11,19],inlin:11,inner:19,inproceed:19,input:[1,9,16,18,19],input_:5,inscrib:3,inscribe_:3,insert:[19,24],insight:13,inspect:8,inspect_stack:19,instal:0,instanc:19,instanti:[4,23],instead:[5,6,7,11,13,15,19,20,24,25],instruct:5,integ:[0,2,3,8,15,17,19,22],integr:3,intend:[0,8],interact:[8,21],interest:[0,6,11,19,21],interfer:16,interlud:21,intermedi:13,intern:[0,19,23,24],interp:1,interpret:[0,4,10,14,22,23,25],interrupt:8,intersect:5,interspers:16,interv:[4,6],intjoytyp:19,introduc:10,introduct:0,intstarjoytyp:19,intuit:19,invari:3,invent:19,involv:19,ipf:8,ipython:19,isinst:[5,19],isn:[3,5,11,20],issubclass:19,item:[2,3,8,11,13,16,17,19,21,24],iter:[1,3,5,8,13,16,17,19,21,24],iter_stack:[14,24],iteritem:[5,19],itertool:[5,19],its:[0,1,2,3,4,6,8,11,13,15,16,17,19,24],itself:[0,2,8,11,16,19],iv:21,j05cmp:[2,3,13],j:[2,5,6,7,9,11,12,13,14,15,17,19,20],jaanu:19,jmp:5,job:[16,21],john:[9,17],joi:[2,4,10,11,12,14,16,18],join:[5,19],joypi:[20,25],joytypeerror:18,jp:[7,12],js:8,jump:5,jump_from:5,junk:19,jupyt:21,just:[0,2,3,5,7,8,10,11,13,15,16,17,19,20,23],juxtaposit:16,k:[6,11,17,19],keep:[5,11,12,16,19,20],kei:[5,17,21],kevin:0,key_n:11,keyerror:[5,11,19],kind:[0,2,4,8,11,13,15,17,19,25],kinda:19,kleen:[17,19],kleenestar:19,kleffner:19,know:[6,11,19],knowledg:19,known:[4,16],kstar:5,l:[3,5,11,19],l_kei:11,l_left:11,l_right:11,l_valu:11,la:0,label:[5,19],lambda:[4,5,19],languag:[3,4,5,8,10,11,14,19],larg:[5,19],larger:[21,24],largest:3,last:[6,11,13,19],lastli:7,later:[5,8,15,17,19],law:2,layout:[0,15],lazi:19,lazili:9,lcm:6,le:[2,3,25],lead:[5,8,19],leaf:11,lean:8,learn:0,least:[2,6,13,19,24],least_fract:8,leav:[3,6,15,16],left:[5,8,12,13,16,17,19,20,23,24],leftov:13,legend:5,legibl:[0,15],len:[5,19],length:[3,6,24],lens:13,less:[6,7,8,13,19,24],let:[7,9,11,12,13,15,17,19,20,21],letter:19,level:[4,5,11,18,19],librari:[0,5,14],like:[0,2,3,5,6,8,15,16,17,19,21,22,23,25],limit:[19,25],line:[8,11,12,19,23,25],linear:24,link:[0,5,19],linux:0,list:[0,3,5,6,8,9,11,16,17,19,20,23],list_to_stack:[19,24],liter:[1,11,17,19,20,22],literatur:19,littl:[0,5,7,11,15,16,19,21],live:21,lk:17,lkei:17,ll:[5,6,7,8,13,15,17,19,20],load:[6,8],local:19,locat:2,locu:23,log:[18,19],log_2:11,logic:[0,6,15,21],longer:[11,19],look:[1,5,7,8,9,11,12,15,16,19],lookup:8,loop:[0,1,3,5,6,19,21,25],lose:19,lot:[5,8,11,19,20],love:6,low:[4,5],lower:6,lowercas:[5,19],lowest:11,lr:5,lshift:[3,25],lt:[2,3,25],m:[0,5,6,8,11,15,16,17,19],machin:[0,21],machineri:[11,19],macro:8,made:[0,8,16,19,20],magic:19,mai:[2,13,16,25],mail:0,main:[0,3,8,12,15,16,19,20],mainloop:10,maintain:20,major:10,make:[2,3,4,6,8,11,13,14,15,16,17,19,20,21],make_gener:[9,15],make_graph:5,manfr:[0,2,3,4,13],mani:[0,5,8,19],manipul:19,manner:12,map:[1,3,5,6,8,10,13,17,19,23],map_:3,marker:8,mask:[6,7,15],match:[0,1,19,21],materi:0,math:[0,8,9,11,12,19],mathemat:8,matter:[6,9,11,17],max:3,max_:3,maximum:3,mayb:[11,19],mc:19,me:[8,17,19],mean:[4,6,8,9,11,13,17,19,24],meant:[8,11,13,17,24],mem:5,member:[2,3,13],memo:5,mental:8,mention:2,mercuri:[],mess:19,messag:[18,19],meta:[8,11,14],meta_compos:19,method:[0,8,19,21,23],midpoint:6,might:[0,4,5,7,11,15,19],mike:11,million:7,min:3,min_:3,mind:19,minimum:3,minor:11,minu:3,mirror:0,miscellan:0,mismatch:19,mix:[8,19],mod:3,mode:19,model:[4,8],modern:0,modif:[7,19],modifi:[8,11,20],modul:[0,1,3,8,19,22],modulo:19,modulu:[3,8,25],moment:19,month:8,more:[0,3,4,5,6,7,8,9,13,14,16,17,19,22,24,25],most:[5,19,25],mostli:0,move:[5,11],movement:2,ms:21,much:[5,6,7,11,13,19,24],muck:11,mul:[3,8,12,18,20,23,25],multi:[],multipl:[21,25],multipli:3,must:[2,3,6,10,13,16,17,19,22],my:[0,6,8,16],myself:19,n0:19,n10001:19,n10002:19,n10003:19,n1001:19,n1002:19,n1003:19,n1:[19,25],n2:[19,25],n3:[19,25],n4:[19,25],n:[2,3,5,6,8,9,11,14,15,17,19,20,24],name:[1,3,5,8,10,11,13,19,20,21,22,23,24,25],narr:19,natur:[5,6,7,11,19],navig:20,ne:[3,25],nearli:19,neat:11,neato:19,necessarili:19,need:[2,3,6,7,9,10,11,13,15,16,19],neg:[3,12,25],neither:[16,19],ness:5,nest:[3,8,11,20],net:25,network:8,never:[5,10,13],new_def:19,new_f:19,new_fo:19,new_kei:11,new_valu:11,newton:[0,21],next:[0,5,6,15,16,17,19,25],nice:[0,5,13,24],niether:2,nk:6,nm:5,node:[5,17,21],node_kei:11,node_valu:11,non:[5,17,19],none:[1,19],nope:17,nor:5,normal:16,not_:3,notat:[0,8,11,15],note:[2,5,6,9,11,13,16,19,24],notebook:[6,7,8,19,20,21],notebook_preambl:[2,6,7,9,11,12,13,14,15,17,19,20],noth:[2,11,16],notic:6,now:[3,5,6,7,8,13,14,17,19,21],ns:19,nth:[3,24],nullari:[8,11,15,16,19,25],number:[0,1,2,3,6,7,9,15,16,24,25],numberjoytyp:19,numberstarjoytyp:19,numer:19,o:[5,7,11,19],object:[5,19,22],observ:6,obviou:7,obvious:19,occur:11,odd:[6,7],off:[2,3,6,7,12,15,19,20],often:[5,16],oh:11,ok:19,old:[0,2,14],old_k:11,old_kei:11,old_valu:11,omg:[],omit:[13,19,22],onc:[3,5,10,11],one:[0,2,3,5,6,7,11,13,15,16,17,19,23,24,25],ones:[5,7,19],onli:[2,3,5,6,11,13,15,16,19,20,24],onto:[1,2,3,8,13,24],open:[8,19],oper:[0,3,5,8,11,13,21,24],oppos:19,optim:11,option:[1,8,11,19,24],or_:3,orchestr:16,order:[0,2,3,8,13,16,18,19,21,24],org:[0,11],origin:[0,1,2,3,11,20,21],osdn:25,other:[0,2,3,4,5,8,11,13,15,17,19,24],otherwis:[3,5,6,7,11,17,19],our:[5,6,7,8,9,13,15,17,19],out:[2,3,4,6,7,8,9,11,12,13,15,16,19,20,21],outcom:17,outlin:5,output:[1,5,9,13,16,18,19,25],outsid:4,over:[3,4,6,7,8,9,11,12,16,17,19,21,25],overhaul:19,overview:[3,19],own:[11,19],p:[2,3,6,11,13,16],pack:24,packag:[0,8],page:[0,11,19,24],pair:[0,2,3,6,7,11,15,19],palidrom:6,palindrom:6,pam:8,paper:[4,8,13,16,20],paradigm:21,parallel:[2,21],param:1,paramet:[1,2,3,13,14,22,23,24],parameter:21,paramorph:13,parenthes:[11,24],pariti:7,pars:[0,5,8],parse_definit:[],parseerror:22,parser:[0,18,19],part:[2,3,9,13,17,21],partial:[5,19],particular:20,pass:[0,5,11,19,23],patch:5,path:[5,15,19,21],pattern:[5,6,16,17,21],pe1:[6,7],pe2:7,pearl:20,pend:[3,8,13,19,20,23],peopl:21,per:[8,17],perfectli:16,perform:[5,16,19],perhap:7,period:8,permit:[16,19,24],permut:19,persist:11,phase:2,phi:5,phrase:15,pick:[3,6,7,16,24],pickl:8,pictur:11,piec:[13,21],pip:0,place:[3,6,8,19],plai:0,plu:3,plug:[7,13,17],pm:[3,12,19,25],point:[4,5,8,11,13,15,16],pointless:2,pool:16,pop:[0,3,5,6,7,8,11,13,14,15,17,18,24,25],popd:[3,8,9,11,14,16,19,25],popdd:[3,7,12,19,25],popop:[3,6,7,8,9,11,17,19,25],popopd:[3,25],popopdd:[3,25],posit:[3,6,8,13],possibilit:11,possibl:[11,17,19,21],post:8,poswrd:19,potenti:16,pow:[3,25],power:[8,19],pprint:5,pragmat:6,preambl:9,preceed:16,precis:[0,1],pred:[3,19,25],predecessor:3,predic:[2,3,5,7,13,16],prefix:[19,23],preliminari:5,present:19,preserv:[4,17],pretti:[9,11,12,16,17,19,23,24],pretty_print:0,previou:[8,16],prime:9,primit:[2,3,19,21],primrec:[3,7,8,13],print:[0,1,2,3,5,18,19,23,24],probabl:[7,8,11,19],problem:[8,15,19,21],proc_curr:11,proc_left:11,proc_right:11,proce:[6,25],process:[5,8,17,19,23],produc:[3,6,11,13,17,19],product:[5,7,8,18,19],program:[0,2,3,7,8,9,11,13,15,16,19,20],programm:[16,19],progress:16,project:[21,25],prolog:19,promis:16,prompt:8,proper:[2,3,13,16,25],properti:0,provid:[0,4,8,16,19,25],pseudo:15,pun:[0,8],punctuat:19,pure:[0,5],puriti:8,purpos:8,push:[2,3,8,13,20,24],put:[1,2,7,8,16,19,21,24],pypi:0,python3:8,python:[0,2,3,5,11,13,16,20,21,22,24,25],q:[2,3,11,13,16,19,20],quadrat:[0,21],quasi:15,queri:[11,17],query_kei:17,queu:13,quit:[0,17],quot:[0,3,7,8,11,12,13,15,16,17,19,20,23],quotat:[2,3,13],quotient:3,r0:[9,11,17],r1:[2,3,9,11,13,17],r2:[2,3,13],r:[2,3,5,11,13,19],r_kei:11,r_left:11,r_right:11,r_valu:11,rais:[5,11,19,22,24],rang:[5,8,19],range_revers:13,range_to_zero:8,ranger:13,ranger_revers:13,rankdir:5,raphson:9,rather:[6,8,13,15,17],ratio:8,re:[0,6,7,8,9,14,15,19,21,22],reach:[5,6,7,13],read:[0,1,6,7,11,19,20],readabl:14,reader:[5,11],readi:19,readm:15,real:11,realiz:[4,11,15],rearrang:[2,11,19,24],reason:[6,8,16,19],rebuild:[17,20],rec1:[2,3,13],rec2:[2,3,13],recent:19,recogn:22,recombin:16,record:[8,23],recur:[3,13,19],recurs:[0,2,3,5,7,8,9,16,19,21,24],recus:8,redefin:21,redistribut:[3,8],redo:5,reduc:[2,19],redund:24,refactor:[8,10],refer:[0,2],referenti:16,reflect:16,regard:16,region:15,regist:2,regular:[19,21,22],reifi:18,reimplement:[16,21],rel:24,relat:[5,19],releas:10,rem:3,remain:[2,8,10,19],remaind:[3,9],rememb:5,remind:19,remot:24,remov:[3,11,19,24,25],render:21,repeat:6,repeatedli:6,repetit:5,repl:[0,1],replac:[0,2,3,7,12,13,16,17,19,20,21,24],repositori:0,repr:[5,19],repres:[2,8,11,16,22,23],represent:24,reprod:7,repurpos:19,requir:[15,16,19,24],research:19,resembl:8,resolut:16,resourc:16,respect:[5,6,16],rest:[3,6,7,8,11,13,15,20,21,24,25],rest_two:11,restart:[],restor:2,result:[1,2,3,5,6,11,12,13,16,17,19,20],resum:8,retir:2,retri:8,reus:[11,19,24],revers:[3,6,7,13,19,20,21,24],revisit:19,rewrit:[3,8,15,19],rewritten:8,rid:11,right:[7,8,12,17,19,21,23,24],rightest:11,rightmost:6,rigor:16,risk:19,rk:17,rkei:17,rob:19,roll:[3,9,11,17],roll_dn:19,rolldown:[3,18,19,25],rollup:[3,19,25],root:[3,9,12],rough:15,round:[3,19],row:5,rrest:[3,18,19,25],rshift:[3,25],rtype:1,rule:[16,21],run:[0,1,3,6,8,9,11,12,13,15,16,17,19,20],runtim:16,runtimeerror:24,s0:19,s1:[18,19,25],s2:[18,19],s3:19,s4:19,s5:19,s:[0,1,2,3,4,7,8,10,12,13,14,15,16,17,18,20,21,23,24,25],sai:[5,7,11,12,15,17,19],same:[2,4,6,11,16,19,24],sandwich:[2,3,13],save:[2,5,6,8],scan:[],scanner:[8,22],scenario:20,scm:25,scope:[7,11],script:1,se:19,search:[0,11],sec:19,second:[3,8,11,13,15,17,24,25],section:13,see:[0,5,7,8,9,10,12,13,14,15,19,20,23],seem:[0,6,8,15,17,19,25],seen:[19,20],select:3,self:[5,16,19],semant:[2,3,8,10,11,16,19],semi:8,send:8,sens:[0,2,6,19,20],separ:[8,16,19,22],seq:19,sequenc:[0,1,2,3,6,8,11,13,14,20,21,22,25],sequence_to_stack:19,seri:[6,7,11,15,20],set:[2,3,5,13,19,21],seven:[6,7],sever:[0,4,8,13],shape:[5,16],share:[3,8],shelf:2,shew:5,shift:[6,7],shorter:21,shorthand:11,should:[2,3,5,6,11,13,16,19],shouldn:8,show:[4,15,16,19,20],shunt:[3,20],side:[5,11,18,19,25],sign:[],signatur:25,signifi:[8,11],similar:[11,15,17,19],simon:8,simpl:[1,5,8,13,15,24,25],simplefunctionwrapp:[3,14,19],simpler:17,simplest:[19,21],simpli:4,simplifi:[6,11,20],sinc:[2,6,11,15,19],singl:[3,7,8,14,15,16,19,22,25],singleton:5,situ:11,situat:11,six:[6,7,8],sixti:[6,7],size:[5,8,21],skeptic:8,skip:19,slight:9,slightli:[11,13,19],smallest:3,smart:11,sn:19,so:[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20,25],softwar:8,solei:2,solut:[6,7],solvabl:8,some:[0,2,3,5,7,8,11,13,15,16,17,19,21,24,25],somehow:[11,19],someth:[2,10,11,19],sometim:11,somewher:[11,21],sort:[3,5,11,16,19],sort_:3,sourc:[0,1,3,19,21,22,23,24],space:[6,23],span:6,spawn:19,special:[7,11,21],specif:[0,4],specifi:[11,16],speed:14,spell:[5,17],sphinx:[21,24],spiral:[0,21],spiral_next:15,spirit:[0,1,17],split:[5,19],sqr:[3,8,9,12,20],sqrt:[3,9,19,25],squar:[0,3,9,19,21,22],square_spir:[],ss:19,stack:[0,1,3,6,7,9,11,12,13,14,15,16,17,18,20,21,22,23,25],stack_effect:19,stack_effect_com:19,stack_to_str:[18,24],stacki:19,stackjoytyp:19,stacklistbox:24,stackoverflow:15,stackstarjoytyp:19,stage:17,stai:[0,1],stand:[4,5],standard:[8,11],star:[17,19],stare:11,start:[5,6,7,8,9,11,13,17,19,25],state:[8,21],state_nam:5,statement:[3,5,15],stdout:[18,19],step:[3,6,8,11,14,19,20,21],stepper:15,still:[5,11,19],stop:11,stopiter:5,storag:[6,11],store:[6,13,19],stori:13,str:[1,5,19,22,23,24],straightforward:[5,7,9,15,19,21],stream:[6,18,19],stretch:11,string:[1,2,3,8,19,20,21,22,23,24],stringi:5,structur:[8,16,17,19,20,21,24],stuck:5,studi:5,stuff:[11,19],stuncon:[3,25],stununcon:[3,25],style:[0,4,19],sub:[3,10,16,25],subclass:8,subject:[16,20],subsequ:16,subset:[19,25],substitut:[5,11,19],subtract:6,subtyp:21,succ:[3,19,25],succe:19,success:9,suck:19,suffic:19,suffici:11,suffix:19,suggest:[4,5,11],suitabl:[1,3,4,6],sum:[3,7,8,12,13,14,17],sum_:[3,19],summand:6,sumtre:17,suppli:[11,22],support:[8,19,23,24],sure:16,suspect:2,svg:[],swaack:[3,12,14,15,19,20,25],swap:[3,6,7,8,9,11,13,14,15,16,17,18,20,25],swon:[3,7,8,13,17,19,20,25],swoncat:[7,8,9,13,17],swuncon:13,sy:[18,19,24],sym:5,symbol:[1,2,3,5,16,19,20,21,22,23],symboljoytyp:19,symmetr:[6,11,15],symmetri:[5,15],syntact:8,syntax:[8,24],system:[8,11,16],t0:3,t1:3,t:[2,3,5,6,8,10,11,13,15,16,19,20,24],tabl:[5,19],tag:[5,19,25],tail:[9,11,19,21,24],tailrec:[3,9],take:[3,5,6,8,9,11,13,15,16,19,24],talk:[8,11,19,24],target:20,tast:4,tbd:8,te:11,tear:13,technic:2,techniqu:[4,20],technolog:2,temporari:20,ten:6,term:[1,2,5,8,9,13,16,19,21,22,24,25],termin:[2,3,5,13],ternari:8,test:[2,3,13],text:[0,1,19],text_to_express:[8,18,22],textual:8,than:[0,3,5,6,7,8,9,13,16,17,19,24,25],thei:[2,5,6,7,8,11,13,15,16,19,20,22,24],them:[0,2,5,6,7,11,13,15,16,19,20,21,25],themselv:[16,19],theori:[2,3,13,16],therefor:7,thi:[0,1,2,3,4,5,6,7,8,9,12,13,15,16,17,19,20,21,22,23,24,25],thing:[2,7,11,13,16,19,20,22,24,25],think:[2,6,8,11,13,16,17,19],third:[3,7,8,11,25],thirti:6,those:[2,3,5,11,13,15,19,21,25],though:[6,16],thought:[8,16],thousand:6,thread:[2,16],three:[2,3,5,6,8,11,12,15,17,19,21],through:[1,6,8,17,19,20,24,25],thun:[2,3,4,10,13,16],thunder:8,thunk:16,time:[3,5,6,8,9,11,13,15,16,19,20],titl:19,to_check:5,to_index:24,to_set:11,todai:8,todo:[8,22],togeth:[7,8,16,19,21],token:22,toler:21,too:[5,13,19],tool:[8,19],tooo:19,top:[2,3,8,13,19,23,24],total:6,tower:19,trace:[0,8,12,13,15,20,21,24],traceback:19,traceprint:23,track:[12,19,20],tracker:0,transform:4,transit:5,translat:[4,12,19,21],trap:5,travers:[0,21],treasur:0,treat:[0,2,3,13,19,21],treatment:7,tree:[0,8,21],treegrind:21,treestep:[0,21],tri:6,triangl:16,triangular_numb:13,trick:[6,19],tricki:19,trobe:0,trove:0,truediv:25,truthi:[3,8,16,19],ts:17,tuck:[3,8,19,25],tupl:[3,5,8,19,24],turn:[2,3,5,19,21],twice:[11,13],two:[0,2,3,6,8,9,11,12,13,15,16,17,18,19,20,21,24,25],txt:[],type:[0,1,4,8,11,13,16,21,22,23,24],typeerror:19,typeless:19,typic:[2,3,12,13],u:[18,19],uh:19,ui:8,ulam:[0,15],unari:8,unarybuiltinwrapp:3,unbalanc:[11,22],unbound:25,unchang:[3,11],uncompil:19,uncon:[3,7,8,11,13,17,20,25],under:[2,3,8,11],underli:[5,16,19],underscor:19,understand:[0,11],undistinguish:11,undocu:8,unfinish:5,unfortun:24,unicod:19,unif:[19,21],unifi:18,union:5,uniqu:[3,5,11,19],unit:[3,8,13,16,25],univers:[0,8,16,19],unknownsymbolerror:1,unlik:16,unnecessari:21,unnecesssari:19,unpack:[2,3,11,24],unpair:6,unquot:[8,15,17,22],unread:[0,15],unrol:5,unstack:19,unswon:[3,25],untangl:13,until:[5,7,16],unus:6,unusu:11,unwrap:5,up:[1,2,3,6,7,8,11,13,14,15,16,19,20,24],updat:[0,18,21,25],uppercas:5,upward:16,us:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,20,21,22,24,25],usag:8,user:17,usual:[0,2,13],util:[0,3,14,18,19],uu:19,v0:25,v:[2,6,7,9,11,12,13,14,15,17,20,21],valid:19,valu:[0,1,2,3,6,8,9,12,13,14,15,16,17,19,21,22,24,25],value_n:11,valueerror:[5,19,24],variabl:[19,21],variant:11,variat:[13,16,21],varieti:[4,8],variou:0,ve:[11,15,19],vener:24,verbos:4,veri:[0,1,4,5,8,11,15,24],versa:[2,19],version:[0,1,2,5,7,10,17,20,21],vi:21,via:8,vice:[2,19],view:[11,21],viewer:[1,8,10,23],vii:21,visibl:19,von:[0,2,3,4,13],vs:19,vv:19,w:[3,11,13,17,19],wa:[2,6,8,11,15,16,19,24],waaaai:5,wai:[0,2,3,4,5,6,8,13,14,15,16,19],wait:16,want:[2,6,7,9,11,13,19],warranti:[3,8],wash:8,wast:8,we:[2,5,6,7,8,9,10,12,13,14,15,16,19,20,21,24],web:24,websit:[0,6],welcom:8,well:[0,4,8,9,11,19,22],went:19,were:[8,19,20],what:[2,3,4,5,8,11,13,16,17,19,23],whatev:[2,3,13,17,24],when:[6,7,8,11,13,16,19,20,22,24,25],where:[2,3,5,8,11,13,15,19,21,24],whether:[3,13],which:[0,1,3,5,6,8,9,11,15,16,17,19,20,22,24,25],whole:[2,3,6,13,17,19],whose:7,why:[9,16,17],wiki:11,wikipedia:[0,11,20],wildli:8,wind:8,wire:13,within:[8,11,14,21],without:[2,8,11,12,15,16,19],won:[11,19,24],word:[0,3,6,8,13,20],work:[0,3,5,6,7,8,9,11,12,13,15,16,17,20,21,24,25],worker:16,worri:16,worth:6,would:[2,6,7,8,9,11,13,16,19,20,24],wrap:[3,8],wrapper:19,write:[4,5,9,11,13,15,16,17,19,20,21,24],written:[0,1,9,11,14,19,24],wrong:2,wrote:19,x:[0,3,5,6,8,9,16,20,21],xor:3,xrang:19,y:[2,3,5,15,16],yang:19,yeah:16,year:[8,19],yet:[11,16,19,20],yield:[2,3,13,19,24],yin:21,you:[0,2,3,5,6,7,8,10,11,12,13,14,15,16,17,19,20,23,24,25],your:[2,3,8,13,19],yourself:[5,8,11],z:[3,5,16,19,21],zero:[3,5,11,13,16,17,19,22,24],zerodivisionerror:19,zip:[3,5,6,19],zip_:3,zipper:[0,21],zstr:20},titles:["Thun 0.4.1 Documentation","Joy Interpreter","Functions Grouped by, er, Function with Examples","Function Reference","Categorical Programming","\u2202RE","Developing a Program in Joy","Using x to Generate Values","Thun: Joy in Python","Newton\u2019s method","No Updates","Treating Trees I: Ordered Binary Trees","Quadratic formula","Recursion Combinators","Replacing Functions in the Dictionary","Square Spiral Example Joy Code","The Four Fundamental Operations of Definite Action","Treating Trees II: treestep","Type Checking","The Blissful Elegance of Typing Joy","Traversing Datastructures with Zippers","Essays about Programming in Joy","Parsing Text into Joy Expressions","Tracing Joy Execution","Stack or Quote or Sequence or List\u2026","Type Inference of Joy Expressions"],titleterms:{"0":[0,13],"01":5,"1":[0,13],"11":5,"111":5,"2":[7,12,19],"2a":12,"3":[6,19],"4":[0,12,19],"466":7,"5":6,"\u03bb":5,"\u03d5":5,"boolean":15,"case":[9,11],"do":17,"function":[2,3,5,8,9,11,13,14,16,17,19],"long":14,"new":11,"p\u00f6ial":19,"try":5,"void":2,"while":[2,16],A:[5,6,7,9,11,14],If:11,In:[11,17],No:[5,10],Not:15,One:[7,11],The:[6,8,11,13,15,16,17,19],There:8,With:[5,17],about:21,action:16,ad:11,add:[2,11],address:20,al:13,alphabet:5,altern:17,an:[6,7,8,11,13,18,19,20],ana:13,analysi:6,anamorph:[2,13],app1:2,app2:2,app3:2,appendix:[11,13,19],appli:16,approxim:9,ar:11,argument:19,auto:3,averag:2,b:[2,12],base:[9,11],binari:[2,11,17],bliss:19,both:11,branch:[2,11,15,16],brzozowski:5,c:[12,19],can:11,cata:13,catamorph:13,categor:4,chatter:2,check:18,child:11,choic:2,clear:2,cleav:[2,16],cmp:11,code:[0,8,11,15],combin:[2,11,13,19],comment:19,compact:5,compar:11,comparison:2,compil:[7,19],compile_:19,compos:19,comput:9,con:[2,19],concat:2,conclus:[13,15,19],consecut:9,continu:8,current:11,datastructur:[5,8,11,20],deal:19,decrement:15,defin:[11,17],definit:[12,16],delabel:19,delet:11,deriv:[5,12,13,17],design:13,determin:20,develop:6,diagram:5,dialect:0,dictionari:14,dip:[2,20],dipd:2,dipdd:2,direco:7,disenstacken:2,distinguish:19,div:2,doc_from_stack_effect:19,document:0,doe:11,down_to_zero:2,drive:5,drop:2,dup:[2,19],dupd:2,dupdip:2,e:17,effect:19,eleg:19,els:11,empti:11,enstacken:2,equal:11,er:2,essai:21,et:13,euler:[6,7],eval:8,even:7,exampl:[0,2,8,11,13,15,17,18],execut:23,explor:5,express:[5,8,22,25],extract:17,f:11,factori:13,fail:18,fibonacci:7,filter:6,find:[9,11,13],finish:16,finit:5,first:[2,6,15,16,19],five:7,flatten:2,flexibl:17,floordiv:2,form:15,formula:12,found:11,four:[13,16],from:13,fsm:5,fulmin:16,fun:13,fundament:16,further:6,gcd:2,gener:[3,5,6,7,9,13,15],genrec:2,get:[11,17],getitem:2,given:[13,17],greater:11,group:2,h1:13,h2:13,h3:13,h4:13,handl:16,have:[11,17],help:2,highest:11,host:0,how:[6,7],hybrid:19,hylo:13,hylomorph:13,i:[2,5,11,19],identifi:19,ift:[2,16],ii:[17,19],iii:19,implement:[5,19],increment:15,indic:0,infer:[19,25],inferenc:19,inform:0,infra:[2,20],integ:[6,13],interest:7,interlud:11,intern:22,interpret:[1,8,19],item:20,iter:[6,11],iv:19,joi:[0,1,3,6,8,13,15,19,20,21,22,23,24,25],join:16,just:6,kei:11,kind:16,languag:0,larger:5,least_fract:2,left:11,less:11,let:[5,6],letter:5,librari:[3,8,19],like:11,list:[2,13,24],literari:8,littl:6,logic:[2,19],loop:[2,8,16],lower:11,lshift:2,machin:5,make:[7,9],mani:6,map:[2,16],match:5,math:2,memoiz:5,method:9,min:2,miscellan:2,mod:2,modifi:19,modulu:2,more:11,most:11,mul:[2,19],multipl:[6,7,19],must:11,n:13,name:12,ne:2,neg:[2,15],newton:9,next:9,node:11,non:11,now:11,nullari:2,nulli:5,number:[13,19],one:8,onli:8,oper:16,order:[11,17],origin:15,osdn:0,other:16,our:11,out:5,over:2,p:17,pack:6,pam:[2,16],para:13,paradigm:19,parallel:16,parameter:[11,17],pars:[2,22],parser:[8,22],part:19,pass:8,path:20,pattern:13,per:11,piec:15,pop:[2,19],popd:2,popop:2,pow:2,power:7,pred:2,predic:[6,9,11,15,17],pretty_print:23,primit:13,primrec:2,print:8,problem:[6,7],process:11,product:2,program:[4,6,12,17,21],progress:19,project:[0,6,7],pure:8,put:[11,12,15,17],python:[8,14,19],quadrat:12,quick:0,quot:[2,24],rang:[2,6,13],range_to_zero:2,re:[5,11],read:8,recur:[9,11],recurs:[11,13,17],redefin:[11,17],refactor:[6,11],refer:3,regular:[5,8],reimplement:17,relabel:19,rem:2,remaind:2,remov:2,render:6,repl:8,replac:[11,14],repres:[5,19],represent:5,reset:7,rest:[2,19],revers:[2,5,18],right:[11,20],rightmost:11,roll:[2,19],rolldown:2,rollup:2,rshift:2,rule:[5,19],run:[2,7],s:[5,6,9,11,19],second:[2,19],select:2,sequenc:[7,16,19,24],set:[9,11],shorter:14,should:8,shunt:2,simpl:19,simplest:6,size:[2,14],sourc:11,special:[13,19],spiral:15,sqr:[2,19],sqrt:[2,12],squar:15,stack:[2,8,19,24],start:0,state:5,step:[2,13,17],straightforward:12,stream:5,string:5,structur:11,style:8,sub:[2,11],subtyp:19,succ:2,sum:[2,6],swaack:2,swap:[2,19],swon:2,swoncat:2,symbol:[8,13],t:17,tabl:0,tail:13,take:2,term:[6,7,17],ternari:2,text:22,than:11,them:12,thi:11,third:[2,19],three:7,thun:[0,8],time:[2,7],togeth:[11,12,15,17],token:8,toler:9,trace:[14,23],traceprint:8,trampolin:5,translat:15,travers:[11,17,20],treat:[11,17],tree:[11,17,20],treegrind:17,treestep:17,triangular:13,truediv:2,truthi:2,tuck:2,turn:15,two:[5,7],type:[18,19,25],unari:2,unbound:19,uncon:[2,19],unif:18,unifi:19,unit:2,unnecessari:6,unquot:2,unstack:2,up:9,updat:[10,19],us:[7,19],util:[23,24,25],v:19,valu:[7,11],variabl:12,variat:7,version:[6,11,14,19],vi:19,view:8,vii:19,we:[11,17],which:13,within:9,word:2,work:[18,19],write:12,x:[2,7,15],xor:2,yin:19,z:20,zero:7,zip:2,zipper:20}}) \ No newline at end of file diff --git a/docs/sphinx_docs/_build/html/stack.html b/docs/sphinx_docs/_build/html/stack.html index ab153d5..2d6ad97 100644 --- a/docs/sphinx_docs/_build/html/stack.html +++ b/docs/sphinx_docs/_build/html/stack.html @@ -280,7 +280,7 @@ won’t work because Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.
    diff --git a/docs/sphinx_docs/_build/html/types.html b/docs/sphinx_docs/_build/html/types.html index a7e9539..e0f9ec1 100644 --- a/docs/sphinx_docs/_build/html/types.html +++ b/docs/sphinx_docs/_build/html/types.html @@ -49,25 +49,25 @@ information is available.)

    joy.utils.types

    Curently (asterix after name indicates a function that can be auto-compiled to Python):

    -
    _Tree_add_Ee = ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) *
    -_Tree_delete_R0 = ([a2 ...1] a1 -- [a2 ...1] a2 a1 a1) *
    -_Tree_delete_clear_stuff = (a3 a2 [a1 ...1] -- [...1]) *
    -_Tree_get_E = ([a3 a4 ...1] a2 a1 -- a4) *
    +
    _Tree_add_Ee = ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) *
    +_Tree_delete_R0 = ([a2 ...1] a1 -- [a2 ...1] a2 a1 a1) *
    +_Tree_delete_clear_stuff = (a3 a2 [a1 ...1] -- [...1]) *
    +_Tree_get_E = ([a3 a4 ...1] a2 a1 -- a4) *
     add = (n1 n2 -- n3)
     and = (b1 b2 -- b3)
     bool = (a1 -- b1)
    -ccons = (a2 a1 [...1] -- [a2 a1 ...1]) *
    -cons = (a1 [...0] -- [a1 ...0]) *
    +ccons = (a2 a1 [...1] -- [a2 a1 ...1]) *
    +cons = (a1 [...0] -- [a1 ...0]) *
     div = (n1 n2 -- n3)
     divmod = (n2 n1 -- n4 n3)
     dup = (a1 -- a1 a1) *
     dupd = (a2 a1 -- a2 a2 a1) *
     dupdd = (a3 a2 a1 -- a3 a3 a2 a1) *
     eq = (n1 n2 -- b1)
    -first = ([a1 ...1] -- a1) *
    -first_two = ([a1 a2 ...1] -- a1 a2) *
    +first = ([a1 ...1] -- a1) *
    +first_two = ([a1 a2 ...1] -- a1 a2) *
     floordiv = (n1 n2 -- n3)
    -fourth = ([a1 a2 a3 a4 ...1] -- a4) *
    +fourth = ([a1 a2 a3 a4 ...1] -- a4) *
     ge = (n1 n2 -- b1)
     gt = (n1 n2 -- b1)
     le = (n1 n2 -- b1)
    @@ -88,27 +88,27 @@ auto-compiled to Python):

    popopdd = (a4 a3 a2 a1 -- a2 a1) * pow = (n1 n2 -- n3) pred = (n1 -- n2) -rest = ([a1 ...0] -- [...0]) * +rest = ([a1 ...0] -- [...0]) * rolldown = (a1 a2 a3 -- a2 a3 a1) * rollup = (a1 a2 a3 -- a3 a1 a2) * -rrest = ([a1 a2 ...1] -- [...1]) * +rrest = ([a1 a2 ...1] -- [...1]) * rshift = (n1 n2 -- n3) -second = ([a1 a2 ...1] -- a2) * +second = ([a1 a2 ...1] -- a2) * sqrt = (n1 -- n2) stack = (... -- ... [...]) * stuncons = (... a1 -- ... a1 a1 [...]) * stununcons = (... a2 a1 -- ... a2 a1 a1 a2 [...]) * sub = (n1 n2 -- n3) succ = (n1 -- n2) -swaack = ([...1] -- [...0]) * +swaack = ([...1] -- [...0]) * swap = (a1 a2 -- a2 a1) * -swons = ([...1] a1 -- [a1 ...1]) * -third = ([a1 a2 a3 ...1] -- a3) * +swons = ([...1] a1 -- [a1 ...1]) * +third = ([a1 a2 a3 ...1] -- a3) * truediv = (n1 n2 -- n3) tuck = (a2 a1 -- a1 a2 a1) * -uncons = ([a1 ...0] -- a1 [...0]) * +uncons = ([a1 ...0] -- a1 [...0]) * unit = (a1 -- [a1 ]) * -unswons = ([a1 ...1] -- [...1] a1) * +unswons = ([a1 ...1] -- [...1] a1) *

    Example output of the infer() function. The first number on each @@ -246,7 +246,7 @@ far.


    Thun Documentation by Simon Forman is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
    Based on a work at https://osdn.net/projects/joypy/. - Created using Sphinx 4.3.0. + Created using Sphinx 4.4.0.