diff options
Diffstat (limited to 'js/scripting-lang/docs')
65 files changed, 13425 insertions, 4922 deletions
diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Bold-webfont.eot b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Bold-webfont.eot index 5d20d91..5d20d91 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Bold-webfont.eot +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Bold-webfont.eot Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Bold-webfont.svg b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Bold-webfont.svg index 3ed7be4..3ed7be4 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Bold-webfont.svg +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Bold-webfont.svg diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Bold-webfont.woff b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Bold-webfont.woff index 1205787..1205787 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Bold-webfont.woff +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Bold-webfont.woff Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-BoldItalic-webfont.eot b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-BoldItalic-webfont.eot index 1f639a1..1f639a1 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-BoldItalic-webfont.eot +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-BoldItalic-webfont.eot Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-BoldItalic-webfont.svg b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-BoldItalic-webfont.svg index 6a2607b..6a2607b 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-BoldItalic-webfont.svg +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-BoldItalic-webfont.svg diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff index ed760c0..ed760c0 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Italic-webfont.eot b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Italic-webfont.eot index 0c8a0ae..0c8a0ae 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Italic-webfont.eot +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Italic-webfont.eot Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Italic-webfont.svg b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Italic-webfont.svg index e1075dc..e1075dc 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Italic-webfont.svg +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Italic-webfont.svg diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Italic-webfont.woff b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Italic-webfont.woff index ff652e6..ff652e6 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Italic-webfont.woff +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Italic-webfont.woff Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Light-webfont.eot b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Light-webfont.eot index 1486840..1486840 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Light-webfont.eot +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Light-webfont.eot Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Light-webfont.svg b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Light-webfont.svg index 11a472c..11a472c 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Light-webfont.svg +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Light-webfont.svg diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Light-webfont.woff b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Light-webfont.woff index e786074..e786074 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Light-webfont.woff +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Light-webfont.woff Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-LightItalic-webfont.eot b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-LightItalic-webfont.eot index 8f44592..8f44592 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-LightItalic-webfont.eot +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-LightItalic-webfont.eot Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-LightItalic-webfont.svg b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-LightItalic-webfont.svg index 431d7e3..431d7e3 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-LightItalic-webfont.svg +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-LightItalic-webfont.svg diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-LightItalic-webfont.woff b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-LightItalic-webfont.woff index 43e8b9e..43e8b9e 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-LightItalic-webfont.woff +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-LightItalic-webfont.woff Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Regular-webfont.eot b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Regular-webfont.eot index 6bbc3cf..6bbc3cf 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Regular-webfont.eot +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Regular-webfont.eot Binary files differdiff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Regular-webfont.svg b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Regular-webfont.svg index 25a3952..25a3952 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Regular-webfont.svg +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Regular-webfont.svg diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Regular-webfont.woff b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Regular-webfont.woff index e231183..e231183 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/fonts/OpenSans-Regular-webfont.woff +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Regular-webfont.woff Binary files differdiff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.eot b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.eot new file mode 100755 index 0000000..d8375dd --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.eot Binary files differdiff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.svg b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.svg new file mode 100755 index 0000000..eec4db8 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.svg @@ -0,0 +1,1830 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="open_sanssemibold" horiz-adv-x="1169" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode="fi" horiz-adv-x="1315" d="M35 0zM723 928h-270v-928h-236v928h-182v110l182 72v72q0 196 92 290.5t281 94.5q124 0 244 -41l-62 -178q-87 28 -166 28q-80 0 -116.5 -49.5t-36.5 -148.5v-72h270v-178zM1146 0h-235v1106h235v-1106zM897 1399q0 63 34.5 97t98.5 34q62 0 96.5 -34t34.5 -97 q0 -60 -34.5 -94.5t-96.5 -34.5q-64 0 -98.5 34.5t-34.5 94.5z" /> +<glyph unicode="fl" horiz-adv-x="1315" d="M35 0zM723 928h-270v-928h-236v928h-182v110l182 72v72q0 196 92 290.5t281 94.5q124 0 244 -41l-62 -178q-87 28 -166 28q-80 0 -116.5 -49.5t-36.5 -148.5v-72h270v-178zM1146 0h-235v1556h235v-1556z" /> +<glyph unicode="ffi" horiz-adv-x="2058" d="M35 0zM723 928h-270v-928h-236v928h-182v110l182 72v72q0 196 92 290.5t281 94.5q124 0 244 -41l-62 -178q-87 28 -166 28q-80 0 -116.5 -49.5t-36.5 -148.5v-72h270v-178zM1466 928h-270v-928h-236v928h-182v110l182 72v72q0 196 92 290.5t281 94.5q124 0 244 -41 l-62 -178q-87 28 -166 28q-80 0 -116.5 -49.5t-36.5 -148.5v-72h270v-178zM1890 0h-235v1106h235v-1106zM1641 1399q0 63 34.5 97t98.5 34q62 0 96.5 -34t34.5 -97q0 -60 -34.5 -94.5t-96.5 -34.5q-64 0 -98.5 34.5t-34.5 94.5z" /> +<glyph unicode="ffl" horiz-adv-x="2058" d="M35 0zM723 928h-270v-928h-236v928h-182v110l182 72v72q0 196 92 290.5t281 94.5q124 0 244 -41l-62 -178q-87 28 -166 28q-80 0 -116.5 -49.5t-36.5 -148.5v-72h270v-178zM1466 928h-270v-928h-236v928h-182v110l182 72v72q0 196 92 290.5t281 94.5q124 0 244 -41 l-62 -178q-87 28 -166 28q-80 0 -116.5 -49.5t-36.5 -148.5v-72h270v-178zM1890 0h-235v1556h235v-1556z" /> +<glyph horiz-adv-x="2048" /> +<glyph horiz-adv-x="2048" /> +<glyph unicode="
" horiz-adv-x="1044" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="	" horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="565" d="M371 444h-174l-52 1018h277zM133 125q0 74 39 112.5t111 38.5q71 0 109 -40t38 -111t-38.5 -112.5t-108.5 -41.5q-71 0 -110.5 40t-39.5 114z" /> +<glyph unicode=""" horiz-adv-x="893" d="M365 1462l-41 -528h-150l-41 528h232zM760 1462l-41 -528h-150l-41 528h232z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M989 870l-55 -284h270v-168h-303l-80 -418h-178l80 418h-248l-80 -418h-174l76 418h-250v168h283l57 284h-264v168h293l80 422h180l-80 -422h252l80 422h174l-80 -422h252v-168h-285zM506 586h250l57 284h-250z" /> +<glyph unicode="$" d="M1063 453q0 -145 -106 -239t-306 -116v-217h-133v211q-248 4 -407 76v211q86 -42 201 -70.5t206 -29.5v374l-84 31q-164 63 -239.5 150.5t-75.5 216.5q0 138 107.5 227t291.5 108v168h133v-165q203 -7 385 -82l-73 -183q-157 62 -312 74v-364l76 -29q190 -73 263 -154 t73 -198zM827 438q0 58 -40.5 95.5t-135.5 72.5v-319q176 27 176 151zM354 1053q0 -57 35.5 -95t128.5 -75v311q-80 -12 -122 -49t-42 -92z" /> +<glyph unicode="%" horiz-adv-x="1765" d="M279 1024q0 -149 29 -222t95 -73q132 0 132 295t-132 295q-66 0 -95 -73t-29 -222zM729 1026q0 -230 -82.5 -345.5t-243.5 -115.5q-152 0 -235.5 119.5t-83.5 341.5q0 457 319 457q157 0 241.5 -118.5t84.5 -338.5zM1231 440q0 -149 29.5 -223t95.5 -74q131 0 131 297 q0 293 -131 293q-66 0 -95.5 -72t-29.5 -221zM1681 440q0 -230 -83 -345t-242 -115q-152 0 -236 118.5t-84 341.5q0 457 320 457q154 0 239.5 -118t85.5 -339zM1384 1462l-811 -1462h-194l811 1462h194z" /> +<glyph unicode="&" horiz-adv-x="1516" d="M451 1147q0 -63 33.5 -119t93.5 -119q113 64 158.5 119.5t45.5 124.5q0 65 -43.5 104t-115.5 39q-79 0 -125.5 -40.5t-46.5 -108.5zM600 182q183 0 313 107l-383 377q-106 -68 -146 -127.5t-40 -135.5q0 -98 69.5 -159.5t186.5 -61.5zM96 387q0 131 64 228.5t231 193.5 q-95 111 -129.5 187.5t-34.5 158.5q0 152 108.5 240t291.5 88q177 0 278 -85.5t101 -230.5q0 -114 -67.5 -207t-225.5 -186l346 -334q81 107 135 314h242q-70 -284 -224 -463l301 -291h-303l-149 145q-102 -82 -217.5 -123.5t-255.5 -41.5q-230 0 -361 109t-131 298z" /> +<glyph unicode="'" horiz-adv-x="498" d="M365 1462l-41 -528h-150l-41 528h232z" /> +<glyph unicode="(" horiz-adv-x="649" d="M82 561q0 265 77.5 496t223.5 405h205q-139 -188 -213 -421.5t-74 -477.5t74 -473t211 -414h-203q-147 170 -224 397t-77 488z" /> +<glyph unicode=")" horiz-adv-x="649" d="M567 561q0 -263 -77.5 -490t-223.5 -395h-203q138 187 211.5 415t73.5 472q0 245 -74 477.5t-213 421.5h205q147 -175 224 -406.5t77 -494.5z" /> +<glyph unicode="*" horiz-adv-x="1122" d="M672 1556l-41 -382l385 108l28 -217l-360 -29l236 -311l-199 -107l-166 338l-149 -338l-205 107l231 311l-358 29l35 217l376 -108l-41 382h228z" /> +<glyph unicode="+" d="M494 633h-398v178h398v408h180v-408h399v-178h-399v-406h-180v406z" /> +<glyph unicode="," horiz-adv-x="547" d="M412 215q-48 -186 -176 -479h-173q69 270 103 502h231z" /> +<glyph unicode="-" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" /> +<glyph unicode="." horiz-adv-x="563" d="M133 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" /> +<glyph unicode="/" horiz-adv-x="799" d="M782 1462l-544 -1462h-222l545 1462h221z" /> +<glyph unicode="0" d="M1081 731q0 -381 -122.5 -566t-374.5 -185q-244 0 -370 191t-126 560q0 387 122.5 570.5t373.5 183.5q245 0 371 -192t126 -562zM326 731q0 -299 61.5 -427t196.5 -128t197.5 130t62.5 425q0 294 -62.5 425.5t-197.5 131.5t-196.5 -129t-61.5 -428z" /> +<glyph unicode="1" d="M780 0h-235v944q0 169 8 268q-23 -24 -56.5 -53t-224.5 -184l-118 149l430 338h196v-1462z" /> +<glyph unicode="2" d="M1081 0h-991v178l377 379q167 171 221.5 242.5t79.5 134.5t25 135q0 99 -59.5 156t-164.5 57q-84 0 -162.5 -31t-181.5 -112l-127 155q122 103 237 146t245 43q204 0 327 -106.5t123 -286.5q0 -99 -35.5 -188t-109 -183.5t-244.5 -255.5l-254 -246v-10h694v-207z" /> +<glyph unicode="3" d="M1026 1126q0 -139 -81 -231.5t-228 -124.5v-8q176 -22 264 -109.5t88 -232.5q0 -211 -149 -325.5t-424 -114.5q-243 0 -410 79v209q93 -46 197 -71t200 -25q170 0 254 63t84 195q0 117 -93 172t-292 55h-127v191h129q350 0 350 242q0 94 -61 145t-180 51 q-83 0 -160 -23.5t-182 -91.5l-115 164q201 148 467 148q221 0 345 -95t124 -262z" /> +<glyph unicode="4" d="M1133 319h-197v-319h-229v319h-668v181l668 966h229v-952h197v-195zM707 514v367q0 196 10 321h-8q-28 -66 -88 -160l-363 -528h449z" /> +<glyph unicode="5" d="M586 913q221 0 350 -117t129 -319q0 -234 -146.5 -365.5t-416.5 -131.5q-245 0 -385 79v213q81 -46 186 -71t195 -25q159 0 242 71t83 208q0 262 -334 262q-47 0 -116 -9.5t-121 -21.5l-105 62l56 714h760v-209h-553l-33 -362q35 6 85.5 14t123.5 8z" /> +<glyph unicode="6" d="M94 623q0 858 699 858q110 0 186 -17v-196q-76 22 -176 22q-235 0 -353 -126t-128 -404h12q47 81 132 125.5t200 44.5q199 0 310 -122t111 -331q0 -230 -128.5 -363.5t-350.5 -133.5q-157 0 -273 75.5t-178.5 220t-62.5 347.5zM604 174q121 0 186.5 78t65.5 223 q0 126 -61.5 198t-184.5 72q-76 0 -140 -32.5t-101 -89t-37 -115.5q0 -141 76.5 -237.5t195.5 -96.5z" /> +<glyph unicode="7" d="M256 0l578 1253h-760v207h1011v-164l-575 -1296h-254z" /> +<glyph unicode="8" d="M584 1481q208 0 329 -95.5t121 -255.5q0 -225 -270 -358q172 -86 244.5 -181t72.5 -212q0 -181 -133 -290t-360 -109q-238 0 -369 102t-131 289q0 122 68.5 219.5t224.5 173.5q-134 80 -191 169t-57 200q0 159 125 253.5t326 94.5zM313 379q0 -104 73 -161.5t198 -57.5 q129 0 200.5 59.5t71.5 161.5q0 81 -66 148t-200 124l-29 13q-132 -58 -190 -127.5t-58 -159.5zM582 1300q-100 0 -161 -49.5t-61 -134.5q0 -52 22 -93t64 -74.5t142 -80.5q120 53 169.5 111.5t49.5 136.5q0 85 -61.5 134.5t-163.5 49.5z" /> +<glyph unicode="9" d="M1079 838q0 -432 -174 -645t-524 -213q-133 0 -191 16v197q89 -25 179 -25q238 0 355 128t128 402h-12q-59 -90 -142.5 -130t-195.5 -40q-194 0 -305 121t-111 332q0 229 128.5 364.5t350.5 135.5q156 0 272 -76t179 -220.5t63 -346.5zM569 1286q-122 0 -187 -79.5 t-65 -223.5q0 -125 60.5 -196.5t183.5 -71.5q119 0 200 71t81 166q0 89 -34.5 166.5t-96.5 122.5t-142 45z" /> +<glyph unicode=":" horiz-adv-x="563" d="M133 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113zM133 979q0 151 148 151q75 0 112 -40t37 -111t-38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" /> +<glyph unicode=";" horiz-adv-x="569" d="M397 238l15 -23q-48 -186 -176 -479h-173q69 270 103 502h231zM131 979q0 151 148 151q75 0 112 -40t37 -111t-38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" /> +<glyph unicode="<" d="M1073 221l-977 430v121l977 488v-195l-733 -344l733 -303v-197z" /> +<glyph unicode="=" d="M102 831v179h963v-179h-963zM102 432v178h963v-178h-963z" /> +<glyph unicode=">" d="M96 418l733 303l-733 344v195l977 -488v-121l-977 -430v197z" /> +<glyph unicode="?" horiz-adv-x="928" d="M283 444v64q0 110 40 183t140 151q119 94 153.5 146t34.5 124q0 84 -56 129t-161 45q-95 0 -176 -27t-158 -65l-84 176q203 113 435 113q196 0 311 -96t115 -265q0 -75 -22 -133.5t-66.5 -111.5t-153.5 -138q-93 -73 -124.5 -121t-31.5 -129v-45h-196zM242 125 q0 151 147 151q72 0 110 -39.5t38 -111.5q0 -71 -38.5 -112.5t-109.5 -41.5t-109 40.5t-38 113.5z" /> +<glyph unicode="@" horiz-adv-x="1839" d="M1726 739q0 -143 -45 -261.5t-126.5 -184.5t-188.5 -66q-79 0 -137 42t-78 114h-12q-49 -78 -121 -117t-162 -39q-163 0 -256.5 105t-93.5 284q0 206 124 334.5t333 128.5q76 0 168.5 -13.5t164.5 -37.5l-22 -465v-24q0 -160 104 -160q79 0 125.5 102t46.5 260 q0 171 -70 300.5t-199 199.5t-296 70q-213 0 -370.5 -88t-240.5 -251.5t-83 -379.5q0 -290 155 -446t445 -156q221 0 461 90v-164q-210 -86 -457 -86q-370 0 -577 199.5t-207 556.5q0 261 112 464.5t310.5 311.5t449.5 108q217 0 386.5 -90t263 -256.5t93.5 -384.5zM698 612 q0 -233 183 -233q193 0 211 293l12 239q-63 17 -135 17q-128 0 -199.5 -85t-71.5 -231z" /> +<glyph unicode="A" horiz-adv-x="1354" d="M1100 0l-146 406h-559l-143 -406h-252l547 1468h260l547 -1468h-254zM891 612l-137 398q-15 40 -41.5 126t-36.5 126q-27 -123 -79 -269l-132 -381h426z" /> +<glyph unicode="B" horiz-adv-x="1352" d="M193 1462h434q302 0 436.5 -88t134.5 -278q0 -128 -66 -213t-190 -107v-10q154 -29 226.5 -114.5t72.5 -231.5q0 -197 -137.5 -308.5t-382.5 -111.5h-528v1462zM432 858h230q150 0 219 47.5t69 161.5q0 103 -74.5 149t-236.5 46h-207v-404zM432 664v-463h254 q150 0 226.5 57.5t76.5 181.5q0 114 -78 169t-237 55h-242z" /> +<glyph unicode="C" horiz-adv-x="1298" d="M815 1278q-206 0 -324 -146t-118 -403q0 -269 113.5 -407t328.5 -138q93 0 180 18.5t181 47.5v-205q-172 -65 -390 -65q-321 0 -493 194.5t-172 556.5q0 228 83.5 399t241.5 262t371 91q224 0 414 -94l-86 -199q-74 35 -156.5 61.5t-173.5 26.5z" /> +<glyph unicode="D" horiz-adv-x="1503" d="M1382 745q0 -362 -201 -553.5t-579 -191.5h-409v1462h452q349 0 543 -188t194 -529zM1130 737q0 525 -491 525h-207v-1061h170q528 0 528 536z" /> +<glyph unicode="E" horiz-adv-x="1143" d="M1020 0h-827v1462h827v-202h-588v-398h551v-200h-551v-459h588v-203z" /> +<glyph unicode="F" horiz-adv-x="1090" d="M430 0h-237v1462h825v-202h-588v-457h551v-203h-551v-600z" /> +<glyph unicode="G" horiz-adv-x="1487" d="M791 793h538v-734q-132 -43 -253.5 -61t-262.5 -18q-332 0 -512 196.5t-180 554.5q0 353 203 552.5t559 199.5q229 0 434 -88l-84 -199q-178 82 -356 82q-234 0 -370 -147t-136 -402q0 -268 122.5 -407.5t352.5 -139.5q116 0 248 29v377h-303v205z" /> +<glyph unicode="H" horiz-adv-x="1538" d="M1346 0h-240v659h-674v-659h-239v1462h239v-598h674v598h240v-1462z" /> +<glyph unicode="I" horiz-adv-x="625" d="M193 0v1462h239v-1462h-239z" /> +<glyph unicode="J" horiz-adv-x="612" d="M8 -408q-98 0 -164 25v201q84 -21 146 -21q196 0 196 248v1417h240v-1409q0 -224 -106.5 -342.5t-311.5 -118.5z" /> +<glyph unicode="K" horiz-adv-x="1309" d="M1309 0h-277l-459 662l-141 -115v-547h-239v1462h239v-698q98 120 195 231l395 467h272q-383 -450 -549 -641z" /> +<glyph unicode="L" horiz-adv-x="1110" d="M193 0v1462h239v-1257h619v-205h-858z" /> +<glyph unicode="M" horiz-adv-x="1890" d="M825 0l-424 1221h-8q17 -272 17 -510v-711h-217v1462h337l406 -1163h6l418 1163h338v-1462h-230v723q0 109 5.5 284t9.5 212h-8l-439 -1219h-211z" /> +<glyph unicode="N" horiz-adv-x="1604" d="M1411 0h-293l-719 1165h-8l5 -65q14 -186 14 -340v-760h-217v1462h290l717 -1159h6q-2 23 -8 167.5t-6 225.5v766h219v-1462z" /> +<glyph unicode="O" horiz-adv-x="1612" d="M1491 733q0 -357 -178.5 -555t-505.5 -198q-331 0 -508.5 196.5t-177.5 558.5t178.5 556t509.5 194q326 0 504 -197t178 -555zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139q-215 0 -324.5 -139t-109.5 -408z" /> +<glyph unicode="P" horiz-adv-x="1260" d="M1161 1020q0 -229 -150 -351t-427 -122h-152v-547h-239v1462h421q274 0 410.5 -112t136.5 -330zM432 748h127q184 0 270 64t86 200q0 126 -77 188t-240 62h-166v-514z" /> +<glyph unicode="Q" horiz-adv-x="1612" d="M1491 733q0 -266 -101.5 -448t-295.5 -256l350 -377h-322l-276 328h-39q-331 0 -508.5 196.5t-177.5 558.5t178.5 556t509.5 194q326 0 504 -197t178 -555zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139 q-215 0 -324.5 -139t-109.5 -408z" /> +<glyph unicode="R" horiz-adv-x="1309" d="M432 782h166q167 0 242 62t75 184q0 124 -81 178t-244 54h-158v-478zM432 584v-584h-239v1462h413q283 0 419 -106t136 -320q0 -273 -284 -389l413 -647h-272l-350 584h-236z" /> +<glyph unicode="S" horiz-adv-x="1126" d="M1036 397q0 -195 -141 -306t-389 -111t-406 77v226q100 -47 212.5 -74t209.5 -27q142 0 209.5 54t67.5 145q0 82 -62 139t-256 135q-200 81 -282 185t-82 250q0 183 130 288t349 105q210 0 418 -92l-76 -195q-195 82 -348 82q-116 0 -176 -50.5t-60 -133.5 q0 -57 24 -97.5t79 -76.5t198 -95q161 -67 236 -125t110 -131t35 -172z" /> +<glyph unicode="T" horiz-adv-x="1159" d="M698 0h-239v1257h-430v205h1099v-205h-430v-1257z" /> +<glyph unicode="U" horiz-adv-x="1520" d="M1339 1462v-946q0 -162 -69.5 -283.5t-201 -187t-314.5 -65.5q-272 0 -423 144t-151 396v942h240v-925q0 -181 84 -267t258 -86q338 0 338 355v923h239z" /> +<glyph unicode="V" horiz-adv-x="1274" d="M1026 1462h248l-512 -1462h-252l-510 1462h246l305 -909q24 -65 51 -167.5t35 -152.5q13 76 40 176t44 148z" /> +<glyph unicode="W" horiz-adv-x="1937" d="M1542 0h-260l-248 872q-16 57 -40 164.5t-29 149.5q-10 -64 -32.5 -166t-37.5 -152l-242 -868h-260l-189 732l-192 730h244l209 -852q49 -205 70 -362q11 85 33 190t40 170l238 854h237l244 -858q35 -119 74 -356q15 143 72 364l208 850h242z" /> +<glyph unicode="X" horiz-adv-x="1274" d="M1270 0h-275l-366 598l-369 -598h-256l485 758l-454 704h266l338 -553l338 553h258l-457 -708z" /> +<glyph unicode="Y" horiz-adv-x="1212" d="M606 795l346 667h260l-487 -895v-567h-240v559l-485 903h260z" /> +<glyph unicode="Z" horiz-adv-x="1178" d="M1112 0h-1046v166l737 1091h-717v205h1006v-168l-740 -1089h760v-205z" /> +<glyph unicode="[" horiz-adv-x="676" d="M625 -324h-471v1786h471v-176h-256v-1433h256v-177z" /> +<glyph unicode="\" horiz-adv-x="799" d="M238 1462l544 -1462h-221l-545 1462h222z" /> +<glyph unicode="]" horiz-adv-x="676" d="M51 -147h256v1433h-256v176h469v-1786h-469v177z" /> +<glyph unicode="^" horiz-adv-x="1100" d="M29 535l436 935h121l485 -935h-194l-349 694l-307 -694h-192z" /> +<glyph unicode="_" horiz-adv-x="879" d="M883 -319h-887v135h887v-135z" /> +<glyph unicode="`" horiz-adv-x="1212" d="M690 1241q-69 52 -174.5 150.5t-153.5 156.5v21h273q38 -70 103.5 -161t109.5 -142v-25h-158z" /> +<glyph unicode="a" horiz-adv-x="1188" d="M860 0l-47 154h-8q-80 -101 -161 -137.5t-208 -36.5q-163 0 -254.5 88t-91.5 249q0 171 127 258t387 95l191 6v59q0 106 -49.5 158.5t-153.5 52.5q-85 0 -163 -25t-150 -59l-76 168q90 47 197 71.5t202 24.5q211 0 318.5 -92t107.5 -289v-745h-168zM510 160 q128 0 205.5 71.5t77.5 200.5v96l-142 -6q-166 -6 -241.5 -55.5t-75.5 -151.5q0 -74 44 -114.5t132 -40.5z" /> +<glyph unicode="b" horiz-adv-x="1276" d="M733 1126q207 0 322.5 -150t115.5 -421q0 -272 -117 -423.5t-325 -151.5q-210 0 -326 151h-16l-43 -131h-176v1556h235v-370q0 -41 -4 -122t-6 -103h10q112 165 330 165zM672 934q-142 0 -204.5 -83.5t-64.5 -279.5v-16q0 -202 64 -292.5t209 -90.5q125 0 189.5 99 t64.5 286q0 377 -258 377z" /> +<glyph unicode="c" horiz-adv-x="1014" d="M614 -20q-251 0 -381.5 146.5t-130.5 420.5q0 279 136.5 429t394.5 150q175 0 315 -65l-71 -189q-149 58 -246 58q-287 0 -287 -381q0 -186 71.5 -279.5t209.5 -93.5q157 0 297 78v-205q-63 -37 -134.5 -53t-173.5 -16z" /> +<glyph unicode="d" horiz-adv-x="1276" d="M541 -20q-207 0 -323 150t-116 421q0 272 117.5 423.5t325.5 151.5q218 0 332 -161h12q-17 119 -17 188v403h236v-1556h-184l-41 145h-11q-113 -165 -331 -165zM604 170q145 0 211 81.5t68 264.5v33q0 209 -68 297t-213 88q-124 0 -191 -100.5t-67 -286.5 q0 -184 65 -280.5t195 -96.5z" /> +<glyph unicode="e" horiz-adv-x="1180" d="M651 -20q-258 0 -403.5 150.5t-145.5 414.5q0 271 135 426t371 155q219 0 346 -133t127 -366v-127h-737q5 -161 87 -247.5t231 -86.5q98 0 182.5 18.5t181.5 61.5v-191q-86 -41 -174 -58t-201 -17zM608 948q-112 0 -179.5 -71t-80.5 -207h502q-2 137 -66 207.5t-176 70.5 z" /> +<glyph unicode="f" horiz-adv-x="743" d="M723 928h-270v-928h-236v928h-182v110l182 72v72q0 196 92 290.5t281 94.5q124 0 244 -41l-62 -178q-87 28 -166 28q-80 0 -116.5 -49.5t-36.5 -148.5v-72h270v-178z" /> +<glyph unicode="g" horiz-adv-x="1139" d="M1102 1106v-129l-189 -35q26 -35 43 -86t17 -108q0 -171 -118 -269t-325 -98q-53 0 -96 8q-76 -47 -76 -110q0 -38 35.5 -57t130.5 -19h193q183 0 278 -78t95 -225q0 -188 -155 -290t-448 -102q-226 0 -345 80t-119 228q0 102 64.5 171.5t180.5 96.5q-47 20 -77.5 64.5 t-30.5 93.5q0 62 35 105t104 85q-86 37 -139.5 120.5t-53.5 195.5q0 180 113.5 279t323.5 99q47 0 98.5 -6.5t77.5 -13.5h383zM233 -172q0 -76 68.5 -117t192.5 -41q192 0 286 55t94 146q0 72 -51.5 102.5t-191.5 30.5h-178q-101 0 -160.5 -47.5t-59.5 -128.5zM334 748 q0 -104 53.5 -160t153.5 -56q204 0 204 218q0 108 -50.5 166.5t-153.5 58.5q-102 0 -154.5 -58t-52.5 -169z" /> +<glyph unicode="h" horiz-adv-x="1300" d="M1141 0h-236v680q0 128 -51.5 191t-163.5 63q-148 0 -217.5 -88.5t-69.5 -296.5v-549h-235v1556h235v-395q0 -95 -12 -203h15q48 80 133.5 124t199.5 44q402 0 402 -405v-721z" /> +<glyph unicode="i" horiz-adv-x="571" d="M403 0h-235v1106h235v-1106zM154 1399q0 63 34.5 97t98.5 34q62 0 96.5 -34t34.5 -97q0 -60 -34.5 -94.5t-96.5 -34.5q-64 0 -98.5 34.5t-34.5 94.5z" /> +<glyph unicode="j" horiz-adv-x="571" d="M55 -492q-106 0 -176 25v186q68 -18 139 -18q150 0 150 170v1235h235v-1251q0 -171 -89.5 -259t-258.5 -88zM154 1399q0 63 34.5 97t98.5 34q62 0 96.5 -34t34.5 -97q0 -60 -34.5 -94.5t-96.5 -34.5q-64 0 -98.5 34.5t-34.5 94.5z" /> +<glyph unicode="k" horiz-adv-x="1171" d="M395 584l133 166l334 356h271l-445 -475l473 -631h-276l-355 485l-129 -106v-379h-233v1556h233v-759l-12 -213h6z" /> +<glyph unicode="l" horiz-adv-x="571" d="M403 0h-235v1556h235v-1556z" /> +<glyph unicode="m" horiz-adv-x="1958" d="M1100 0h-236v682q0 127 -48 189.5t-150 62.5q-136 0 -199.5 -88.5t-63.5 -294.5v-551h-235v1106h184l33 -145h12q46 79 133.5 122t192.5 43q255 0 338 -174h16q49 82 138 128t204 46q198 0 288.5 -100t90.5 -305v-721h-235v682q0 127 -48.5 189.5t-150.5 62.5 q-137 0 -200.5 -85.5t-63.5 -262.5v-586z" /> +<glyph unicode="n" horiz-adv-x="1300" d="M1141 0h-236v680q0 128 -51.5 191t-163.5 63q-149 0 -218 -88t-69 -295v-551h-235v1106h184l33 -145h12q50 79 142 122t204 43q398 0 398 -405v-721z" /> +<glyph unicode="o" horiz-adv-x="1251" d="M1149 555q0 -271 -139 -423t-387 -152q-155 0 -274 70t-183 201t-64 304q0 269 138 420t389 151q240 0 380 -154.5t140 -416.5zM344 555q0 -383 283 -383q280 0 280 383q0 379 -282 379q-148 0 -214.5 -98t-66.5 -281z" /> +<glyph unicode="p" horiz-adv-x="1276" d="M729 -20q-210 0 -326 151h-14q14 -140 14 -170v-453h-235v1598h190q8 -31 33 -148h12q110 168 330 168q207 0 322.5 -150t115.5 -421t-117.5 -423t-324.5 -152zM672 934q-140 0 -204.5 -82t-64.5 -262v-35q0 -202 64 -292.5t209 -90.5q122 0 188 100t66 285 q0 186 -65.5 281.5t-192.5 95.5z" /> +<glyph unicode="q" horiz-adv-x="1276" d="M606 168q148 0 212.5 85.5t64.5 258.5v37q0 205 -66.5 295t-214.5 90q-126 0 -192 -100t-66 -287q0 -379 262 -379zM539 -20q-205 0 -321 150.5t-116 420.5t118 422.5t325 152.5q104 0 186.5 -38.5t147.5 -126.5h8l26 145h195v-1598h-236v469q0 44 4 93t7 75h-13 q-104 -165 -331 -165z" /> +<glyph unicode="r" horiz-adv-x="883" d="M729 1126q71 0 117 -10l-23 -219q-50 12 -104 12q-141 0 -228.5 -92t-87.5 -239v-578h-235v1106h184l31 -195h12q55 99 143.5 157t190.5 58z" /> +<glyph unicode="s" horiz-adv-x="997" d="M911 315q0 -162 -118 -248.5t-338 -86.5q-221 0 -355 67v203q195 -90 363 -90q217 0 217 131q0 42 -24 70t-79 58t-153 68q-191 74 -258.5 148t-67.5 192q0 142 114.5 220.5t311.5 78.5q195 0 369 -79l-76 -177q-179 74 -301 74q-186 0 -186 -106q0 -52 48.5 -88 t211.5 -99q137 -53 199 -97t92 -101.5t30 -137.5z" /> +<glyph unicode="t" horiz-adv-x="805" d="M580 170q86 0 172 27v-177q-39 -17 -100.5 -28.5t-127.5 -11.5q-334 0 -334 352v596h-151v104l162 86l80 234h145v-246h315v-178h-315v-592q0 -85 42.5 -125.5t111.5 -40.5z" /> +<glyph unicode="u" horiz-adv-x="1300" d="M948 0l-33 145h-12q-49 -77 -139.5 -121t-206.5 -44q-201 0 -300 100t-99 303v723h237v-682q0 -127 52 -190.5t163 -63.5q148 0 217.5 88.5t69.5 296.5v551h236v-1106h-185z" /> +<glyph unicode="v" horiz-adv-x="1096" d="M420 0l-420 1106h248l225 -643q58 -162 70 -262h8q9 72 70 262l225 643h250l-422 -1106h-254z" /> +<glyph unicode="w" horiz-adv-x="1673" d="M1075 0l-143 516q-26 82 -94 381h-9q-58 -270 -92 -383l-147 -514h-260l-310 1106h240l141 -545q48 -202 68 -346h6q10 73 30.5 167.5t35.5 141.5l168 582h258l163 -582q15 -49 37.5 -150t26.5 -157h8q15 123 70 344l143 545h236l-312 -1106h-264z" /> +<glyph unicode="x" horiz-adv-x="1128" d="M414 565l-371 541h268l252 -387l254 387h266l-372 -541l391 -565h-266l-273 414l-272 -414h-266z" /> +<glyph unicode="y" horiz-adv-x="1098" d="M0 1106h256l225 -627q51 -134 68 -252h8q9 55 33 133.5t254 745.5h254l-473 -1253q-129 -345 -430 -345q-78 0 -152 17v186q53 -12 121 -12q170 0 239 197l41 104z" /> +<glyph unicode="z" horiz-adv-x="979" d="M907 0h-839v145l559 781h-525v180h789v-164l-547 -762h563v-180z" /> +<glyph unicode="{" horiz-adv-x="791" d="M311 287q0 186 -266 186v191q135 0 200.5 45.5t65.5 138.5v311q0 156 108.5 229.5t325.5 73.5v-182q-114 -5 -165.5 -46.5t-51.5 -123.5v-297q0 -199 -229 -238v-12q229 -36 229 -237v-299q0 -82 51 -124t166 -44v-183q-231 2 -332.5 78.5t-101.5 247.5v285z" /> +<glyph unicode="|" horiz-adv-x="1128" d="M473 1552h180v-2033h-180v2033z" /> +<glyph unicode="}" horiz-adv-x="760" d="M463 -20q0 -156 -99.5 -229t-318.5 -75v183q95 1 148 38.5t53 129.5v262q0 121 53 187t176 87v12q-229 39 -229 238v297q0 82 -45.5 123.5t-155.5 46.5v182q223 0 320.5 -76.5t97.5 -250.5v-287q0 -100 63.5 -142t188.5 -42v-191q-123 0 -187.5 -42.5t-64.5 -143.5v-307z " /> +<glyph unicode="~" d="M330 692q-50 0 -111.5 -30t-122.5 -91v191q99 108 250 108q66 0 125 -13t147 -50q131 -55 220 -55q52 0 114.5 31t120.5 89v-190q-105 -111 -250 -111q-65 0 -127.5 15.5t-146.5 50.5q-127 55 -219 55z" /> +<glyph unicode="¡" horiz-adv-x="565" d="M193 645h174l51 -1016h-277zM430 965q0 -74 -37.5 -113t-111.5 -39q-72 0 -110 39.5t-38 112.5q0 69 38 111t110 42t110.5 -40.5t38.5 -112.5z" /> +<glyph unicode="¢" d="M987 238q-119 -59 -258 -64v-194h-156v200q-207 31 -307 171t-100 390q0 254 100.5 397t306.5 175v170h158v-162q152 -5 283 -66l-70 -188q-146 59 -250 59q-146 0 -216 -95t-70 -288q0 -194 72 -283t210 -89q75 0 142.5 15t154.5 52v-200z" /> +<glyph unicode="£" d="M690 1481q194 0 375 -82l-76 -182q-162 71 -284 71q-205 0 -205 -219v-244h397v-172h-397v-182q0 -91 -33 -155t-113 -109h756v-207h-1038v195q98 30 145 96t47 178v184h-188v172h188v256q0 188 113.5 294t312.5 106z" /> +<glyph unicode="¤" d="M186 723q0 109 64 213l-133 133l121 119l131 -129q100 63 215 63t213 -65l133 131l121 -117l-131 -133q63 -100 63 -215q0 -119 -63 -217l129 -129l-119 -119l-133 129q-99 -61 -213 -61q-126 0 -215 61l-131 -127l-119 119l131 129q-64 99 -64 215zM354 723 q0 -98 68 -164.5t162 -66.5q97 0 165 66.5t68 164.5q0 97 -68 165t-165 68q-93 0 -161.5 -68t-68.5 -165z" /> +<glyph unicode="¥" d="M584 797l321 665h244l-399 -760h227v-151h-281v-154h281v-153h-281v-244h-225v244h-283v153h283v154h-283v151h224l-394 760h246z" /> +<glyph unicode="¦" horiz-adv-x="1128" d="M473 1552h180v-794h-180v794zM473 315h180v-796h-180v796z" /> +<glyph unicode="§" horiz-adv-x="1026" d="M129 807q0 80 38.5 145.5t111.5 108.5q-146 83 -146 235q0 129 109.5 202t294.5 73q91 0 174 -17t182 -59l-68 -162q-116 50 -176 63t-121 13q-194 0 -194 -109q0 -54 55 -93.5t191 -90.5q175 -68 250 -146.5t75 -187.5q0 -177 -139 -266q139 -80 139 -223 q0 -142 -118 -224.5t-326 -82.5q-212 0 -346 71v179q77 -40 173 -65.5t177 -25.5q235 0 235 131q0 43 -21 70t-71 54t-147 65q-141 55 -206 101.5t-95.5 105t-30.5 135.5zM313 827q0 -45 24 -80t78.5 -69t194.5 -90q109 65 109 168q0 75 -62 126.5t-221 104.5 q-54 -16 -88.5 -61.5t-34.5 -98.5z" /> +<glyph unicode="¨" horiz-adv-x="1212" d="M293 1399q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29t-33.5 88zM686 1399q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="©" horiz-adv-x="1704" d="M893 1034q-111 0 -171 -80.5t-60 -222.5q0 -147 54 -226t177 -79q55 0 118 15t109 36v-158q-115 -51 -235 -51q-197 0 -305.5 120.5t-108.5 342.5q0 214 110 337.5t306 123.5q138 0 274 -70l-65 -143q-106 55 -203 55zM100 731q0 200 100 375t275 276t377 101 q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM223 731q0 -170 84.5 -315.5t230.5 -229.5t314 -84q170 0 316 85.5t229.5 230t83.5 313.5q0 168 -84.5 314.5t-231 230.5t-313.5 84q-168 0 -312.5 -83 t-230.5 -229t-86 -317z" /> +<glyph unicode="ª" horiz-adv-x="754" d="M547 782l-29 97q-46 -55 -105 -82t-130 -27q-113 0 -169.5 52.5t-56.5 158.5q0 104 84 159.5t252 61.5l107 4q0 72 -34.5 108t-103.5 36q-90 0 -210 -56l-54 115q144 70 285 70q138 0 207 -62.5t69 -187.5v-447h-112zM401 1098q-71 -2 -125.5 -34t-54.5 -81q0 -88 96 -88 q91 0 137 41t46 123v43z" /> +<glyph unicode="«" horiz-adv-x="1139" d="M82 561l356 432l168 -94l-282 -350l282 -348l-168 -97l-356 431v26zM532 561l357 432l168 -94l-283 -350l283 -348l-168 -97l-357 431v26z" /> +<glyph unicode="¬" d="M1073 256h-178v377h-799v178h977v-555z" /> +<glyph unicode="­" horiz-adv-x="659" d="M72 449zM72 449v200h514v-200h-514z" /> +<glyph unicode="®" horiz-adv-x="1704" d="M748 770h69q74 0 112 35t38 100q0 72 -36.5 100.5t-115.5 28.5h-67v-264zM1157 909q0 -171 -153 -233l237 -397h-211l-192 346h-90v-346h-189v903h262q174 0 255 -68t81 -205zM100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370 t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM223 731q0 -170 84.5 -315.5t230.5 -229.5t314 -84q170 0 316 85.5t229.5 230t83.5 313.5q0 168 -84.5 314.5t-231 230.5t-313.5 84q-168 0 -312.5 -83t-230.5 -229t-86 -317z" /> +<glyph unicode="¯" horiz-adv-x="1024" d="M1030 1556h-1036v164h1036v-164z" /> +<glyph unicode="°" horiz-adv-x="877" d="M109 1153q0 135 95 232.5t234 97.5q138 0 233 -96t95 -234q0 -139 -96 -233.5t-232 -94.5q-88 0 -164.5 43.5t-120.5 119.5t-44 165zM262 1153q0 -70 51 -122t125 -52t125 51.5t51 122.5q0 76 -52 127t-124 51t-124 -52t-52 -126z" /> +<glyph unicode="±" d="M494 664h-398v178h398v407h180v-407h399v-178h-399v-406h-180v406zM96 0v178h977v-178h-977z" /> +<glyph unicode="²" horiz-adv-x="743" d="M678 586h-627v135l230 225q117 112 149.5 165t32.5 112q0 52 -32 79t-83 27q-93 0 -201 -88l-94 121q139 119 309 119q136 0 211.5 -66t75.5 -180q0 -83 -46 -158.5t-183 -202.5l-139 -129h397v-159z" /> +<glyph unicode="³" horiz-adv-x="743" d="M645 1251q0 -75 -40.5 -122.5t-119.5 -86.5q94 -21 141.5 -76t47.5 -132q0 -127 -93 -196t-266 -69q-148 0 -270 62v157q145 -79 270 -79q179 0 179 135q0 125 -199 125h-115v133h105q184 0 184 129q0 52 -34.5 80t-90.5 28q-57 0 -105.5 -20t-105.5 -57l-84 114 q61 46 134 75.5t171 29.5q134 0 212.5 -61.5t78.5 -168.5z" /> +<glyph unicode="´" horiz-adv-x="1212" d="M362 1241v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="µ" horiz-adv-x="1309" d="M403 422q0 -252 218 -252q146 0 215 88.5t69 296.5v551h236v-1106h-183l-34 147h-13q-48 -83 -119.5 -125t-175.5 -42q-140 0 -219 90h-4q3 -28 6.5 -117t3.5 -125v-320h-235v1598h235v-684z" /> +<glyph unicode="¶" horiz-adv-x="1341" d="M1143 -260h-137v1663h-191v-1663h-137v819q-62 -18 -146 -18q-216 0 -317.5 125t-101.5 376q0 260 109 387t341 127h580v-1816z" /> +<glyph unicode="·" horiz-adv-x="563" d="M133 723q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" /> +<glyph unicode="¸" horiz-adv-x="442" d="M426 -270q0 -222 -305 -222q-66 0 -121 15v137q54 -14 123 -14q54 0 85.5 16.5t31.5 61.5q0 85 -179 110l84 166h152l-41 -88q80 -21 125 -68.5t45 -113.5z" /> +<glyph unicode="¹" horiz-adv-x="743" d="M532 586h-186v512l3 103l5 91q-17 -18 -40.5 -40t-141.5 -111l-88 112l281 209h167v-876z" /> +<glyph unicode="º" horiz-adv-x="780" d="M719 1124q0 -164 -87.5 -259t-244.5 -95q-150 0 -238 95.5t-88 258.5q0 169 88.5 262t241.5 93q152 0 240 -94.5t88 -260.5zM223 1124q0 -111 39 -166t127 -55t127 55t39 166q0 113 -39 167.5t-127 54.5t-127 -54.5t-39 -167.5z" /> +<glyph unicode="»" horiz-adv-x="1139" d="M1057 535l-359 -431l-168 97l283 348l-283 350l168 94l359 -432v-26zM606 535l-358 -431l-168 97l282 348l-282 350l168 94l358 -432v-26z" /> +<glyph unicode="¼" horiz-adv-x="1700" d="M60 0zM1333 1462l-856 -1462h-192l858 1462h190zM508 586h-186v512l3 103l5 91q-17 -18 -40.5 -40t-141.5 -111l-88 112l281 209h167v-876zM1585 177h-125v-176h-192v176h-392v127l396 579h188v-563h125v-143zM1268 320v178q0 97 6 197q-52 -104 -88 -158l-148 -217h230z " /> +<glyph unicode="½" horiz-adv-x="1700" d="M46 0zM1298 1462l-856 -1462h-192l858 1462h190zM494 586h-186v512l3 103l5 91q-17 -18 -40.5 -40t-141.5 -111l-88 112l281 209h167v-876zM1608 1h-627v135l230 225q117 112 149.5 165t32.5 112q0 52 -32 79t-83 27q-93 0 -201 -88l-94 121q139 119 309 119 q136 0 211.5 -66t75.5 -180q0 -83 -46 -158.5t-183 -202.5l-139 -129h397v-159z" /> +<glyph unicode="¾" horiz-adv-x="1700" d="M55 0zM1415 1462l-856 -1462h-192l858 1462h190zM1640 177h-125v-176h-192v176h-392v127l396 579h188v-563h125v-143zM1323 320v178q0 97 6 197q-52 -104 -88 -158l-148 -217h230zM655 1251q0 -75 -40.5 -122.5t-119.5 -86.5q94 -21 141.5 -76t47.5 -132q0 -127 -93 -196 t-266 -69q-148 0 -270 62v157q145 -79 270 -79q179 0 179 135q0 125 -199 125h-115v133h105q184 0 184 129q0 52 -34.5 80t-90.5 28q-57 0 -105.5 -20t-105.5 -57l-84 114q61 46 134 75.5t171 29.5q134 0 212.5 -61.5t78.5 -168.5z" /> +<glyph unicode="¿" horiz-adv-x="928" d="M651 645v-63q0 -106 -41 -181t-143 -155q-124 -98 -155 -147t-31 -124q0 -78 54 -125t161 -47q90 0 174 27.5t166 65.5l82 -179q-220 -110 -424 -110q-207 0 -323 95.5t-116 264.5q0 73 21 130t64 109t157 142q94 76 125 124.5t31 127.5v45h198zM692 965 q0 -74 -37.5 -113t-111.5 -39q-72 0 -110 39.5t-38 112.5q0 69 38 111t110 42t110.5 -40.5t38.5 -112.5z" /> +<glyph unicode="À" horiz-adv-x="1354" d="M0 0zM1100 0l-146 406h-559l-143 -406h-252l547 1468h260l547 -1468h-254zM891 612l-137 398q-15 40 -41.5 126t-36.5 126q-27 -123 -79 -269l-132 -381h426zM662 1579q-69 52 -174.5 150.5t-153.5 156.5v21h273q38 -70 103.5 -161t109.5 -142v-25h-158z" /> +<glyph unicode="Á" horiz-adv-x="1354" d="M0 0zM1100 0l-146 406h-559l-143 -406h-252l547 1468h260l547 -1468h-254zM891 612l-137 398q-15 40 -41.5 126t-36.5 126q-27 -123 -79 -269l-132 -381h426zM532 1579v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="Â" horiz-adv-x="1354" d="M0 0zM1100 0l-146 406h-559l-143 -406h-252l547 1468h260l547 -1468h-254zM891 612l-137 398q-15 40 -41.5 126t-36.5 126q-27 -123 -79 -269l-132 -381h426zM897 1579q-123 73 -228 180q-103 -103 -225 -180h-158v25q191 198 254 303h260q63 -110 256 -303v-25h-159z " /> +<glyph unicode="Ã" horiz-adv-x="1354" d="M0 0zM1100 0l-146 406h-559l-143 -406h-252l547 1468h260l547 -1468h-254zM891 612l-137 398q-15 40 -41.5 126t-36.5 126q-27 -123 -79 -269l-132 -381h426zM821 1579q-42 0 -82.5 17.5t-79.5 39t-76 39t-71 17.5q-81 0 -109 -115h-122q12 139 77.5 212t167.5 73 q43 0 84 -17.5t80 -39t75.5 -39t70.5 -17.5q79 0 106 115h125q-12 -134 -77 -209.5t-169 -75.5z" /> +<glyph unicode="Ä" horiz-adv-x="1354" d="M0 0zM1100 0l-146 406h-559l-143 -406h-252l547 1468h260l547 -1468h-254zM891 612l-137 398q-15 40 -41.5 126t-36.5 126q-27 -123 -79 -269l-132 -381h426zM363 1737q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29t-33.5 88z M756 1737q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="Å" horiz-adv-x="1354" d="M0 0zM1100 0l-146 406h-559l-143 -406h-252l547 1468h260l547 -1468h-254zM891 612l-137 398q-15 40 -41.5 126t-36.5 126q-27 -123 -79 -269l-132 -381h426zM913 1577q0 -102 -65.5 -165.5t-173.5 -63.5t-172 62.5t-64 164.5q0 101 63.5 163.5t172.5 62.5 q104 0 171.5 -62t67.5 -162zM780 1575q0 50 -30 78.5t-76 28.5q-47 0 -77 -28.5t-30 -78.5q0 -106 107 -106q46 0 76 27.5t30 78.5z" /> +<glyph unicode="Æ" horiz-adv-x="1868" d="M1747 0h-811v406h-504l-188 -406h-246l678 1462h1071v-202h-571v-398h532v-200h-532v-459h571v-203zM522 612h414v641h-123z" /> +<glyph unicode="Ç" horiz-adv-x="1298" d="M121 0zM815 1278q-206 0 -324 -146t-118 -403q0 -269 113.5 -407t328.5 -138q93 0 180 18.5t181 47.5v-205q-172 -65 -390 -65q-321 0 -493 194.5t-172 556.5q0 228 83.5 399t241.5 262t371 91q224 0 414 -94l-86 -199q-74 35 -156.5 61.5t-173.5 26.5zM952 -270 q0 -222 -305 -222q-66 0 -121 15v137q54 -14 123 -14q54 0 85.5 16.5t31.5 61.5q0 85 -179 110l84 166h152l-41 -88q80 -21 125 -68.5t45 -113.5z" /> +<glyph unicode="È" horiz-adv-x="1143" d="M193 0zM1020 0h-827v1462h827v-202h-588v-398h551v-200h-551v-459h588v-203zM617 1579q-69 52 -174.5 150.5t-153.5 156.5v21h273q38 -70 103.5 -161t109.5 -142v-25h-158z" /> +<glyph unicode="É" horiz-adv-x="1143" d="M193 0zM1020 0h-827v1462h827v-202h-588v-398h551v-200h-551v-459h588v-203zM440 1579v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="Ê" horiz-adv-x="1143" d="M193 0zM1020 0h-827v1462h827v-202h-588v-398h551v-200h-551v-459h588v-203zM831 1579q-123 73 -228 180q-103 -103 -225 -180h-158v25q191 198 254 303h260q63 -110 256 -303v-25h-159z" /> +<glyph unicode="Ë" horiz-adv-x="1143" d="M193 0zM1020 0h-827v1462h827v-202h-588v-398h551v-200h-551v-459h588v-203zM297 1737q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29t-33.5 88zM690 1737q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5 t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="Ì" horiz-adv-x="625" d="M0 0zM193 0v1462h239v-1462h-239zM322 1579q-69 52 -174.5 150.5t-153.5 156.5v21h273q38 -70 103.5 -161t109.5 -142v-25h-158z" /> +<glyph unicode="Í" horiz-adv-x="625" d="M179 0zM193 0v1462h239v-1462h-239zM179 1579v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="Î" horiz-adv-x="625" d="M0 0zM193 0v1462h239v-1462h-239zM536 1579q-123 73 -228 180q-103 -103 -225 -180h-158v25q191 198 254 303h260q63 -110 256 -303v-25h-159z" /> +<glyph unicode="Ï" horiz-adv-x="625" d="M1 0zM193 0v1462h239v-1462h-239zM1 1737q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29t-33.5 88zM394 1737q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="Ð" horiz-adv-x="1497" d="M1374 745q0 -360 -201 -552.5t-579 -192.5h-401v623h-146v200h146v639h446q347 0 541 -188.5t194 -528.5zM1122 737q0 260 -124.5 392.5t-368.5 132.5h-197v-439h307v-200h-307v-422h160q530 0 530 536z" /> +<glyph unicode="Ñ" horiz-adv-x="1604" d="M193 0zM1411 0h-293l-719 1165h-8l5 -65q14 -186 14 -340v-760h-217v1462h290l717 -1159h6q-2 23 -8 167.5t-6 225.5v766h219v-1462zM954 1579q-42 0 -82.5 17.5t-79.5 39t-76 39t-71 17.5q-81 0 -109 -115h-122q12 139 77.5 212t167.5 73q43 0 84 -17.5t80 -39t75.5 -39 t70.5 -17.5q79 0 106 115h125q-12 -134 -77 -209.5t-169 -75.5z" /> +<glyph unicode="Ò" horiz-adv-x="1612" d="M121 0zM1491 733q0 -357 -178.5 -555t-505.5 -198q-331 0 -508.5 196.5t-177.5 558.5t178.5 556t509.5 194q326 0 504 -197t178 -555zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139q-215 0 -324.5 -139t-109.5 -408z M809 1579q-69 52 -174.5 150.5t-153.5 156.5v21h273q38 -70 103.5 -161t109.5 -142v-25h-158z" /> +<glyph unicode="Ó" horiz-adv-x="1612" d="M121 0zM1491 733q0 -357 -178.5 -555t-505.5 -198q-331 0 -508.5 196.5t-177.5 558.5t178.5 556t509.5 194q326 0 504 -197t178 -555zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139q-215 0 -324.5 -139t-109.5 -408z M657 1579v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="Ô" horiz-adv-x="1612" d="M121 0zM1491 733q0 -357 -178.5 -555t-505.5 -198q-331 0 -508.5 196.5t-177.5 558.5t178.5 556t509.5 194q326 0 504 -197t178 -555zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139q-215 0 -324.5 -139t-109.5 -408z M1024 1579q-123 73 -228 180q-103 -103 -225 -180h-158v25q191 198 254 303h260q63 -110 256 -303v-25h-159z" /> +<glyph unicode="Õ" horiz-adv-x="1612" d="M121 0zM1491 733q0 -357 -178.5 -555t-505.5 -198q-331 0 -508.5 196.5t-177.5 558.5t178.5 556t509.5 194q326 0 504 -197t178 -555zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139q-215 0 -324.5 -139t-109.5 -408z M950 1579q-42 0 -82.5 17.5t-79.5 39t-76 39t-71 17.5q-81 0 -109 -115h-122q12 139 77.5 212t167.5 73q43 0 84 -17.5t80 -39t75.5 -39t70.5 -17.5q79 0 106 115h125q-12 -134 -77 -209.5t-169 -75.5z" /> +<glyph unicode="Ö" horiz-adv-x="1612" d="M121 0zM1491 733q0 -357 -178.5 -555t-505.5 -198q-331 0 -508.5 196.5t-177.5 558.5t178.5 556t509.5 194q326 0 504 -197t178 -555zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139q-215 0 -324.5 -139t-109.5 -408z M496 1737q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29t-33.5 88zM889 1737q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="×" d="M457 723l-326 326l125 127l328 -326l329 326l125 -123l-329 -330l325 -328l-123 -125l-329 326l-324 -326l-125 125z" /> +<glyph unicode="Ø" horiz-adv-x="1612" d="M1491 733q0 -357 -178.5 -555t-505.5 -198q-213 0 -361 81l-94 -137l-141 94l98 144q-188 196 -188 573q0 362 178.5 556t509.5 194q199 0 354 -82l90 129l142 -92l-99 -140q195 -199 195 -567zM1237 733q0 225 -80 361l-586 -850q97 -60 236 -60q213 0 321.5 138 t108.5 411zM375 733q0 -231 78 -362l587 850q-92 59 -231 59q-215 0 -324.5 -139t-109.5 -408z" /> +<glyph unicode="Ù" horiz-adv-x="1520" d="M180 0zM1339 1462v-946q0 -162 -69.5 -283.5t-201 -187t-314.5 -65.5q-272 0 -423 144t-151 396v942h240v-925q0 -181 84 -267t258 -86q338 0 338 355v923h239zM745 1579q-69 52 -174.5 150.5t-153.5 156.5v21h273q38 -70 103.5 -161t109.5 -142v-25h-158z" /> +<glyph unicode="Ú" horiz-adv-x="1520" d="M180 0zM1339 1462v-946q0 -162 -69.5 -283.5t-201 -187t-314.5 -65.5q-272 0 -423 144t-151 396v942h240v-925q0 -181 84 -267t258 -86q338 0 338 355v923h239zM600 1579v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="Û" horiz-adv-x="1520" d="M180 0zM1339 1462v-946q0 -162 -69.5 -283.5t-201 -187t-314.5 -65.5q-272 0 -423 144t-151 396v942h240v-925q0 -181 84 -267t258 -86q338 0 338 355v923h239zM977 1579q-123 73 -228 180q-103 -103 -225 -180h-158v25q191 198 254 303h260q63 -110 256 -303v-25h-159z " /> +<glyph unicode="Ü" horiz-adv-x="1520" d="M180 0zM1339 1462v-946q0 -162 -69.5 -283.5t-201 -187t-314.5 -65.5q-272 0 -423 144t-151 396v942h240v-925q0 -181 84 -267t258 -86q338 0 338 355v923h239zM445 1737q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29 t-33.5 88zM838 1737q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="Ý" horiz-adv-x="1212" d="M0 0zM606 795l346 667h260l-487 -895v-567h-240v559l-485 903h260zM450 1579v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="Þ" horiz-adv-x="1268" d="M1169 776q0 -227 -146 -349t-423 -122h-168v-305h-239v1462h239v-243h197q268 0 404 -112t136 -331zM432 504h133q187 0 273 63t86 203q0 127 -78 188.5t-250 61.5h-164v-516z" /> +<glyph unicode="ß" horiz-adv-x="1364" d="M1149 1253q0 -74 -38.5 -140.5t-104.5 -117.5q-90 -69 -117 -98t-27 -57q0 -30 22.5 -55.5t79.5 -63.5l95 -64q92 -62 135.5 -109.5t65.5 -103.5t22 -127q0 -165 -107 -251t-311 -86q-190 0 -299 65v199q58 -37 139 -61.5t148 -24.5q192 0 192 151q0 61 -34.5 105 t-155.5 118q-119 73 -171 135t-52 146q0 63 34 115.5t105 105.5q75 55 107 97.5t32 93.5q0 72 -67 112.5t-178 40.5q-127 0 -194 -54t-67 -159v-1165h-235v1169q0 193 128.5 295.5t367.5 102.5q225 0 355 -84t130 -230z" /> +<glyph unicode="à" horiz-adv-x="1188" d="M90 0zM860 0l-47 154h-8q-80 -101 -161 -137.5t-208 -36.5q-163 0 -254.5 88t-91.5 249q0 171 127 258t387 95l191 6v59q0 106 -49.5 158.5t-153.5 52.5q-85 0 -163 -25t-150 -59l-76 168q90 47 197 71.5t202 24.5q211 0 318.5 -92t107.5 -289v-745h-168zM510 160 q128 0 205.5 71.5t77.5 200.5v96l-142 -6q-166 -6 -241.5 -55.5t-75.5 -151.5q0 -74 44 -114.5t132 -40.5zM587 1241q-69 52 -174.5 150.5t-153.5 156.5v21h273q38 -70 103.5 -161t109.5 -142v-25h-158z" /> +<glyph unicode="á" horiz-adv-x="1188" d="M90 0zM860 0l-47 154h-8q-80 -101 -161 -137.5t-208 -36.5q-163 0 -254.5 88t-91.5 249q0 171 127 258t387 95l191 6v59q0 106 -49.5 158.5t-153.5 52.5q-85 0 -163 -25t-150 -59l-76 168q90 47 197 71.5t202 24.5q211 0 318.5 -92t107.5 -289v-745h-168zM510 160 q128 0 205.5 71.5t77.5 200.5v96l-142 -6q-166 -6 -241.5 -55.5t-75.5 -151.5q0 -74 44 -114.5t132 -40.5zM438 1241v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="â" horiz-adv-x="1188" d="M90 0zM860 0l-47 154h-8q-80 -101 -161 -137.5t-208 -36.5q-163 0 -254.5 88t-91.5 249q0 171 127 258t387 95l191 6v59q0 106 -49.5 158.5t-153.5 52.5q-85 0 -163 -25t-150 -59l-76 168q90 47 197 71.5t202 24.5q211 0 318.5 -92t107.5 -289v-745h-168zM510 160 q128 0 205.5 71.5t77.5 200.5v96l-142 -6q-166 -6 -241.5 -55.5t-75.5 -151.5q0 -74 44 -114.5t132 -40.5zM814 1241q-123 73 -228 180q-103 -103 -225 -180h-158v25q191 198 254 303h260q63 -110 256 -303v-25h-159z" /> +<glyph unicode="ã" horiz-adv-x="1188" d="M90 0zM860 0l-47 154h-8q-80 -101 -161 -137.5t-208 -36.5q-163 0 -254.5 88t-91.5 249q0 171 127 258t387 95l191 6v59q0 106 -49.5 158.5t-153.5 52.5q-85 0 -163 -25t-150 -59l-76 168q90 47 197 71.5t202 24.5q211 0 318.5 -92t107.5 -289v-745h-168zM510 160 q128 0 205.5 71.5t77.5 200.5v96l-142 -6q-166 -6 -241.5 -55.5t-75.5 -151.5q0 -74 44 -114.5t132 -40.5zM748 1241q-42 0 -82.5 17.5t-79.5 39t-76 39t-71 17.5q-81 0 -109 -115h-122q12 139 77.5 212t167.5 73q43 0 84 -17.5t80 -39t75.5 -39t70.5 -17.5q79 0 106 115 h125q-12 -134 -77 -209.5t-169 -75.5z" /> +<glyph unicode="ä" horiz-adv-x="1188" d="M90 0zM860 0l-47 154h-8q-80 -101 -161 -137.5t-208 -36.5q-163 0 -254.5 88t-91.5 249q0 171 127 258t387 95l191 6v59q0 106 -49.5 158.5t-153.5 52.5q-85 0 -163 -25t-150 -59l-76 168q90 47 197 71.5t202 24.5q211 0 318.5 -92t107.5 -289v-745h-168zM510 160 q128 0 205.5 71.5t77.5 200.5v96l-142 -6q-166 -6 -241.5 -55.5t-75.5 -151.5q0 -74 44 -114.5t132 -40.5zM282 1399q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29t-33.5 88zM675 1399q0 62 33.5 89.5t81.5 27.5q53 0 85 -31 t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="å" horiz-adv-x="1188" d="M90 0zM860 0l-47 154h-8q-80 -101 -161 -137.5t-208 -36.5q-163 0 -254.5 88t-91.5 249q0 171 127 258t387 95l191 6v59q0 106 -49.5 158.5t-153.5 52.5q-85 0 -163 -25t-150 -59l-76 168q90 47 197 71.5t202 24.5q211 0 318.5 -92t107.5 -289v-745h-168zM510 160 q128 0 205.5 71.5t77.5 200.5v96l-142 -6q-166 -6 -241.5 -55.5t-75.5 -151.5q0 -74 44 -114.5t132 -40.5zM841 1468q0 -102 -65.5 -165.5t-173.5 -63.5t-172 62.5t-64 164.5q0 101 63.5 163.5t172.5 62.5q104 0 171.5 -62t67.5 -162zM708 1466q0 50 -30 78.5t-76 28.5 q-47 0 -77 -28.5t-30 -78.5q0 -106 107 -106q46 0 76 27.5t30 78.5z" /> +<glyph unicode="æ" horiz-adv-x="1817" d="M90 317q0 172 121.5 258.5t370.5 94.5l188 6v76q0 194 -201 194q-141 0 -307 -82l-74 166q88 47 192.5 71.5t203.5 24.5q241 0 340 -155q120 155 346 155q206 0 328 -134.5t122 -362.5v-127h-712q10 -336 301 -336q184 0 356 80v-191q-86 -41 -171.5 -58t-195.5 -17 q-140 0 -248.5 54.5t-175.5 164.5q-94 -125 -190.5 -172t-241.5 -47q-165 0 -258.5 90t-93.5 247zM334 315q0 -155 166 -155q124 0 196 72.5t72 199.5v96l-135 -6q-155 -6 -227 -54.5t-72 -152.5zM1266 948q-112 0 -177.5 -69.5t-74.5 -208.5h473q0 130 -58.5 204t-162.5 74 z" /> +<glyph unicode="ç" horiz-adv-x="1014" d="M102 0zM614 -20q-251 0 -381.5 146.5t-130.5 420.5q0 279 136.5 429t394.5 150q175 0 315 -65l-71 -189q-149 58 -246 58q-287 0 -287 -381q0 -186 71.5 -279.5t209.5 -93.5q157 0 297 78v-205q-63 -37 -134.5 -53t-173.5 -16zM782 -270q0 -222 -305 -222q-66 0 -121 15 v137q54 -14 123 -14q54 0 85.5 16.5t31.5 61.5q0 85 -179 110l84 166h152l-41 -88q80 -21 125 -68.5t45 -113.5z" /> +<glyph unicode="è" horiz-adv-x="1180" d="M102 0zM651 -20q-258 0 -403.5 150.5t-145.5 414.5q0 271 135 426t371 155q219 0 346 -133t127 -366v-127h-737q5 -161 87 -247.5t231 -86.5q98 0 182.5 18.5t181.5 61.5v-191q-86 -41 -174 -58t-201 -17zM608 948q-112 0 -179.5 -71t-80.5 -207h502q-2 137 -66 207.5 t-176 70.5zM609 1241q-69 52 -174.5 150.5t-153.5 156.5v21h273q38 -70 103.5 -161t109.5 -142v-25h-158z" /> +<glyph unicode="é" horiz-adv-x="1180" d="M102 0zM651 -20q-258 0 -403.5 150.5t-145.5 414.5q0 271 135 426t371 155q219 0 346 -133t127 -366v-127h-737q5 -161 87 -247.5t231 -86.5q98 0 182.5 18.5t181.5 61.5v-191q-86 -41 -174 -58t-201 -17zM608 948q-112 0 -179.5 -71t-80.5 -207h502q-2 137 -66 207.5 t-176 70.5zM458 1241v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="ê" horiz-adv-x="1180" d="M102 0zM651 -20q-258 0 -403.5 150.5t-145.5 414.5q0 271 135 426t371 155q219 0 346 -133t127 -366v-127h-737q5 -161 87 -247.5t231 -86.5q98 0 182.5 18.5t181.5 61.5v-191q-86 -41 -174 -58t-201 -17zM608 948q-112 0 -179.5 -71t-80.5 -207h502q-2 137 -66 207.5 t-176 70.5zM838 1241q-123 73 -228 180q-103 -103 -225 -180h-158v25q191 198 254 303h260q63 -110 256 -303v-25h-159z" /> +<glyph unicode="ë" horiz-adv-x="1180" d="M102 0zM651 -20q-258 0 -403.5 150.5t-145.5 414.5q0 271 135 426t371 155q219 0 346 -133t127 -366v-127h-737q5 -161 87 -247.5t231 -86.5q98 0 182.5 18.5t181.5 61.5v-191q-86 -41 -174 -58t-201 -17zM608 948q-112 0 -179.5 -71t-80.5 -207h502q-2 137 -66 207.5 t-176 70.5zM307 1399q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29t-33.5 88zM700 1399q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="ì" horiz-adv-x="571" d="M0 0zM403 0h-235v1106h235v-1106zM259 1241q-69 52 -174.5 150.5t-153.5 156.5v21h273q38 -70 103.5 -161t109.5 -142v-25h-158z" /> +<glyph unicode="í" horiz-adv-x="571" d="M156 0zM403 0h-235v1106h235v-1106zM156 1241v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="î" horiz-adv-x="571" d="M0 0zM403 0h-235v1106h235v-1106zM511 1241q-123 73 -228 180q-103 -103 -225 -180h-158v25q191 198 254 303h260q63 -110 256 -303v-25h-159z" /> +<glyph unicode="ï" horiz-adv-x="571" d="M0 0zM403 0h-235v1106h235v-1106zM-25 1399q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29t-33.5 88zM368 1399q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="ð" horiz-adv-x="1243" d="M1149 567q0 -279 -137.5 -433t-388.5 -154q-235 0 -378 136t-143 365q0 231 131 365.5t351 134.5q214 0 301 -111l8 4q-62 189 -227 345l-250 -150l-88 133l204 119q-86 59 -167 102l84 146q140 -63 258 -144l231 138l88 -129l-188 -113q152 -140 231.5 -330t79.5 -424z M909 522q0 127 -75.5 202t-206.5 75q-151 0 -218 -82t-67 -240q0 -153 74 -234t211 -81q148 0 215 91t67 269z" /> +<glyph unicode="ñ" horiz-adv-x="1300" d="M168 0zM1141 0h-236v680q0 128 -51.5 191t-163.5 63q-149 0 -218 -88t-69 -295v-551h-235v1106h184l33 -145h12q50 79 142 122t204 43q398 0 398 -405v-721zM809 1241q-42 0 -82.5 17.5t-79.5 39t-76 39t-71 17.5q-81 0 -109 -115h-122q12 139 77.5 212t167.5 73 q43 0 84 -17.5t80 -39t75.5 -39t70.5 -17.5q79 0 106 115h125q-12 -134 -77 -209.5t-169 -75.5z" /> +<glyph unicode="ò" horiz-adv-x="1251" d="M102 0zM1149 555q0 -271 -139 -423t-387 -152q-155 0 -274 70t-183 201t-64 304q0 269 138 420t389 151q240 0 380 -154.5t140 -416.5zM344 555q0 -383 283 -383q280 0 280 383q0 379 -282 379q-148 0 -214.5 -98t-66.5 -281zM621 1241q-69 52 -174.5 150.5t-153.5 156.5 v21h273q38 -70 103.5 -161t109.5 -142v-25h-158z" /> +<glyph unicode="ó" horiz-adv-x="1251" d="M102 0zM1149 555q0 -271 -139 -423t-387 -152q-155 0 -274 70t-183 201t-64 304q0 269 138 420t389 151q240 0 380 -154.5t140 -416.5zM344 555q0 -383 283 -383q280 0 280 383q0 379 -282 379q-148 0 -214.5 -98t-66.5 -281zM473 1241v25q57 70 117.5 156t95.5 147h273 v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="ô" horiz-adv-x="1251" d="M102 0zM1149 555q0 -271 -139 -423t-387 -152q-155 0 -274 70t-183 201t-64 304q0 269 138 420t389 151q240 0 380 -154.5t140 -416.5zM344 555q0 -383 283 -383q280 0 280 383q0 379 -282 379q-148 0 -214.5 -98t-66.5 -281zM850 1241q-123 73 -228 180 q-103 -103 -225 -180h-158v25q191 198 254 303h260q63 -110 256 -303v-25h-159z" /> +<glyph unicode="õ" horiz-adv-x="1251" d="M102 0zM1149 555q0 -271 -139 -423t-387 -152q-155 0 -274 70t-183 201t-64 304q0 269 138 420t389 151q240 0 380 -154.5t140 -416.5zM344 555q0 -383 283 -383q280 0 280 383q0 379 -282 379q-148 0 -214.5 -98t-66.5 -281zM775 1241q-42 0 -82.5 17.5t-79.5 39t-76 39 t-71 17.5q-81 0 -109 -115h-122q12 139 77.5 212t167.5 73q43 0 84 -17.5t80 -39t75.5 -39t70.5 -17.5q79 0 106 115h125q-12 -134 -77 -209.5t-169 -75.5z" /> +<glyph unicode="ö" horiz-adv-x="1251" d="M102 0zM1149 555q0 -271 -139 -423t-387 -152q-155 0 -274 70t-183 201t-64 304q0 269 138 420t389 151q240 0 380 -154.5t140 -416.5zM344 555q0 -383 283 -383q280 0 280 383q0 379 -282 379q-148 0 -214.5 -98t-66.5 -281zM311 1399q0 62 33.5 89.5t81.5 27.5 q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29t-33.5 88zM704 1399q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="÷" d="M96 633v178h977v-178h-977zM457 373q0 64 31.5 99.5t95.5 35.5q61 0 93 -36t32 -99t-34 -100t-91 -37q-60 0 -93.5 35.5t-33.5 101.5zM457 1071q0 64 31.5 99.5t95.5 35.5q61 0 93 -36t32 -99t-34 -100t-91 -37q-60 0 -93.5 35.5t-33.5 101.5z" /> +<glyph unicode="ø" horiz-adv-x="1251" d="M1149 555q0 -271 -139 -423t-387 -152q-144 0 -250 57l-76 -109l-135 90l82 117q-142 155 -142 420q0 269 138 420t389 151q144 0 258 -63l69 100l136 -92l-78 -108q135 -152 135 -408zM344 555q0 -135 37 -219l391 559q-60 39 -147 39q-148 0 -214.5 -98t-66.5 -281z M907 555q0 121 -33 203l-387 -553q54 -33 140 -33q280 0 280 383z" /> +<glyph unicode="ù" horiz-adv-x="1300" d="M158 0zM948 0l-33 145h-12q-49 -77 -139.5 -121t-206.5 -44q-201 0 -300 100t-99 303v723h237v-682q0 -127 52 -190.5t163 -63.5q148 0 217.5 88.5t69.5 296.5v551h236v-1106h-185zM617 1241q-69 52 -174.5 150.5t-153.5 156.5v21h273q38 -70 103.5 -161t109.5 -142v-25 h-158z" /> +<glyph unicode="ú" horiz-adv-x="1300" d="M158 0zM948 0l-33 145h-12q-49 -77 -139.5 -121t-206.5 -44q-201 0 -300 100t-99 303v723h237v-682q0 -127 52 -190.5t163 -63.5q148 0 217.5 88.5t69.5 296.5v551h236v-1106h-185zM501 1241v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5 h-156z" /> +<glyph unicode="û" horiz-adv-x="1300" d="M158 0zM948 0l-33 145h-12q-49 -77 -139.5 -121t-206.5 -44q-201 0 -300 100t-99 303v723h237v-682q0 -127 52 -190.5t163 -63.5q148 0 217.5 88.5t69.5 296.5v551h236v-1106h-185zM871 1241q-123 73 -228 180q-103 -103 -225 -180h-158v25q191 198 254 303h260 q63 -110 256 -303v-25h-159z" /> +<glyph unicode="ü" horiz-adv-x="1300" d="M158 0zM948 0l-33 145h-12q-49 -77 -139.5 -121t-206.5 -44q-201 0 -300 100t-99 303v723h237v-682q0 -127 52 -190.5t163 -63.5q148 0 217.5 88.5t69.5 296.5v551h236v-1106h-185zM332 1399q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32 q-48 0 -81.5 29t-33.5 88zM725 1399q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="ý" horiz-adv-x="1098" d="M0 0zM0 1106h256l225 -627q51 -134 68 -252h8q9 55 33 133.5t254 745.5h254l-473 -1253q-129 -345 -430 -345q-78 0 -152 17v186q53 -12 121 -12q170 0 239 197l41 104zM401 1241v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="þ" horiz-adv-x="1276" d="M403 961q61 86 142.5 125.5t187.5 39.5q206 0 322 -151t116 -420q0 -272 -116.5 -423.5t-321.5 -151.5q-219 0 -330 149h-14l8 -72l6 -92v-457h-235v2048h235v-430l-7 -138l-3 -27h10zM674 934q-142 0 -206.5 -82t-64.5 -260v-37q0 -202 64 -292.5t209 -90.5 q254 0 254 385q0 190 -61.5 283.5t-194.5 93.5z" /> +<glyph unicode="ÿ" horiz-adv-x="1098" d="M0 0zM0 1106h256l225 -627q51 -134 68 -252h8q9 55 33 133.5t254 745.5h254l-473 -1253q-129 -345 -430 -345q-78 0 -152 17v186q53 -12 121 -12q170 0 239 197l41 104zM239 1399q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29 t-33.5 88zM632 1399q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="ı" horiz-adv-x="571" d="M403 0h-235v1106h235v-1106z" /> +<glyph unicode="Œ" horiz-adv-x="1942" d="M1819 0h-820q-102 -20 -211 -20q-320 0 -493.5 196.5t-173.5 558.5q0 360 172 555t491 195q115 0 209 -23h826v-202h-576v-398h539v-200h-539v-459h576v-203zM793 1280q-208 0 -315 -139t-107 -408t106 -409t314 -140q129 0 213 35v1024q-80 37 -211 37z" /> +<glyph unicode="œ" horiz-adv-x="1966" d="M1438 -20q-281 0 -420 194q-132 -194 -400 -194q-236 0 -376 155t-140 420q0 272 137 421.5t382 149.5q121 0 223 -49t168 -145q131 194 379 194q221 0 349 -133.5t128 -365.5v-127h-738q11 -164 85.5 -249t228.5 -85q102 0 187 18.5t181 61.5v-191q-84 -40 -171.5 -57.5 t-202.5 -17.5zM344 555q0 -189 65.5 -286t211.5 -97q141 0 206.5 95.5t65.5 283.5q0 192 -66 287.5t-211 95.5q-143 0 -207.5 -95t-64.5 -284zM1393 948q-110 0 -177.5 -69.5t-78.5 -208.5h497q0 134 -63 206t-178 72z" /> +<glyph unicode="Ÿ" horiz-adv-x="1212" d="M0 0zM606 795l346 667h260l-487 -895v-567h-240v559l-485 903h260zM293 1737q0 62 33.5 89.5t81.5 27.5q53 0 84.5 -31t31.5 -86q0 -53 -32 -85t-84 -32q-48 0 -81.5 29t-33.5 88zM686 1737q0 62 33.5 89.5t81.5 27.5q53 0 85 -31t32 -86q0 -54 -33 -85.5t-84 -31.5 q-48 0 -81.5 29t-33.5 88z" /> +<glyph unicode="ˆ" horiz-adv-x="1227" d="M838 1241q-123 73 -228 180q-103 -103 -225 -180h-158v25q191 198 254 303h260q63 -110 256 -303v-25h-159z" /> +<glyph unicode="˚" horiz-adv-x="1182" d="M827 1468q0 -102 -65.5 -165.5t-173.5 -63.5t-172 62.5t-64 164.5q0 101 63.5 163.5t172.5 62.5q104 0 171.5 -62t67.5 -162zM694 1466q0 50 -30 78.5t-76 28.5q-47 0 -77 -28.5t-30 -78.5q0 -106 107 -106q46 0 76 27.5t30 78.5z" /> +<glyph unicode="˜" horiz-adv-x="1227" d="M776 1241q-42 0 -82.5 17.5t-79.5 39t-76 39t-71 17.5q-81 0 -109 -115h-122q12 139 77.5 212t167.5 73q43 0 84 -17.5t80 -39t75.5 -39t70.5 -17.5q79 0 106 115h125q-12 -134 -77 -209.5t-169 -75.5z" /> +<glyph unicode=" " horiz-adv-x="953" /> +<glyph unicode=" " horiz-adv-x="1907" /> +<glyph unicode=" " horiz-adv-x="953" /> +<glyph unicode=" " horiz-adv-x="1907" /> +<glyph unicode=" " horiz-adv-x="635" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="105" /> +<glyph unicode="‐" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" /> +<glyph unicode="‑" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" /> +<glyph unicode="‒" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" /> +<glyph unicode="–" horiz-adv-x="1024" d="M82 455v190h860v-190h-860z" /> +<glyph unicode="—" horiz-adv-x="2048" d="M82 455v190h1884v-190h-1884z" /> +<glyph unicode="‘" horiz-adv-x="395" d="M37 961l-12 22q20 83 71 224t105 255h170q-64 -256 -101 -501h-233z" /> +<glyph unicode="’" horiz-adv-x="395" d="M356 1462l15 -22q-53 -209 -176 -479h-170q69 289 100 501h231z" /> +<glyph unicode="‚" horiz-adv-x="549" d="M412 215q-48 -186 -176 -479h-173q69 270 103 502h231z" /> +<glyph unicode="“" horiz-adv-x="813" d="M440 983q53 203 178 479h170q-69 -296 -100 -501h-233zM25 983q20 83 71 224t105 255h170q-64 -256 -101 -501h-233z" /> +<glyph unicode="”" horiz-adv-x="813" d="M371 1440q-53 -209 -176 -479h-170q69 289 100 501h231zM788 1440q-53 -209 -176 -479h-172q69 271 103 501h231z" /> +<glyph unicode="„" horiz-adv-x="944" d="M391 215q-55 -214 -176 -479h-172q66 260 102 502h232zM809 215q-48 -186 -176 -479h-172q66 260 102 502h232z" /> +<glyph unicode="•" horiz-adv-x="770" d="M131 748q0 138 66 210t188 72q121 0 187.5 -72.5t66.5 -209.5q0 -135 -67 -209t-187 -74t-187 72.5t-67 210.5z" /> +<glyph unicode="…" horiz-adv-x="1677" d="M133 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113zM690 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113zM1247 125q0 73 38 112t110 39q73 0 111 -40.5 t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="688" d="M82 561l356 432l168 -94l-282 -350l282 -348l-168 -97l-356 431v26z" /> +<glyph unicode="›" horiz-adv-x="688" d="M606 535l-358 -431l-168 97l282 348l-282 350l168 94l358 -432v-26z" /> +<glyph unicode="⁄" horiz-adv-x="266" d="M655 1462l-856 -1462h-192l858 1462h190z" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode="⁴" horiz-adv-x="743" d="M725 762h-125v-176h-192v176h-392v127l396 579h188v-563h125v-143zM408 905v178q0 97 6 197q-52 -104 -88 -158l-148 -217h230z" /> +<glyph unicode="€" horiz-adv-x="1188" d="M799 1278q-141 0 -230.5 -84t-119.5 -254h456v-154h-471l-2 -45v-55l2 -39h408v-153h-391q64 -312 364 -312q143 0 293 62v-203q-131 -61 -305 -61q-241 0 -391.5 132t-196.5 382h-152v153h136l-2 37v37l2 65h-136v154h150q38 251 191 394t395 143q200 0 358 -88 l-84 -187q-154 76 -274 76z" /> +<glyph unicode="™" horiz-adv-x="1561" d="M375 741h-146v592h-202v129h553v-129h-205v-592zM963 741l-185 543h-6l4 -119v-424h-141v721h217l178 -534l187 534h210v-721h-147v414l4 129h-6l-193 -543h-122z" /> +<glyph unicode="" horiz-adv-x="1105" d="M0 1105h1105v-1105h-1105v1105z" /> +<glyph horiz-adv-x="1276" d="M0 0z" /> +<hkern u1=""" u2="Ÿ" k="-20" /> +<hkern u1=""" u2="œ" k="123" /> +<hkern u1=""" u2="ü" k="61" /> +<hkern u1=""" u2="û" k="61" /> +<hkern u1=""" u2="ú" k="61" /> +<hkern u1=""" u2="ù" k="61" /> +<hkern u1=""" u2="ø" k="123" /> +<hkern u1=""" u2="ö" k="123" /> +<hkern u1=""" u2="õ" k="123" /> +<hkern u1=""" u2="ô" k="123" /> +<hkern u1=""" u2="ó" k="123" /> +<hkern u1=""" u2="ò" k="123" /> +<hkern u1=""" u2="ë" k="123" /> +<hkern u1=""" u2="ê" k="123" /> +<hkern u1=""" u2="é" k="123" /> +<hkern u1=""" u2="è" k="123" /> +<hkern u1=""" u2="ç" k="123" /> +<hkern u1=""" u2="æ" k="82" /> +<hkern u1=""" u2="å" k="82" /> +<hkern u1=""" u2="ä" k="82" /> +<hkern u1=""" u2="ã" k="82" /> +<hkern u1=""" u2="â" k="82" /> +<hkern u1=""" u2="á" k="82" /> +<hkern u1=""" u2="à" k="123" /> +<hkern u1=""" u2="Ý" k="-20" /> +<hkern u1=""" u2="Å" k="143" /> +<hkern u1=""" u2="Ä" k="143" /> +<hkern u1=""" u2="Ã" k="143" /> +<hkern u1=""" u2="Â" k="143" /> +<hkern u1=""" u2="Á" k="143" /> +<hkern u1=""" u2="À" k="143" /> +<hkern u1=""" u2="u" k="61" /> +<hkern u1=""" u2="s" k="61" /> +<hkern u1=""" u2="r" k="61" /> +<hkern u1=""" u2="q" k="123" /> +<hkern u1=""" u2="p" k="61" /> +<hkern u1=""" u2="o" k="123" /> +<hkern u1=""" u2="n" k="61" /> +<hkern u1=""" u2="m" k="61" /> +<hkern u1=""" u2="g" k="61" /> +<hkern u1=""" u2="e" k="123" /> +<hkern u1=""" u2="d" k="123" /> +<hkern u1=""" u2="c" k="123" /> +<hkern u1=""" u2="a" k="82" /> +<hkern u1=""" u2="Y" k="-20" /> +<hkern u1=""" u2="W" k="-41" /> +<hkern u1=""" u2="V" k="-41" /> +<hkern u1=""" u2="T" k="-41" /> +<hkern u1=""" u2="A" k="143" /> +<hkern u1="'" u2="Ÿ" k="-20" /> +<hkern u1="'" u2="œ" k="123" /> +<hkern u1="'" u2="ü" k="61" /> +<hkern u1="'" u2="û" k="61" /> +<hkern u1="'" u2="ú" k="61" /> +<hkern u1="'" u2="ù" k="61" /> +<hkern u1="'" u2="ø" k="123" /> +<hkern u1="'" u2="ö" k="123" /> +<hkern u1="'" u2="õ" k="123" /> +<hkern u1="'" u2="ô" k="123" /> +<hkern u1="'" u2="ó" k="123" /> +<hkern u1="'" u2="ò" k="123" /> +<hkern u1="'" u2="ë" k="123" /> +<hkern u1="'" u2="ê" k="123" /> +<hkern u1="'" u2="é" k="123" /> +<hkern u1="'" u2="è" k="123" /> +<hkern u1="'" u2="ç" k="123" /> +<hkern u1="'" u2="æ" k="82" /> +<hkern u1="'" u2="å" k="82" /> +<hkern u1="'" u2="ä" k="82" /> +<hkern u1="'" u2="ã" k="82" /> +<hkern u1="'" u2="â" k="82" /> +<hkern u1="'" u2="á" k="82" /> +<hkern u1="'" u2="à" k="123" /> +<hkern u1="'" u2="Ý" k="-20" /> +<hkern u1="'" u2="Å" k="143" /> +<hkern u1="'" u2="Ä" k="143" /> +<hkern u1="'" u2="Ã" k="143" /> +<hkern u1="'" u2="Â" k="143" /> +<hkern u1="'" u2="Á" k="143" /> +<hkern u1="'" u2="À" k="143" /> +<hkern u1="'" u2="u" k="61" /> +<hkern u1="'" u2="s" k="61" /> +<hkern u1="'" u2="r" k="61" /> +<hkern u1="'" u2="q" k="123" /> +<hkern u1="'" u2="p" k="61" /> +<hkern u1="'" u2="o" k="123" /> +<hkern u1="'" u2="n" k="61" /> +<hkern u1="'" u2="m" k="61" /> +<hkern u1="'" u2="g" k="61" /> +<hkern u1="'" u2="e" k="123" /> +<hkern u1="'" u2="d" k="123" /> +<hkern u1="'" u2="c" k="123" /> +<hkern u1="'" u2="a" k="82" /> +<hkern u1="'" u2="Y" k="-20" /> +<hkern u1="'" u2="W" k="-41" /> +<hkern u1="'" u2="V" k="-41" /> +<hkern u1="'" u2="T" k="-41" /> +<hkern u1="'" u2="A" k="143" /> +<hkern u1="(" u2="J" k="-184" /> +<hkern u1="," u2="Ÿ" k="123" /> +<hkern u1="," u2="Œ" k="102" /> +<hkern u1="," u2="Ý" k="123" /> +<hkern u1="," u2="Ü" k="41" /> +<hkern u1="," u2="Û" k="41" /> +<hkern u1="," u2="Ú" k="41" /> +<hkern u1="," u2="Ù" k="41" /> +<hkern u1="," u2="Ø" k="102" /> +<hkern u1="," u2="Ö" k="102" /> +<hkern u1="," u2="Õ" k="102" /> +<hkern u1="," u2="Ô" k="102" /> +<hkern u1="," u2="Ó" k="102" /> +<hkern u1="," u2="Ò" k="102" /> +<hkern u1="," u2="Ç" k="102" /> +<hkern u1="," u2="Y" k="123" /> +<hkern u1="," u2="W" k="123" /> +<hkern u1="," u2="V" k="123" /> +<hkern u1="," u2="U" k="41" /> +<hkern u1="," u2="T" k="143" /> +<hkern u1="," u2="Q" k="102" /> +<hkern u1="," u2="O" k="102" /> +<hkern u1="," u2="G" k="102" /> +<hkern u1="," u2="C" k="102" /> +<hkern u1="-" u2="T" k="82" /> +<hkern u1="." u2="Ÿ" k="123" /> +<hkern u1="." u2="Œ" k="102" /> +<hkern u1="." u2="Ý" k="123" /> +<hkern u1="." u2="Ü" k="41" /> +<hkern u1="." u2="Û" k="41" /> +<hkern u1="." u2="Ú" k="41" /> +<hkern u1="." u2="Ù" k="41" /> +<hkern u1="." u2="Ø" k="102" /> +<hkern u1="." u2="Ö" k="102" /> +<hkern u1="." u2="Õ" k="102" /> +<hkern u1="." u2="Ô" k="102" /> +<hkern u1="." u2="Ó" k="102" /> +<hkern u1="." u2="Ò" k="102" /> +<hkern u1="." u2="Ç" k="102" /> +<hkern u1="." u2="Y" k="123" /> +<hkern u1="." u2="W" k="123" /> +<hkern u1="." u2="V" k="123" /> +<hkern u1="." u2="U" k="41" /> +<hkern u1="." u2="T" k="143" /> +<hkern u1="." u2="Q" k="102" /> +<hkern u1="." u2="O" k="102" /> +<hkern u1="." u2="G" k="102" /> +<hkern u1="." u2="C" k="102" /> +<hkern u1="A" u2="”" k="143" /> +<hkern u1="A" u2="’" k="143" /> +<hkern u1="A" u2="Ÿ" k="123" /> +<hkern u1="A" u2="Œ" k="41" /> +<hkern u1="A" u2="Ý" k="123" /> +<hkern u1="A" u2="Ø" k="41" /> +<hkern u1="A" u2="Ö" k="41" /> +<hkern u1="A" u2="Õ" k="41" /> +<hkern u1="A" u2="Ô" k="41" /> +<hkern u1="A" u2="Ó" k="41" /> +<hkern u1="A" u2="Ò" k="41" /> +<hkern u1="A" u2="Ç" k="41" /> +<hkern u1="A" u2="Y" k="123" /> +<hkern u1="A" u2="W" k="82" /> +<hkern u1="A" u2="V" k="82" /> +<hkern u1="A" u2="T" k="143" /> +<hkern u1="A" u2="Q" k="41" /> +<hkern u1="A" u2="O" k="41" /> +<hkern u1="A" u2="J" k="-266" /> +<hkern u1="A" u2="G" k="41" /> +<hkern u1="A" u2="C" k="41" /> +<hkern u1="A" u2="'" k="143" /> +<hkern u1="A" u2=""" k="143" /> +<hkern u1="B" u2="„" k="82" /> +<hkern u1="B" u2="‚" k="82" /> +<hkern u1="B" u2="Ÿ" k="20" /> +<hkern u1="B" u2="Ý" k="20" /> +<hkern u1="B" u2="Å" k="41" /> +<hkern u1="B" u2="Ä" k="41" /> +<hkern u1="B" u2="Ã" k="41" /> +<hkern u1="B" u2="Â" k="41" /> +<hkern u1="B" u2="Á" k="41" /> +<hkern u1="B" u2="À" k="41" /> +<hkern u1="B" u2="Z" k="20" /> +<hkern u1="B" u2="Y" k="20" /> +<hkern u1="B" u2="X" k="41" /> +<hkern u1="B" u2="W" k="20" /> +<hkern u1="B" u2="V" k="20" /> +<hkern u1="B" u2="T" k="61" /> +<hkern u1="B" u2="A" k="41" /> +<hkern u1="B" u2="." k="82" /> +<hkern u1="B" u2="," k="82" /> +<hkern u1="C" u2="Œ" k="41" /> +<hkern u1="C" u2="Ø" k="41" /> +<hkern u1="C" u2="Ö" k="41" /> +<hkern u1="C" u2="Õ" k="41" /> +<hkern u1="C" u2="Ô" k="41" /> +<hkern u1="C" u2="Ó" k="41" /> +<hkern u1="C" u2="Ò" k="41" /> +<hkern u1="C" u2="Ç" k="41" /> +<hkern u1="C" u2="Q" k="41" /> +<hkern u1="C" u2="O" k="41" /> +<hkern u1="C" u2="G" k="41" /> +<hkern u1="C" u2="C" k="41" /> +<hkern u1="D" u2="„" k="82" /> +<hkern u1="D" u2="‚" k="82" /> +<hkern u1="D" u2="Ÿ" k="20" /> +<hkern u1="D" u2="Ý" k="20" /> +<hkern u1="D" u2="Å" k="41" /> +<hkern u1="D" u2="Ä" k="41" /> +<hkern u1="D" u2="Ã" k="41" /> +<hkern u1="D" u2="Â" k="41" /> +<hkern u1="D" u2="Á" k="41" /> +<hkern u1="D" u2="À" k="41" /> +<hkern u1="D" u2="Z" k="20" /> +<hkern u1="D" u2="Y" k="20" /> +<hkern u1="D" u2="X" k="41" /> +<hkern u1="D" u2="W" k="20" /> +<hkern u1="D" u2="V" k="20" /> +<hkern u1="D" u2="T" k="61" /> +<hkern u1="D" u2="A" k="41" /> +<hkern u1="D" u2="." k="82" /> +<hkern u1="D" u2="," k="82" /> +<hkern u1="E" u2="J" k="-123" /> +<hkern u1="F" u2="„" k="123" /> +<hkern u1="F" u2="‚" k="123" /> +<hkern u1="F" u2="Å" k="41" /> +<hkern u1="F" u2="Ä" k="41" /> +<hkern u1="F" u2="Ã" k="41" /> +<hkern u1="F" u2="Â" k="41" /> +<hkern u1="F" u2="Á" k="41" /> +<hkern u1="F" u2="À" k="41" /> +<hkern u1="F" u2="A" k="41" /> +<hkern u1="F" u2="?" k="-41" /> +<hkern u1="F" u2="." k="123" /> +<hkern u1="F" u2="," k="123" /> +<hkern u1="K" u2="Œ" k="41" /> +<hkern u1="K" u2="Ø" k="41" /> +<hkern u1="K" u2="Ö" k="41" /> +<hkern u1="K" u2="Õ" k="41" /> +<hkern u1="K" u2="Ô" k="41" /> +<hkern u1="K" u2="Ó" k="41" /> +<hkern u1="K" u2="Ò" k="41" /> +<hkern u1="K" u2="Ç" k="41" /> +<hkern u1="K" u2="Q" k="41" /> +<hkern u1="K" u2="O" k="41" /> +<hkern u1="K" u2="G" k="41" /> +<hkern u1="K" u2="C" k="41" /> +<hkern u1="L" u2="”" k="164" /> +<hkern u1="L" u2="’" k="164" /> +<hkern u1="L" u2="Ÿ" k="61" /> +<hkern u1="L" u2="Œ" k="41" /> +<hkern u1="L" u2="Ý" k="61" /> +<hkern u1="L" u2="Ü" k="20" /> +<hkern u1="L" u2="Û" k="20" /> +<hkern u1="L" u2="Ú" k="20" /> +<hkern u1="L" u2="Ù" k="20" /> +<hkern u1="L" u2="Ø" k="41" /> +<hkern u1="L" u2="Ö" k="41" /> +<hkern u1="L" u2="Õ" k="41" /> +<hkern u1="L" u2="Ô" k="41" /> +<hkern u1="L" u2="Ó" k="41" /> +<hkern u1="L" u2="Ò" k="41" /> +<hkern u1="L" u2="Ç" k="41" /> +<hkern u1="L" u2="Y" k="61" /> +<hkern u1="L" u2="W" k="41" /> +<hkern u1="L" u2="V" k="41" /> +<hkern u1="L" u2="U" k="20" /> +<hkern u1="L" u2="T" k="41" /> +<hkern u1="L" u2="Q" k="41" /> +<hkern u1="L" u2="O" k="41" /> +<hkern u1="L" u2="G" k="41" /> +<hkern u1="L" u2="C" k="41" /> +<hkern u1="L" u2="'" k="164" /> +<hkern u1="L" u2=""" k="164" /> +<hkern u1="O" u2="„" k="82" /> +<hkern u1="O" u2="‚" k="82" /> +<hkern u1="O" u2="Ÿ" k="20" /> +<hkern u1="O" u2="Ý" k="20" /> +<hkern u1="O" u2="Å" k="41" /> +<hkern u1="O" u2="Ä" k="41" /> +<hkern u1="O" u2="Ã" k="41" /> +<hkern u1="O" u2="Â" k="41" /> +<hkern u1="O" u2="Á" k="41" /> +<hkern u1="O" u2="À" k="41" /> +<hkern u1="O" u2="Z" k="20" /> +<hkern u1="O" u2="Y" k="20" /> +<hkern u1="O" u2="X" k="41" /> +<hkern u1="O" u2="W" k="20" /> +<hkern u1="O" u2="V" k="20" /> +<hkern u1="O" u2="T" k="61" /> +<hkern u1="O" u2="A" k="41" /> +<hkern u1="O" u2="." k="82" /> +<hkern u1="O" u2="," k="82" /> +<hkern u1="P" u2="„" k="266" /> +<hkern u1="P" u2="‚" k="266" /> +<hkern u1="P" u2="Å" k="102" /> +<hkern u1="P" u2="Ä" k="102" /> +<hkern u1="P" u2="Ã" k="102" /> +<hkern u1="P" u2="Â" k="102" /> +<hkern u1="P" u2="Á" k="102" /> +<hkern u1="P" u2="À" k="102" /> +<hkern u1="P" u2="Z" k="20" /> +<hkern u1="P" u2="X" k="41" /> +<hkern u1="P" u2="A" k="102" /> +<hkern u1="P" u2="." k="266" /> +<hkern u1="P" u2="," k="266" /> +<hkern u1="Q" u2="„" k="82" /> +<hkern u1="Q" u2="‚" k="82" /> +<hkern u1="Q" u2="Ÿ" k="20" /> +<hkern u1="Q" u2="Ý" k="20" /> +<hkern u1="Q" u2="Å" k="41" /> +<hkern u1="Q" u2="Ä" k="41" /> +<hkern u1="Q" u2="Ã" k="41" /> +<hkern u1="Q" u2="Â" k="41" /> +<hkern u1="Q" u2="Á" k="41" /> +<hkern u1="Q" u2="À" k="41" /> +<hkern u1="Q" u2="Z" k="20" /> +<hkern u1="Q" u2="Y" k="20" /> +<hkern u1="Q" u2="X" k="41" /> +<hkern u1="Q" u2="W" k="20" /> +<hkern u1="Q" u2="V" k="20" /> +<hkern u1="Q" u2="T" k="61" /> +<hkern u1="Q" u2="A" k="41" /> +<hkern u1="Q" u2="." k="82" /> +<hkern u1="Q" u2="," k="82" /> +<hkern u1="T" u2="„" k="123" /> +<hkern u1="T" u2="‚" k="123" /> +<hkern u1="T" u2="—" k="82" /> +<hkern u1="T" u2="–" k="82" /> +<hkern u1="T" u2="œ" k="143" /> +<hkern u1="T" u2="Œ" k="41" /> +<hkern u1="T" u2="ý" k="41" /> +<hkern u1="T" u2="ü" k="102" /> +<hkern u1="T" u2="û" k="102" /> +<hkern u1="T" u2="ú" k="102" /> +<hkern u1="T" u2="ù" k="102" /> +<hkern u1="T" u2="ø" k="143" /> +<hkern u1="T" u2="ö" k="143" /> +<hkern u1="T" u2="õ" k="143" /> +<hkern u1="T" u2="ô" k="143" /> +<hkern u1="T" u2="ó" k="143" /> +<hkern u1="T" u2="ò" k="143" /> +<hkern u1="T" u2="ë" k="143" /> +<hkern u1="T" u2="ê" k="143" /> +<hkern u1="T" u2="é" k="143" /> +<hkern u1="T" u2="è" k="143" /> +<hkern u1="T" u2="ç" k="143" /> +<hkern u1="T" u2="æ" k="164" /> +<hkern u1="T" u2="å" k="164" /> +<hkern u1="T" u2="ä" k="164" /> +<hkern u1="T" u2="ã" k="164" /> +<hkern u1="T" u2="â" k="164" /> +<hkern u1="T" u2="á" k="164" /> +<hkern u1="T" u2="à" k="143" /> +<hkern u1="T" u2="Ø" k="41" /> +<hkern u1="T" u2="Ö" k="41" /> +<hkern u1="T" u2="Õ" k="41" /> +<hkern u1="T" u2="Ô" k="41" /> +<hkern u1="T" u2="Ó" k="41" /> +<hkern u1="T" u2="Ò" k="41" /> +<hkern u1="T" u2="Ç" k="41" /> +<hkern u1="T" u2="Å" k="143" /> +<hkern u1="T" u2="Ä" k="143" /> +<hkern u1="T" u2="Ã" k="143" /> +<hkern u1="T" u2="Â" k="143" /> +<hkern u1="T" u2="Á" k="143" /> +<hkern u1="T" u2="À" k="143" /> +<hkern u1="T" u2="z" k="82" /> +<hkern u1="T" u2="y" k="41" /> +<hkern u1="T" u2="x" k="41" /> +<hkern u1="T" u2="w" k="41" /> +<hkern u1="T" u2="v" k="41" /> +<hkern u1="T" u2="u" k="102" /> +<hkern u1="T" u2="s" k="123" /> +<hkern u1="T" u2="r" k="102" /> +<hkern u1="T" u2="q" k="143" /> +<hkern u1="T" u2="p" k="102" /> +<hkern u1="T" u2="o" k="143" /> +<hkern u1="T" u2="n" k="102" /> +<hkern u1="T" u2="m" k="102" /> +<hkern u1="T" u2="g" k="143" /> +<hkern u1="T" u2="e" k="143" /> +<hkern u1="T" u2="d" k="143" /> +<hkern u1="T" u2="c" k="143" /> +<hkern u1="T" u2="a" k="164" /> +<hkern u1="T" u2="T" k="-41" /> +<hkern u1="T" u2="Q" k="41" /> +<hkern u1="T" u2="O" k="41" /> +<hkern u1="T" u2="G" k="41" /> +<hkern u1="T" u2="C" k="41" /> +<hkern u1="T" u2="A" k="143" /> +<hkern u1="T" u2="?" k="-41" /> +<hkern u1="T" u2="." k="123" /> +<hkern u1="T" u2="-" k="82" /> +<hkern u1="T" u2="," k="123" /> +<hkern u1="U" u2="„" k="41" /> +<hkern u1="U" u2="‚" k="41" /> +<hkern u1="U" u2="Å" k="20" /> +<hkern u1="U" u2="Ä" k="20" /> +<hkern u1="U" u2="Ã" k="20" /> +<hkern u1="U" u2="Â" k="20" /> +<hkern u1="U" u2="Á" k="20" /> +<hkern u1="U" u2="À" k="20" /> +<hkern u1="U" u2="A" k="20" /> +<hkern u1="U" u2="." k="41" /> +<hkern u1="U" u2="," k="41" /> +<hkern u1="V" u2="„" k="102" /> +<hkern u1="V" u2="‚" k="102" /> +<hkern u1="V" u2="œ" k="41" /> +<hkern u1="V" u2="Œ" k="20" /> +<hkern u1="V" u2="ü" k="20" /> +<hkern u1="V" u2="û" k="20" /> +<hkern u1="V" u2="ú" k="20" /> +<hkern u1="V" u2="ù" k="20" /> +<hkern u1="V" u2="ø" k="41" /> +<hkern u1="V" u2="ö" k="41" /> +<hkern u1="V" u2="õ" k="41" /> +<hkern u1="V" u2="ô" k="41" /> +<hkern u1="V" u2="ó" k="41" /> +<hkern u1="V" u2="ò" k="41" /> +<hkern u1="V" u2="ë" k="41" /> +<hkern u1="V" u2="ê" k="41" /> +<hkern u1="V" u2="é" k="41" /> +<hkern u1="V" u2="è" k="41" /> +<hkern u1="V" u2="ç" k="41" /> +<hkern u1="V" u2="æ" k="41" /> +<hkern u1="V" u2="å" k="41" /> +<hkern u1="V" u2="ä" k="41" /> +<hkern u1="V" u2="ã" k="41" /> +<hkern u1="V" u2="â" k="41" /> +<hkern u1="V" u2="á" k="41" /> +<hkern u1="V" u2="à" k="41" /> +<hkern u1="V" u2="Ø" k="20" /> +<hkern u1="V" u2="Ö" k="20" /> +<hkern u1="V" u2="Õ" k="20" /> +<hkern u1="V" u2="Ô" k="20" /> +<hkern u1="V" u2="Ó" k="20" /> +<hkern u1="V" u2="Ò" k="20" /> +<hkern u1="V" u2="Ç" k="20" /> +<hkern u1="V" u2="Å" k="82" /> +<hkern u1="V" u2="Ä" k="82" /> +<hkern u1="V" u2="Ã" k="82" /> +<hkern u1="V" u2="Â" k="82" /> +<hkern u1="V" u2="Á" k="82" /> +<hkern u1="V" u2="À" k="82" /> +<hkern u1="V" u2="u" k="20" /> +<hkern u1="V" u2="s" k="20" /> +<hkern u1="V" u2="r" k="20" /> +<hkern u1="V" u2="q" k="41" /> +<hkern u1="V" u2="p" k="20" /> +<hkern u1="V" u2="o" k="41" /> +<hkern u1="V" u2="n" k="20" /> +<hkern u1="V" u2="m" k="20" /> +<hkern u1="V" u2="g" k="20" /> +<hkern u1="V" u2="e" k="41" /> +<hkern u1="V" u2="d" k="41" /> +<hkern u1="V" u2="c" k="41" /> +<hkern u1="V" u2="a" k="41" /> +<hkern u1="V" u2="Q" k="20" /> +<hkern u1="V" u2="O" k="20" /> +<hkern u1="V" u2="G" k="20" /> +<hkern u1="V" u2="C" k="20" /> +<hkern u1="V" u2="A" k="82" /> +<hkern u1="V" u2="?" k="-41" /> +<hkern u1="V" u2="." k="102" /> +<hkern u1="V" u2="," k="102" /> +<hkern u1="W" u2="„" k="102" /> +<hkern u1="W" u2="‚" k="102" /> +<hkern u1="W" u2="œ" k="41" /> +<hkern u1="W" u2="Œ" k="20" /> +<hkern u1="W" u2="ü" k="20" /> +<hkern u1="W" u2="û" k="20" /> +<hkern u1="W" u2="ú" k="20" /> +<hkern u1="W" u2="ù" k="20" /> +<hkern u1="W" u2="ø" k="41" /> +<hkern u1="W" u2="ö" k="41" /> +<hkern u1="W" u2="õ" k="41" /> +<hkern u1="W" u2="ô" k="41" /> +<hkern u1="W" u2="ó" k="41" /> +<hkern u1="W" u2="ò" k="41" /> +<hkern u1="W" u2="ë" k="41" /> +<hkern u1="W" u2="ê" k="41" /> +<hkern u1="W" u2="é" k="41" /> +<hkern u1="W" u2="è" k="41" /> +<hkern u1="W" u2="ç" k="41" /> +<hkern u1="W" u2="æ" k="41" /> +<hkern u1="W" u2="å" k="41" /> +<hkern u1="W" u2="ä" k="41" /> +<hkern u1="W" u2="ã" k="41" /> +<hkern u1="W" u2="â" k="41" /> +<hkern u1="W" u2="á" k="41" /> +<hkern u1="W" u2="à" k="41" /> +<hkern u1="W" u2="Ø" k="20" /> +<hkern u1="W" u2="Ö" k="20" /> +<hkern u1="W" u2="Õ" k="20" /> +<hkern u1="W" u2="Ô" k="20" /> +<hkern u1="W" u2="Ó" k="20" /> +<hkern u1="W" u2="Ò" k="20" /> +<hkern u1="W" u2="Ç" k="20" /> +<hkern u1="W" u2="Å" k="82" /> +<hkern u1="W" u2="Ä" k="82" /> +<hkern u1="W" u2="Ã" k="82" /> +<hkern u1="W" u2="Â" k="82" /> +<hkern u1="W" u2="Á" k="82" /> +<hkern u1="W" u2="À" k="82" /> +<hkern u1="W" u2="u" k="20" /> +<hkern u1="W" u2="s" k="20" /> +<hkern u1="W" u2="r" k="20" /> +<hkern u1="W" u2="q" k="41" /> +<hkern u1="W" u2="p" k="20" /> +<hkern u1="W" u2="o" k="41" /> +<hkern u1="W" u2="n" k="20" /> +<hkern u1="W" u2="m" k="20" /> +<hkern u1="W" u2="g" k="20" /> +<hkern u1="W" u2="e" k="41" /> +<hkern u1="W" u2="d" k="41" /> +<hkern u1="W" u2="c" k="41" /> +<hkern u1="W" u2="a" k="41" /> +<hkern u1="W" u2="Q" k="20" /> +<hkern u1="W" u2="O" k="20" /> +<hkern u1="W" u2="G" k="20" /> +<hkern u1="W" u2="C" k="20" /> +<hkern u1="W" u2="A" k="82" /> +<hkern u1="W" u2="?" k="-41" /> +<hkern u1="W" u2="." k="102" /> +<hkern u1="W" u2="," k="102" /> +<hkern u1="X" u2="Œ" k="41" /> +<hkern u1="X" u2="Ø" k="41" /> +<hkern u1="X" u2="Ö" k="41" /> +<hkern u1="X" u2="Õ" k="41" /> +<hkern u1="X" u2="Ô" k="41" /> +<hkern u1="X" u2="Ó" k="41" /> +<hkern u1="X" u2="Ò" k="41" /> +<hkern u1="X" u2="Ç" k="41" /> +<hkern u1="X" u2="Q" k="41" /> +<hkern u1="X" u2="O" k="41" /> +<hkern u1="X" u2="G" k="41" /> +<hkern u1="X" u2="C" k="41" /> +<hkern u1="Y" u2="„" k="123" /> +<hkern u1="Y" u2="‚" k="123" /> +<hkern u1="Y" u2="œ" k="102" /> +<hkern u1="Y" u2="Œ" k="41" /> +<hkern u1="Y" u2="ü" k="61" /> +<hkern u1="Y" u2="û" k="61" /> +<hkern u1="Y" u2="ú" k="61" /> +<hkern u1="Y" u2="ù" k="61" /> +<hkern u1="Y" u2="ø" k="102" /> +<hkern u1="Y" u2="ö" k="102" /> +<hkern u1="Y" u2="õ" k="102" /> +<hkern u1="Y" u2="ô" k="102" /> +<hkern u1="Y" u2="ó" k="102" /> +<hkern u1="Y" u2="ò" k="102" /> +<hkern u1="Y" u2="ë" k="102" /> +<hkern u1="Y" u2="ê" k="102" /> +<hkern u1="Y" u2="é" k="102" /> +<hkern u1="Y" u2="è" k="102" /> +<hkern u1="Y" u2="ç" k="102" /> +<hkern u1="Y" u2="æ" k="102" /> +<hkern u1="Y" u2="å" k="102" /> +<hkern u1="Y" u2="ä" k="102" /> +<hkern u1="Y" u2="ã" k="102" /> +<hkern u1="Y" u2="â" k="102" /> +<hkern u1="Y" u2="á" k="102" /> +<hkern u1="Y" u2="à" k="102" /> +<hkern u1="Y" u2="Ø" k="41" /> +<hkern u1="Y" u2="Ö" k="41" /> +<hkern u1="Y" u2="Õ" k="41" /> +<hkern u1="Y" u2="Ô" k="41" /> +<hkern u1="Y" u2="Ó" k="41" /> +<hkern u1="Y" u2="Ò" k="41" /> +<hkern u1="Y" u2="Ç" k="41" /> +<hkern u1="Y" u2="Å" k="123" /> +<hkern u1="Y" u2="Ä" k="123" /> +<hkern u1="Y" u2="Ã" k="123" /> +<hkern u1="Y" u2="Â" k="123" /> +<hkern u1="Y" u2="Á" k="123" /> +<hkern u1="Y" u2="À" k="123" /> +<hkern u1="Y" u2="z" k="41" /> +<hkern u1="Y" u2="u" k="61" /> +<hkern u1="Y" u2="s" k="82" /> +<hkern u1="Y" u2="r" k="61" /> +<hkern u1="Y" u2="q" k="102" /> +<hkern u1="Y" u2="p" k="61" /> +<hkern u1="Y" u2="o" k="102" /> +<hkern u1="Y" u2="n" k="61" /> +<hkern u1="Y" u2="m" k="61" /> +<hkern u1="Y" u2="g" k="41" /> +<hkern u1="Y" u2="e" k="102" /> +<hkern u1="Y" u2="d" k="102" /> +<hkern u1="Y" u2="c" k="102" /> +<hkern u1="Y" u2="a" k="102" /> +<hkern u1="Y" u2="Q" k="41" /> +<hkern u1="Y" u2="O" k="41" /> +<hkern u1="Y" u2="G" k="41" /> +<hkern u1="Y" u2="C" k="41" /> +<hkern u1="Y" u2="A" k="123" /> +<hkern u1="Y" u2="?" k="-41" /> +<hkern u1="Y" u2="." k="123" /> +<hkern u1="Y" u2="," k="123" /> +<hkern u1="Z" u2="Œ" k="20" /> +<hkern u1="Z" u2="Ø" k="20" /> +<hkern u1="Z" u2="Ö" k="20" /> +<hkern u1="Z" u2="Õ" k="20" /> +<hkern u1="Z" u2="Ô" k="20" /> +<hkern u1="Z" u2="Ó" k="20" /> +<hkern u1="Z" u2="Ò" k="20" /> +<hkern u1="Z" u2="Ç" k="20" /> +<hkern u1="Z" u2="Q" k="20" /> +<hkern u1="Z" u2="O" k="20" /> +<hkern u1="Z" u2="G" k="20" /> +<hkern u1="Z" u2="C" k="20" /> +<hkern u1="[" u2="J" k="-184" /> +<hkern u1="a" u2="”" k="20" /> +<hkern u1="a" u2="’" k="20" /> +<hkern u1="a" u2="'" k="20" /> +<hkern u1="a" u2=""" k="20" /> +<hkern u1="b" u2="”" k="20" /> +<hkern u1="b" u2="’" k="20" /> +<hkern u1="b" u2="ý" k="41" /> +<hkern u1="b" u2="z" k="20" /> +<hkern u1="b" u2="y" k="41" /> +<hkern u1="b" u2="x" k="41" /> +<hkern u1="b" u2="w" k="41" /> +<hkern u1="b" u2="v" k="41" /> +<hkern u1="b" u2="'" k="20" /> +<hkern u1="b" u2=""" k="20" /> +<hkern u1="c" u2="”" k="-41" /> +<hkern u1="c" u2="’" k="-41" /> +<hkern u1="c" u2="'" k="-41" /> +<hkern u1="c" u2=""" k="-41" /> +<hkern u1="e" u2="”" k="20" /> +<hkern u1="e" u2="’" k="20" /> +<hkern u1="e" u2="ý" k="41" /> +<hkern u1="e" u2="z" k="20" /> +<hkern u1="e" u2="y" k="41" /> +<hkern u1="e" u2="x" k="41" /> +<hkern u1="e" u2="w" k="41" /> +<hkern u1="e" u2="v" k="41" /> +<hkern u1="e" u2="'" k="20" /> +<hkern u1="e" u2=""" k="20" /> +<hkern u1="f" u2="”" k="-123" /> +<hkern u1="f" u2="’" k="-123" /> +<hkern u1="f" u2="'" k="-123" /> +<hkern u1="f" u2=""" k="-123" /> +<hkern u1="h" u2="”" k="20" /> +<hkern u1="h" u2="’" k="20" /> +<hkern u1="h" u2="'" k="20" /> +<hkern u1="h" u2=""" k="20" /> +<hkern u1="k" u2="œ" k="41" /> +<hkern u1="k" u2="ø" k="41" /> +<hkern u1="k" u2="ö" k="41" /> +<hkern u1="k" u2="õ" k="41" /> +<hkern u1="k" u2="ô" k="41" /> +<hkern u1="k" u2="ó" k="41" /> +<hkern u1="k" u2="ò" k="41" /> +<hkern u1="k" u2="ë" k="41" /> +<hkern u1="k" u2="ê" k="41" /> +<hkern u1="k" u2="é" k="41" /> +<hkern u1="k" u2="è" k="41" /> +<hkern u1="k" u2="ç" k="41" /> +<hkern u1="k" u2="à" k="41" /> +<hkern u1="k" u2="q" k="41" /> +<hkern u1="k" u2="o" k="41" /> +<hkern u1="k" u2="e" k="41" /> +<hkern u1="k" u2="d" k="41" /> +<hkern u1="k" u2="c" k="41" /> +<hkern u1="m" u2="”" k="20" /> +<hkern u1="m" u2="’" k="20" /> +<hkern u1="m" u2="'" k="20" /> +<hkern u1="m" u2=""" k="20" /> +<hkern u1="n" u2="”" k="20" /> +<hkern u1="n" u2="’" k="20" /> +<hkern u1="n" u2="'" k="20" /> +<hkern u1="n" u2=""" k="20" /> +<hkern u1="o" u2="”" k="20" /> +<hkern u1="o" u2="’" k="20" /> +<hkern u1="o" u2="ý" k="41" /> +<hkern u1="o" u2="z" k="20" /> +<hkern u1="o" u2="y" k="41" /> +<hkern u1="o" u2="x" k="41" /> +<hkern u1="o" u2="w" k="41" /> +<hkern u1="o" u2="v" k="41" /> +<hkern u1="o" u2="'" k="20" /> +<hkern u1="o" u2=""" k="20" /> +<hkern u1="p" u2="”" k="20" /> +<hkern u1="p" u2="’" k="20" /> +<hkern u1="p" u2="ý" k="41" /> +<hkern u1="p" u2="z" k="20" /> +<hkern u1="p" u2="y" k="41" /> +<hkern u1="p" u2="x" k="41" /> +<hkern u1="p" u2="w" k="41" /> +<hkern u1="p" u2="v" k="41" /> +<hkern u1="p" u2="'" k="20" /> +<hkern u1="p" u2=""" k="20" /> +<hkern u1="r" u2="”" k="-82" /> +<hkern u1="r" u2="’" k="-82" /> +<hkern u1="r" u2="œ" k="41" /> +<hkern u1="r" u2="ø" k="41" /> +<hkern u1="r" u2="ö" k="41" /> +<hkern u1="r" u2="õ" k="41" /> +<hkern u1="r" u2="ô" k="41" /> +<hkern u1="r" u2="ó" k="41" /> +<hkern u1="r" u2="ò" k="41" /> +<hkern u1="r" u2="ë" k="41" /> +<hkern u1="r" u2="ê" k="41" /> +<hkern u1="r" u2="é" k="41" /> +<hkern u1="r" u2="è" k="41" /> +<hkern u1="r" u2="ç" k="41" /> +<hkern u1="r" u2="æ" k="41" /> +<hkern u1="r" u2="å" k="41" /> +<hkern u1="r" u2="ä" k="41" /> +<hkern u1="r" u2="ã" k="41" /> +<hkern u1="r" u2="â" k="41" /> +<hkern u1="r" u2="á" k="41" /> +<hkern u1="r" u2="à" k="41" /> +<hkern u1="r" u2="q" k="41" /> +<hkern u1="r" u2="o" k="41" /> +<hkern u1="r" u2="g" k="20" /> +<hkern u1="r" u2="e" k="41" /> +<hkern u1="r" u2="d" k="41" /> +<hkern u1="r" u2="c" k="41" /> +<hkern u1="r" u2="a" k="41" /> +<hkern u1="r" u2="'" k="-82" /> +<hkern u1="r" u2=""" k="-82" /> +<hkern u1="t" u2="”" k="-41" /> +<hkern u1="t" u2="’" k="-41" /> +<hkern u1="t" u2="'" k="-41" /> +<hkern u1="t" u2=""" k="-41" /> +<hkern u1="v" u2="„" k="82" /> +<hkern u1="v" u2="”" k="-82" /> +<hkern u1="v" u2="‚" k="82" /> +<hkern u1="v" u2="’" k="-82" /> +<hkern u1="v" u2="?" k="-41" /> +<hkern u1="v" u2="." k="82" /> +<hkern u1="v" u2="," k="82" /> +<hkern u1="v" u2="'" k="-82" /> +<hkern u1="v" u2=""" k="-82" /> +<hkern u1="w" u2="„" k="82" /> +<hkern u1="w" u2="”" k="-82" /> +<hkern u1="w" u2="‚" k="82" /> +<hkern u1="w" u2="’" k="-82" /> +<hkern u1="w" u2="?" k="-41" /> +<hkern u1="w" u2="." k="82" /> +<hkern u1="w" u2="," k="82" /> +<hkern u1="w" u2="'" k="-82" /> +<hkern u1="w" u2=""" k="-82" /> +<hkern u1="x" u2="œ" k="41" /> +<hkern u1="x" u2="ø" k="41" /> +<hkern u1="x" u2="ö" k="41" /> +<hkern u1="x" u2="õ" k="41" /> +<hkern u1="x" u2="ô" k="41" /> +<hkern u1="x" u2="ó" k="41" /> +<hkern u1="x" u2="ò" k="41" /> +<hkern u1="x" u2="ë" k="41" /> +<hkern u1="x" u2="ê" k="41" /> +<hkern u1="x" u2="é" k="41" /> +<hkern u1="x" u2="è" k="41" /> +<hkern u1="x" u2="ç" k="41" /> +<hkern u1="x" u2="à" k="41" /> +<hkern u1="x" u2="q" k="41" /> +<hkern u1="x" u2="o" k="41" /> +<hkern u1="x" u2="e" k="41" /> +<hkern u1="x" u2="d" k="41" /> +<hkern u1="x" u2="c" k="41" /> +<hkern u1="y" u2="„" k="82" /> +<hkern u1="y" u2="”" k="-82" /> +<hkern u1="y" u2="‚" k="82" /> +<hkern u1="y" u2="’" k="-82" /> +<hkern u1="y" u2="?" k="-41" /> +<hkern u1="y" u2="." k="82" /> +<hkern u1="y" u2="," k="82" /> +<hkern u1="y" u2="'" k="-82" /> +<hkern u1="y" u2=""" k="-82" /> +<hkern u1="{" u2="J" k="-184" /> +<hkern u1="À" u2="”" k="143" /> +<hkern u1="À" u2="’" k="143" /> +<hkern u1="À" u2="Ÿ" k="123" /> +<hkern u1="À" u2="Œ" k="41" /> +<hkern u1="À" u2="Ý" k="123" /> +<hkern u1="À" u2="Ø" k="41" /> +<hkern u1="À" u2="Ö" k="41" /> +<hkern u1="À" u2="Õ" k="41" /> +<hkern u1="À" u2="Ô" k="41" /> +<hkern u1="À" u2="Ó" k="41" /> +<hkern u1="À" u2="Ò" k="41" /> +<hkern u1="À" u2="Ç" k="41" /> +<hkern u1="À" u2="Y" k="123" /> +<hkern u1="À" u2="W" k="82" /> +<hkern u1="À" u2="V" k="82" /> +<hkern u1="À" u2="T" k="143" /> +<hkern u1="À" u2="Q" k="41" /> +<hkern u1="À" u2="O" k="41" /> +<hkern u1="À" u2="J" k="-266" /> +<hkern u1="À" u2="G" k="41" /> +<hkern u1="À" u2="C" k="41" /> +<hkern u1="À" u2="'" k="143" /> +<hkern u1="À" u2=""" k="143" /> +<hkern u1="Á" u2="”" k="143" /> +<hkern u1="Á" u2="’" k="143" /> +<hkern u1="Á" u2="Ÿ" k="123" /> +<hkern u1="Á" u2="Œ" k="41" /> +<hkern u1="Á" u2="Ý" k="123" /> +<hkern u1="Á" u2="Ø" k="41" /> +<hkern u1="Á" u2="Ö" k="41" /> +<hkern u1="Á" u2="Õ" k="41" /> +<hkern u1="Á" u2="Ô" k="41" /> +<hkern u1="Á" u2="Ó" k="41" /> +<hkern u1="Á" u2="Ò" k="41" /> +<hkern u1="Á" u2="Ç" k="41" /> +<hkern u1="Á" u2="Y" k="123" /> +<hkern u1="Á" u2="W" k="82" /> +<hkern u1="Á" u2="V" k="82" /> +<hkern u1="Á" u2="T" k="143" /> +<hkern u1="Á" u2="Q" k="41" /> +<hkern u1="Á" u2="O" k="41" /> +<hkern u1="Á" u2="J" k="-266" /> +<hkern u1="Á" u2="G" k="41" /> +<hkern u1="Á" u2="C" k="41" /> +<hkern u1="Á" u2="'" k="143" /> +<hkern u1="Á" u2=""" k="143" /> +<hkern u1="Â" u2="”" k="143" /> +<hkern u1="Â" u2="’" k="143" /> +<hkern u1="Â" u2="Ÿ" k="123" /> +<hkern u1="Â" u2="Œ" k="41" /> +<hkern u1="Â" u2="Ý" k="123" /> +<hkern u1="Â" u2="Ø" k="41" /> +<hkern u1="Â" u2="Ö" k="41" /> +<hkern u1="Â" u2="Õ" k="41" /> +<hkern u1="Â" u2="Ô" k="41" /> +<hkern u1="Â" u2="Ó" k="41" /> +<hkern u1="Â" u2="Ò" k="41" /> +<hkern u1="Â" u2="Ç" k="41" /> +<hkern u1="Â" u2="Y" k="123" /> +<hkern u1="Â" u2="W" k="82" /> +<hkern u1="Â" u2="V" k="82" /> +<hkern u1="Â" u2="T" k="143" /> +<hkern u1="Â" u2="Q" k="41" /> +<hkern u1="Â" u2="O" k="41" /> +<hkern u1="Â" u2="J" k="-266" /> +<hkern u1="Â" u2="G" k="41" /> +<hkern u1="Â" u2="C" k="41" /> +<hkern u1="Â" u2="'" k="143" /> +<hkern u1="Â" u2=""" k="143" /> +<hkern u1="Ã" u2="”" k="143" /> +<hkern u1="Ã" u2="’" k="143" /> +<hkern u1="Ã" u2="Ÿ" k="123" /> +<hkern u1="Ã" u2="Œ" k="41" /> +<hkern u1="Ã" u2="Ý" k="123" /> +<hkern u1="Ã" u2="Ø" k="41" /> +<hkern u1="Ã" u2="Ö" k="41" /> +<hkern u1="Ã" u2="Õ" k="41" /> +<hkern u1="Ã" u2="Ô" k="41" /> +<hkern u1="Ã" u2="Ó" k="41" /> +<hkern u1="Ã" u2="Ò" k="41" /> +<hkern u1="Ã" u2="Ç" k="41" /> +<hkern u1="Ã" u2="Y" k="123" /> +<hkern u1="Ã" u2="W" k="82" /> +<hkern u1="Ã" u2="V" k="82" /> +<hkern u1="Ã" u2="T" k="143" /> +<hkern u1="Ã" u2="Q" k="41" /> +<hkern u1="Ã" u2="O" k="41" /> +<hkern u1="Ã" u2="J" k="-266" /> +<hkern u1="Ã" u2="G" k="41" /> +<hkern u1="Ã" u2="C" k="41" /> +<hkern u1="Ã" u2="'" k="143" /> +<hkern u1="Ã" u2=""" k="143" /> +<hkern u1="Ä" u2="”" k="143" /> +<hkern u1="Ä" u2="’" k="143" /> +<hkern u1="Ä" u2="Ÿ" k="123" /> +<hkern u1="Ä" u2="Œ" k="41" /> +<hkern u1="Ä" u2="Ý" k="123" /> +<hkern u1="Ä" u2="Ø" k="41" /> +<hkern u1="Ä" u2="Ö" k="41" /> +<hkern u1="Ä" u2="Õ" k="41" /> +<hkern u1="Ä" u2="Ô" k="41" /> +<hkern u1="Ä" u2="Ó" k="41" /> +<hkern u1="Ä" u2="Ò" k="41" /> +<hkern u1="Ä" u2="Ç" k="41" /> +<hkern u1="Ä" u2="Y" k="123" /> +<hkern u1="Ä" u2="W" k="82" /> +<hkern u1="Ä" u2="V" k="82" /> +<hkern u1="Ä" u2="T" k="143" /> +<hkern u1="Ä" u2="Q" k="41" /> +<hkern u1="Ä" u2="O" k="41" /> +<hkern u1="Ä" u2="J" k="-266" /> +<hkern u1="Ä" u2="G" k="41" /> +<hkern u1="Ä" u2="C" k="41" /> +<hkern u1="Ä" u2="'" k="143" /> +<hkern u1="Ä" u2=""" k="143" /> +<hkern u1="Å" u2="”" k="143" /> +<hkern u1="Å" u2="’" k="143" /> +<hkern u1="Å" u2="Ÿ" k="123" /> +<hkern u1="Å" u2="Œ" k="41" /> +<hkern u1="Å" u2="Ý" k="123" /> +<hkern u1="Å" u2="Ø" k="41" /> +<hkern u1="Å" u2="Ö" k="41" /> +<hkern u1="Å" u2="Õ" k="41" /> +<hkern u1="Å" u2="Ô" k="41" /> +<hkern u1="Å" u2="Ó" k="41" /> +<hkern u1="Å" u2="Ò" k="41" /> +<hkern u1="Å" u2="Ç" k="41" /> +<hkern u1="Å" u2="Y" k="123" /> +<hkern u1="Å" u2="W" k="82" /> +<hkern u1="Å" u2="V" k="82" /> +<hkern u1="Å" u2="T" k="143" /> +<hkern u1="Å" u2="Q" k="41" /> +<hkern u1="Å" u2="O" k="41" /> +<hkern u1="Å" u2="J" k="-266" /> +<hkern u1="Å" u2="G" k="41" /> +<hkern u1="Å" u2="C" k="41" /> +<hkern u1="Å" u2="'" k="143" /> +<hkern u1="Å" u2=""" k="143" /> +<hkern u1="Æ" u2="J" k="-123" /> +<hkern u1="Ç" u2="Œ" k="41" /> +<hkern u1="Ç" u2="Ø" k="41" /> +<hkern u1="Ç" u2="Ö" k="41" /> +<hkern u1="Ç" u2="Õ" k="41" /> +<hkern u1="Ç" u2="Ô" k="41" /> +<hkern u1="Ç" u2="Ó" k="41" /> +<hkern u1="Ç" u2="Ò" k="41" /> +<hkern u1="Ç" u2="Ç" k="41" /> +<hkern u1="Ç" u2="Q" k="41" /> +<hkern u1="Ç" u2="O" k="41" /> +<hkern u1="Ç" u2="G" k="41" /> +<hkern u1="Ç" u2="C" k="41" /> +<hkern u1="È" u2="J" k="-123" /> +<hkern u1="É" u2="J" k="-123" /> +<hkern u1="Ê" u2="J" k="-123" /> +<hkern u1="Ë" u2="J" k="-123" /> +<hkern u1="Ð" u2="„" k="82" /> +<hkern u1="Ð" u2="‚" k="82" /> +<hkern u1="Ð" u2="Ÿ" k="20" /> +<hkern u1="Ð" u2="Ý" k="20" /> +<hkern u1="Ð" u2="Å" k="41" /> +<hkern u1="Ð" u2="Ä" k="41" /> +<hkern u1="Ð" u2="Ã" k="41" /> +<hkern u1="Ð" u2="Â" k="41" /> +<hkern u1="Ð" u2="Á" k="41" /> +<hkern u1="Ð" u2="À" k="41" /> +<hkern u1="Ð" u2="Z" k="20" /> +<hkern u1="Ð" u2="Y" k="20" /> +<hkern u1="Ð" u2="X" k="41" /> +<hkern u1="Ð" u2="W" k="20" /> +<hkern u1="Ð" u2="V" k="20" /> +<hkern u1="Ð" u2="T" k="61" /> +<hkern u1="Ð" u2="A" k="41" /> +<hkern u1="Ð" u2="." k="82" /> +<hkern u1="Ð" u2="," k="82" /> +<hkern u1="Ò" u2="„" k="82" /> +<hkern u1="Ò" u2="‚" k="82" /> +<hkern u1="Ò" u2="Ÿ" k="20" /> +<hkern u1="Ò" u2="Ý" k="20" /> +<hkern u1="Ò" u2="Å" k="41" /> +<hkern u1="Ò" u2="Ä" k="41" /> +<hkern u1="Ò" u2="Ã" k="41" /> +<hkern u1="Ò" u2="Â" k="41" /> +<hkern u1="Ò" u2="Á" k="41" /> +<hkern u1="Ò" u2="À" k="41" /> +<hkern u1="Ò" u2="Z" k="20" /> +<hkern u1="Ò" u2="Y" k="20" /> +<hkern u1="Ò" u2="X" k="41" /> +<hkern u1="Ò" u2="W" k="20" /> +<hkern u1="Ò" u2="V" k="20" /> +<hkern u1="Ò" u2="T" k="61" /> +<hkern u1="Ò" u2="A" k="41" /> +<hkern u1="Ò" u2="." k="82" /> +<hkern u1="Ò" u2="," k="82" /> +<hkern u1="Ó" u2="„" k="82" /> +<hkern u1="Ó" u2="‚" k="82" /> +<hkern u1="Ó" u2="Ÿ" k="20" /> +<hkern u1="Ó" u2="Ý" k="20" /> +<hkern u1="Ó" u2="Å" k="41" /> +<hkern u1="Ó" u2="Ä" k="41" /> +<hkern u1="Ó" u2="Ã" k="41" /> +<hkern u1="Ó" u2="Â" k="41" /> +<hkern u1="Ó" u2="Á" k="41" /> +<hkern u1="Ó" u2="À" k="41" /> +<hkern u1="Ó" u2="Z" k="20" /> +<hkern u1="Ó" u2="Y" k="20" /> +<hkern u1="Ó" u2="X" k="41" /> +<hkern u1="Ó" u2="W" k="20" /> +<hkern u1="Ó" u2="V" k="20" /> +<hkern u1="Ó" u2="T" k="61" /> +<hkern u1="Ó" u2="A" k="41" /> +<hkern u1="Ó" u2="." k="82" /> +<hkern u1="Ó" u2="," k="82" /> +<hkern u1="Ô" u2="„" k="82" /> +<hkern u1="Ô" u2="‚" k="82" /> +<hkern u1="Ô" u2="Ÿ" k="20" /> +<hkern u1="Ô" u2="Ý" k="20" /> +<hkern u1="Ô" u2="Å" k="41" /> +<hkern u1="Ô" u2="Ä" k="41" /> +<hkern u1="Ô" u2="Ã" k="41" /> +<hkern u1="Ô" u2="Â" k="41" /> +<hkern u1="Ô" u2="Á" k="41" /> +<hkern u1="Ô" u2="À" k="41" /> +<hkern u1="Ô" u2="Z" k="20" /> +<hkern u1="Ô" u2="Y" k="20" /> +<hkern u1="Ô" u2="X" k="41" /> +<hkern u1="Ô" u2="W" k="20" /> +<hkern u1="Ô" u2="V" k="20" /> +<hkern u1="Ô" u2="T" k="61" /> +<hkern u1="Ô" u2="A" k="41" /> +<hkern u1="Ô" u2="." k="82" /> +<hkern u1="Ô" u2="," k="82" /> +<hkern u1="Õ" u2="„" k="82" /> +<hkern u1="Õ" u2="‚" k="82" /> +<hkern u1="Õ" u2="Ÿ" k="20" /> +<hkern u1="Õ" u2="Ý" k="20" /> +<hkern u1="Õ" u2="Å" k="41" /> +<hkern u1="Õ" u2="Ä" k="41" /> +<hkern u1="Õ" u2="Ã" k="41" /> +<hkern u1="Õ" u2="Â" k="41" /> +<hkern u1="Õ" u2="Á" k="41" /> +<hkern u1="Õ" u2="À" k="41" /> +<hkern u1="Õ" u2="Z" k="20" /> +<hkern u1="Õ" u2="Y" k="20" /> +<hkern u1="Õ" u2="X" k="41" /> +<hkern u1="Õ" u2="W" k="20" /> +<hkern u1="Õ" u2="V" k="20" /> +<hkern u1="Õ" u2="T" k="61" /> +<hkern u1="Õ" u2="A" k="41" /> +<hkern u1="Õ" u2="." k="82" /> +<hkern u1="Õ" u2="," k="82" /> +<hkern u1="Ö" u2="„" k="82" /> +<hkern u1="Ö" u2="‚" k="82" /> +<hkern u1="Ö" u2="Ÿ" k="20" /> +<hkern u1="Ö" u2="Ý" k="20" /> +<hkern u1="Ö" u2="Å" k="41" /> +<hkern u1="Ö" u2="Ä" k="41" /> +<hkern u1="Ö" u2="Ã" k="41" /> +<hkern u1="Ö" u2="Â" k="41" /> +<hkern u1="Ö" u2="Á" k="41" /> +<hkern u1="Ö" u2="À" k="41" /> +<hkern u1="Ö" u2="Z" k="20" /> +<hkern u1="Ö" u2="Y" k="20" /> +<hkern u1="Ö" u2="X" k="41" /> +<hkern u1="Ö" u2="W" k="20" /> +<hkern u1="Ö" u2="V" k="20" /> +<hkern u1="Ö" u2="T" k="61" /> +<hkern u1="Ö" u2="A" k="41" /> +<hkern u1="Ö" u2="." k="82" /> +<hkern u1="Ö" u2="," k="82" /> +<hkern u1="Ø" u2="„" k="82" /> +<hkern u1="Ø" u2="‚" k="82" /> +<hkern u1="Ø" u2="Ÿ" k="20" /> +<hkern u1="Ø" u2="Ý" k="20" /> +<hkern u1="Ø" u2="Å" k="41" /> +<hkern u1="Ø" u2="Ä" k="41" /> +<hkern u1="Ø" u2="Ã" k="41" /> +<hkern u1="Ø" u2="Â" k="41" /> +<hkern u1="Ø" u2="Á" k="41" /> +<hkern u1="Ø" u2="À" k="41" /> +<hkern u1="Ø" u2="Z" k="20" /> +<hkern u1="Ø" u2="Y" k="20" /> +<hkern u1="Ø" u2="X" k="41" /> +<hkern u1="Ø" u2="W" k="20" /> +<hkern u1="Ø" u2="V" k="20" /> +<hkern u1="Ø" u2="T" k="61" /> +<hkern u1="Ø" u2="A" k="41" /> +<hkern u1="Ø" u2="." k="82" /> +<hkern u1="Ø" u2="," k="82" /> +<hkern u1="Ù" u2="„" k="41" /> +<hkern u1="Ù" u2="‚" k="41" /> +<hkern u1="Ù" u2="Å" k="20" /> +<hkern u1="Ù" u2="Ä" k="20" /> +<hkern u1="Ù" u2="Ã" k="20" /> +<hkern u1="Ù" u2="Â" k="20" /> +<hkern u1="Ù" u2="Á" k="20" /> +<hkern u1="Ù" u2="À" k="20" /> +<hkern u1="Ù" u2="A" k="20" /> +<hkern u1="Ù" u2="." k="41" /> +<hkern u1="Ù" u2="," k="41" /> +<hkern u1="Ú" u2="„" k="41" /> +<hkern u1="Ú" u2="‚" k="41" /> +<hkern u1="Ú" u2="Å" k="20" /> +<hkern u1="Ú" u2="Ä" k="20" /> +<hkern u1="Ú" u2="Ã" k="20" /> +<hkern u1="Ú" u2="Â" k="20" /> +<hkern u1="Ú" u2="Á" k="20" /> +<hkern u1="Ú" u2="À" k="20" /> +<hkern u1="Ú" u2="A" k="20" /> +<hkern u1="Ú" u2="." k="41" /> +<hkern u1="Ú" u2="," k="41" /> +<hkern u1="Û" u2="„" k="41" /> +<hkern u1="Û" u2="‚" k="41" /> +<hkern u1="Û" u2="Å" k="20" /> +<hkern u1="Û" u2="Ä" k="20" /> +<hkern u1="Û" u2="Ã" k="20" /> +<hkern u1="Û" u2="Â" k="20" /> +<hkern u1="Û" u2="Á" k="20" /> +<hkern u1="Û" u2="À" k="20" /> +<hkern u1="Û" u2="A" k="20" /> +<hkern u1="Û" u2="." k="41" /> +<hkern u1="Û" u2="," k="41" /> +<hkern u1="Ü" u2="„" k="41" /> +<hkern u1="Ü" u2="‚" k="41" /> +<hkern u1="Ü" u2="Å" k="20" /> +<hkern u1="Ü" u2="Ä" k="20" /> +<hkern u1="Ü" u2="Ã" k="20" /> +<hkern u1="Ü" u2="Â" k="20" /> +<hkern u1="Ü" u2="Á" k="20" /> +<hkern u1="Ü" u2="À" k="20" /> +<hkern u1="Ü" u2="A" k="20" /> +<hkern u1="Ü" u2="." k="41" /> +<hkern u1="Ü" u2="," k="41" /> +<hkern u1="Ý" u2="„" k="123" /> +<hkern u1="Ý" u2="‚" k="123" /> +<hkern u1="Ý" u2="œ" k="102" /> +<hkern u1="Ý" u2="Œ" k="41" /> +<hkern u1="Ý" u2="ü" k="61" /> +<hkern u1="Ý" u2="û" k="61" /> +<hkern u1="Ý" u2="ú" k="61" /> +<hkern u1="Ý" u2="ù" k="61" /> +<hkern u1="Ý" u2="ø" k="102" /> +<hkern u1="Ý" u2="ö" k="102" /> +<hkern u1="Ý" u2="õ" k="102" /> +<hkern u1="Ý" u2="ô" k="102" /> +<hkern u1="Ý" u2="ó" k="102" /> +<hkern u1="Ý" u2="ò" k="102" /> +<hkern u1="Ý" u2="ë" k="102" /> +<hkern u1="Ý" u2="ê" k="102" /> +<hkern u1="Ý" u2="é" k="102" /> +<hkern u1="Ý" u2="è" k="102" /> +<hkern u1="Ý" u2="ç" k="102" /> +<hkern u1="Ý" u2="æ" k="102" /> +<hkern u1="Ý" u2="å" k="102" /> +<hkern u1="Ý" u2="ä" k="102" /> +<hkern u1="Ý" u2="ã" k="102" /> +<hkern u1="Ý" u2="â" k="102" /> +<hkern u1="Ý" u2="á" k="102" /> +<hkern u1="Ý" u2="à" k="102" /> +<hkern u1="Ý" u2="Ø" k="41" /> +<hkern u1="Ý" u2="Ö" k="41" /> +<hkern u1="Ý" u2="Õ" k="41" /> +<hkern u1="Ý" u2="Ô" k="41" /> +<hkern u1="Ý" u2="Ó" k="41" /> +<hkern u1="Ý" u2="Ò" k="41" /> +<hkern u1="Ý" u2="Ç" k="41" /> +<hkern u1="Ý" u2="Å" k="123" /> +<hkern u1="Ý" u2="Ä" k="123" /> +<hkern u1="Ý" u2="Ã" k="123" /> +<hkern u1="Ý" u2="Â" k="123" /> +<hkern u1="Ý" u2="Á" k="123" /> +<hkern u1="Ý" u2="À" k="123" /> +<hkern u1="Ý" u2="z" k="41" /> +<hkern u1="Ý" u2="u" k="61" /> +<hkern u1="Ý" u2="s" k="82" /> +<hkern u1="Ý" u2="r" k="61" /> +<hkern u1="Ý" u2="q" k="102" /> +<hkern u1="Ý" u2="p" k="61" /> +<hkern u1="Ý" u2="o" k="102" /> +<hkern u1="Ý" u2="n" k="61" /> +<hkern u1="Ý" u2="m" k="61" /> +<hkern u1="Ý" u2="g" k="41" /> +<hkern u1="Ý" u2="e" k="102" /> +<hkern u1="Ý" u2="d" k="102" /> +<hkern u1="Ý" u2="c" k="102" /> +<hkern u1="Ý" u2="a" k="102" /> +<hkern u1="Ý" u2="Q" k="41" /> +<hkern u1="Ý" u2="O" k="41" /> +<hkern u1="Ý" u2="G" k="41" /> +<hkern u1="Ý" u2="C" k="41" /> +<hkern u1="Ý" u2="A" k="123" /> +<hkern u1="Ý" u2="?" k="-41" /> +<hkern u1="Ý" u2="." k="123" /> +<hkern u1="Ý" u2="," k="123" /> +<hkern u1="Þ" u2="„" k="266" /> +<hkern u1="Þ" u2="‚" k="266" /> +<hkern u1="Þ" u2="Å" k="102" /> +<hkern u1="Þ" u2="Ä" k="102" /> +<hkern u1="Þ" u2="Ã" k="102" /> +<hkern u1="Þ" u2="Â" k="102" /> +<hkern u1="Þ" u2="Á" k="102" /> +<hkern u1="Þ" u2="À" k="102" /> +<hkern u1="Þ" u2="Z" k="20" /> +<hkern u1="Þ" u2="X" k="41" /> +<hkern u1="Þ" u2="A" k="102" /> +<hkern u1="Þ" u2="." k="266" /> +<hkern u1="Þ" u2="," k="266" /> +<hkern u1="à" u2="”" k="20" /> +<hkern u1="à" u2="’" k="20" /> +<hkern u1="à" u2="'" k="20" /> +<hkern u1="à" u2=""" k="20" /> +<hkern u1="á" u2="”" k="20" /> +<hkern u1="á" u2="’" k="20" /> +<hkern u1="á" u2="'" k="20" /> +<hkern u1="á" u2=""" k="20" /> +<hkern u1="â" u2="”" k="20" /> +<hkern u1="â" u2="’" k="20" /> +<hkern u1="â" u2="'" k="20" /> +<hkern u1="â" u2=""" k="20" /> +<hkern u1="ã" u2="”" k="20" /> +<hkern u1="ã" u2="’" k="20" /> +<hkern u1="ã" u2="'" k="20" /> +<hkern u1="ã" u2=""" k="20" /> +<hkern u1="ä" u2="”" k="20" /> +<hkern u1="ä" u2="’" k="20" /> +<hkern u1="ä" u2="'" k="20" /> +<hkern u1="ä" u2=""" k="20" /> +<hkern u1="å" u2="”" k="20" /> +<hkern u1="å" u2="’" k="20" /> +<hkern u1="å" u2="'" k="20" /> +<hkern u1="å" u2=""" k="20" /> +<hkern u1="è" u2="”" k="20" /> +<hkern u1="è" u2="’" k="20" /> +<hkern u1="è" u2="ý" k="41" /> +<hkern u1="è" u2="z" k="20" /> +<hkern u1="è" u2="y" k="41" /> +<hkern u1="è" u2="x" k="41" /> +<hkern u1="è" u2="w" k="41" /> +<hkern u1="è" u2="v" k="41" /> +<hkern u1="è" u2="'" k="20" /> +<hkern u1="è" u2=""" k="20" /> +<hkern u1="é" u2="”" k="20" /> +<hkern u1="é" u2="’" k="20" /> +<hkern u1="é" u2="ý" k="41" /> +<hkern u1="é" u2="z" k="20" /> +<hkern u1="é" u2="y" k="41" /> +<hkern u1="é" u2="x" k="41" /> +<hkern u1="é" u2="w" k="41" /> +<hkern u1="é" u2="v" k="41" /> +<hkern u1="é" u2="'" k="20" /> +<hkern u1="é" u2=""" k="20" /> +<hkern u1="ê" u2="”" k="20" /> +<hkern u1="ê" u2="’" k="20" /> +<hkern u1="ê" u2="ý" k="41" /> +<hkern u1="ê" u2="z" k="20" /> +<hkern u1="ê" u2="y" k="41" /> +<hkern u1="ê" u2="x" k="41" /> +<hkern u1="ê" u2="w" k="41" /> +<hkern u1="ê" u2="v" k="41" /> +<hkern u1="ê" u2="'" k="20" /> +<hkern u1="ê" u2=""" k="20" /> +<hkern u1="ë" u2="”" k="20" /> +<hkern u1="ë" u2="’" k="20" /> +<hkern u1="ë" u2="ý" k="41" /> +<hkern u1="ë" u2="z" k="20" /> +<hkern u1="ë" u2="y" k="41" /> +<hkern u1="ë" u2="x" k="41" /> +<hkern u1="ë" u2="w" k="41" /> +<hkern u1="ë" u2="v" k="41" /> +<hkern u1="ë" u2="'" k="20" /> +<hkern u1="ë" u2=""" k="20" /> +<hkern u1="ð" u2="”" k="20" /> +<hkern u1="ð" u2="’" k="20" /> +<hkern u1="ð" u2="ý" k="41" /> +<hkern u1="ð" u2="z" k="20" /> +<hkern u1="ð" u2="y" k="41" /> +<hkern u1="ð" u2="x" k="41" /> +<hkern u1="ð" u2="w" k="41" /> +<hkern u1="ð" u2="v" k="41" /> +<hkern u1="ð" u2="'" k="20" /> +<hkern u1="ð" u2=""" k="20" /> +<hkern u1="ò" u2="”" k="20" /> +<hkern u1="ò" u2="’" k="20" /> +<hkern u1="ò" u2="ý" k="41" /> +<hkern u1="ò" u2="z" k="20" /> +<hkern u1="ò" u2="y" k="41" /> +<hkern u1="ò" u2="x" k="41" /> +<hkern u1="ò" u2="w" k="41" /> +<hkern u1="ò" u2="v" k="41" /> +<hkern u1="ò" u2="'" k="20" /> +<hkern u1="ò" u2=""" k="20" /> +<hkern u1="ó" u2="”" k="20" /> +<hkern u1="ó" u2="’" k="20" /> +<hkern u1="ó" u2="ý" k="41" /> +<hkern u1="ó" u2="z" k="20" /> +<hkern u1="ó" u2="y" k="41" /> +<hkern u1="ó" u2="x" k="41" /> +<hkern u1="ó" u2="w" k="41" /> +<hkern u1="ó" u2="v" k="41" /> +<hkern u1="ó" u2="'" k="20" /> +<hkern u1="ó" u2=""" k="20" /> +<hkern u1="ô" u2="”" k="20" /> +<hkern u1="ô" u2="’" k="20" /> +<hkern u1="ô" u2="ý" k="41" /> +<hkern u1="ô" u2="z" k="20" /> +<hkern u1="ô" u2="y" k="41" /> +<hkern u1="ô" u2="x" k="41" /> +<hkern u1="ô" u2="w" k="41" /> +<hkern u1="ô" u2="v" k="41" /> +<hkern u1="ô" u2="'" k="20" /> +<hkern u1="ô" u2=""" k="20" /> +<hkern u1="ö" u2="”" k="41" /> +<hkern u1="ö" u2="’" k="41" /> +<hkern u1="ö" u2="'" k="41" /> +<hkern u1="ö" u2=""" k="41" /> +<hkern u1="ø" u2="”" k="20" /> +<hkern u1="ø" u2="’" k="20" /> +<hkern u1="ø" u2="ý" k="41" /> +<hkern u1="ø" u2="z" k="20" /> +<hkern u1="ø" u2="y" k="41" /> +<hkern u1="ø" u2="x" k="41" /> +<hkern u1="ø" u2="w" k="41" /> +<hkern u1="ø" u2="v" k="41" /> +<hkern u1="ø" u2="'" k="20" /> +<hkern u1="ø" u2=""" k="20" /> +<hkern u1="ý" u2="„" k="82" /> +<hkern u1="ý" u2="”" k="-82" /> +<hkern u1="ý" u2="‚" k="82" /> +<hkern u1="ý" u2="’" k="-82" /> +<hkern u1="ý" u2="?" k="-41" /> +<hkern u1="ý" u2="." k="82" /> +<hkern u1="ý" u2="," k="82" /> +<hkern u1="ý" u2="'" k="-82" /> +<hkern u1="ý" u2=""" k="-82" /> +<hkern u1="þ" u2="”" k="20" /> +<hkern u1="þ" u2="’" k="20" /> +<hkern u1="þ" u2="ý" k="41" /> +<hkern u1="þ" u2="z" k="20" /> +<hkern u1="þ" u2="y" k="41" /> +<hkern u1="þ" u2="x" k="41" /> +<hkern u1="þ" u2="w" k="41" /> +<hkern u1="þ" u2="v" k="41" /> +<hkern u1="þ" u2="'" k="20" /> +<hkern u1="þ" u2=""" k="20" /> +<hkern u1="ÿ" u2="„" k="82" /> +<hkern u1="ÿ" u2="”" k="-82" /> +<hkern u1="ÿ" u2="‚" k="82" /> +<hkern u1="ÿ" u2="’" k="-82" /> +<hkern u1="ÿ" u2="?" k="-41" /> +<hkern u1="ÿ" u2="." k="82" /> +<hkern u1="ÿ" u2="," k="82" /> +<hkern u1="ÿ" u2="'" k="-82" /> +<hkern u1="ÿ" u2=""" k="-82" /> +<hkern u1="Œ" u2="J" k="-123" /> +<hkern u1="Ÿ" u2="„" k="123" /> +<hkern u1="Ÿ" u2="‚" k="123" /> +<hkern u1="Ÿ" u2="œ" k="102" /> +<hkern u1="Ÿ" u2="Œ" k="41" /> +<hkern u1="Ÿ" u2="ü" k="61" /> +<hkern u1="Ÿ" u2="û" k="61" /> +<hkern u1="Ÿ" u2="ú" k="61" /> +<hkern u1="Ÿ" u2="ù" k="61" /> +<hkern u1="Ÿ" u2="ø" k="102" /> +<hkern u1="Ÿ" u2="ö" k="102" /> +<hkern u1="Ÿ" u2="õ" k="102" /> +<hkern u1="Ÿ" u2="ô" k="102" /> +<hkern u1="Ÿ" u2="ó" k="102" /> +<hkern u1="Ÿ" u2="ò" k="102" /> +<hkern u1="Ÿ" u2="ë" k="102" /> +<hkern u1="Ÿ" u2="ê" k="102" /> +<hkern u1="Ÿ" u2="é" k="102" /> +<hkern u1="Ÿ" u2="è" k="102" /> +<hkern u1="Ÿ" u2="ç" k="102" /> +<hkern u1="Ÿ" u2="æ" k="102" /> +<hkern u1="Ÿ" u2="å" k="102" /> +<hkern u1="Ÿ" u2="ä" k="102" /> +<hkern u1="Ÿ" u2="ã" k="102" /> +<hkern u1="Ÿ" u2="â" k="102" /> +<hkern u1="Ÿ" u2="á" k="102" /> +<hkern u1="Ÿ" u2="à" k="102" /> +<hkern u1="Ÿ" u2="Ø" k="41" /> +<hkern u1="Ÿ" u2="Ö" k="41" /> +<hkern u1="Ÿ" u2="Õ" k="41" /> +<hkern u1="Ÿ" u2="Ô" k="41" /> +<hkern u1="Ÿ" u2="Ó" k="41" /> +<hkern u1="Ÿ" u2="Ò" k="41" /> +<hkern u1="Ÿ" u2="Ç" k="41" /> +<hkern u1="Ÿ" u2="Å" k="123" /> +<hkern u1="Ÿ" u2="Ä" k="123" /> +<hkern u1="Ÿ" u2="Ã" k="123" /> +<hkern u1="Ÿ" u2="Â" k="123" /> +<hkern u1="Ÿ" u2="Á" k="123" /> +<hkern u1="Ÿ" u2="À" k="123" /> +<hkern u1="Ÿ" u2="z" k="41" /> +<hkern u1="Ÿ" u2="u" k="61" /> +<hkern u1="Ÿ" u2="s" k="82" /> +<hkern u1="Ÿ" u2="r" k="61" /> +<hkern u1="Ÿ" u2="q" k="102" /> +<hkern u1="Ÿ" u2="p" k="61" /> +<hkern u1="Ÿ" u2="o" k="102" /> +<hkern u1="Ÿ" u2="n" k="61" /> +<hkern u1="Ÿ" u2="m" k="61" /> +<hkern u1="Ÿ" u2="g" k="41" /> +<hkern u1="Ÿ" u2="e" k="102" /> +<hkern u1="Ÿ" u2="d" k="102" /> +<hkern u1="Ÿ" u2="c" k="102" /> +<hkern u1="Ÿ" u2="a" k="102" /> +<hkern u1="Ÿ" u2="Q" k="41" /> +<hkern u1="Ÿ" u2="O" k="41" /> +<hkern u1="Ÿ" u2="G" k="41" /> +<hkern u1="Ÿ" u2="C" k="41" /> +<hkern u1="Ÿ" u2="A" k="123" /> +<hkern u1="Ÿ" u2="?" k="-41" /> +<hkern u1="Ÿ" u2="." k="123" /> +<hkern u1="Ÿ" u2="," k="123" /> +<hkern u1="–" u2="T" k="82" /> +<hkern u1="—" u2="T" k="82" /> +<hkern u1="‘" u2="Ÿ" k="-20" /> +<hkern u1="‘" u2="œ" k="123" /> +<hkern u1="‘" u2="ü" k="61" /> +<hkern u1="‘" u2="û" k="61" /> +<hkern u1="‘" u2="ú" k="61" /> +<hkern u1="‘" u2="ù" k="61" /> +<hkern u1="‘" u2="ø" k="123" /> +<hkern u1="‘" u2="ö" k="123" /> +<hkern u1="‘" u2="õ" k="123" /> +<hkern u1="‘" u2="ô" k="123" /> +<hkern u1="‘" u2="ó" k="123" /> +<hkern u1="‘" u2="ò" k="123" /> +<hkern u1="‘" u2="ë" k="123" /> +<hkern u1="‘" u2="ê" k="123" /> +<hkern u1="‘" u2="é" k="123" /> +<hkern u1="‘" u2="è" k="123" /> +<hkern u1="‘" u2="ç" k="123" /> +<hkern u1="‘" u2="æ" k="82" /> +<hkern u1="‘" u2="å" k="82" /> +<hkern u1="‘" u2="ä" k="82" /> +<hkern u1="‘" u2="ã" k="82" /> +<hkern u1="‘" u2="â" k="82" /> +<hkern u1="‘" u2="á" k="82" /> +<hkern u1="‘" u2="à" k="123" /> +<hkern u1="‘" u2="Ý" k="-20" /> +<hkern u1="‘" u2="Å" k="143" /> +<hkern u1="‘" u2="Ä" k="143" /> +<hkern u1="‘" u2="Ã" k="143" /> +<hkern u1="‘" u2="Â" k="143" /> +<hkern u1="‘" u2="Á" k="143" /> +<hkern u1="‘" u2="À" k="143" /> +<hkern u1="‘" u2="u" k="61" /> +<hkern u1="‘" u2="s" k="61" /> +<hkern u1="‘" u2="r" k="61" /> +<hkern u1="‘" u2="q" k="123" /> +<hkern u1="‘" u2="p" k="61" /> +<hkern u1="‘" u2="o" k="123" /> +<hkern u1="‘" u2="n" k="61" /> +<hkern u1="‘" u2="m" k="61" /> +<hkern u1="‘" u2="g" k="61" /> +<hkern u1="‘" u2="e" k="123" /> +<hkern u1="‘" u2="d" k="123" /> +<hkern u1="‘" u2="c" k="123" /> +<hkern u1="‘" u2="a" k="82" /> +<hkern u1="‘" u2="Y" k="-20" /> +<hkern u1="‘" u2="W" k="-41" /> +<hkern u1="‘" u2="V" k="-41" /> +<hkern u1="‘" u2="T" k="-41" /> +<hkern u1="‘" u2="A" k="143" /> +<hkern u1="’" u2="Ÿ" k="-20" /> +<hkern u1="’" u2="œ" k="123" /> +<hkern u1="’" u2="ü" k="61" /> +<hkern u1="’" u2="û" k="61" /> +<hkern u1="’" u2="ú" k="61" /> +<hkern u1="’" u2="ù" k="61" /> +<hkern u1="’" u2="ø" k="123" /> +<hkern u1="’" u2="ö" k="123" /> +<hkern u1="’" u2="õ" k="123" /> +<hkern u1="’" u2="ô" k="123" /> +<hkern u1="’" u2="ó" k="123" /> +<hkern u1="’" u2="ò" k="123" /> +<hkern u1="’" u2="ë" k="123" /> +<hkern u1="’" u2="ê" k="123" /> +<hkern u1="’" u2="é" k="123" /> +<hkern u1="’" u2="è" k="123" /> +<hkern u1="’" u2="ç" k="123" /> +<hkern u1="’" u2="æ" k="82" /> +<hkern u1="’" u2="å" k="82" /> +<hkern u1="’" u2="ä" k="82" /> +<hkern u1="’" u2="ã" k="82" /> +<hkern u1="’" u2="â" k="82" /> +<hkern u1="’" u2="á" k="82" /> +<hkern u1="’" u2="à" k="123" /> +<hkern u1="’" u2="Ý" k="-20" /> +<hkern u1="’" u2="Å" k="143" /> +<hkern u1="’" u2="Ä" k="143" /> +<hkern u1="’" u2="Ã" k="143" /> +<hkern u1="’" u2="Â" k="143" /> +<hkern u1="’" u2="Á" k="143" /> +<hkern u1="’" u2="À" k="143" /> +<hkern u1="’" u2="u" k="61" /> +<hkern u1="’" u2="s" k="61" /> +<hkern u1="’" u2="r" k="61" /> +<hkern u1="’" u2="q" k="123" /> +<hkern u1="’" u2="p" k="61" /> +<hkern u1="’" u2="o" k="123" /> +<hkern u1="’" u2="n" k="61" /> +<hkern u1="’" u2="m" k="61" /> +<hkern u1="’" u2="g" k="61" /> +<hkern u1="’" u2="e" k="123" /> +<hkern u1="’" u2="d" k="123" /> +<hkern u1="’" u2="c" k="123" /> +<hkern u1="’" u2="a" k="82" /> +<hkern u1="’" u2="Y" k="-20" /> +<hkern u1="’" u2="W" k="-41" /> +<hkern u1="’" u2="V" k="-41" /> +<hkern u1="’" u2="T" k="-41" /> +<hkern u1="’" u2="A" k="143" /> +<hkern u1="‚" u2="Ÿ" k="123" /> +<hkern u1="‚" u2="Œ" k="102" /> +<hkern u1="‚" u2="Ý" k="123" /> +<hkern u1="‚" u2="Ü" k="41" /> +<hkern u1="‚" u2="Û" k="41" /> +<hkern u1="‚" u2="Ú" k="41" /> +<hkern u1="‚" u2="Ù" k="41" /> +<hkern u1="‚" u2="Ø" k="102" /> +<hkern u1="‚" u2="Ö" k="102" /> +<hkern u1="‚" u2="Õ" k="102" /> +<hkern u1="‚" u2="Ô" k="102" /> +<hkern u1="‚" u2="Ó" k="102" /> +<hkern u1="‚" u2="Ò" k="102" /> +<hkern u1="‚" u2="Ç" k="102" /> +<hkern u1="‚" u2="Y" k="123" /> +<hkern u1="‚" u2="W" k="123" /> +<hkern u1="‚" u2="V" k="123" /> +<hkern u1="‚" u2="U" k="41" /> +<hkern u1="‚" u2="T" k="143" /> +<hkern u1="‚" u2="Q" k="102" /> +<hkern u1="‚" u2="O" k="102" /> +<hkern u1="‚" u2="G" k="102" /> +<hkern u1="‚" u2="C" k="102" /> +<hkern u1="“" u2="Ÿ" k="-20" /> +<hkern u1="“" u2="œ" k="123" /> +<hkern u1="“" u2="ü" k="61" /> +<hkern u1="“" u2="û" k="61" /> +<hkern u1="“" u2="ú" k="61" /> +<hkern u1="“" u2="ù" k="61" /> +<hkern u1="“" u2="ø" k="123" /> +<hkern u1="“" u2="ö" k="123" /> +<hkern u1="“" u2="õ" k="123" /> +<hkern u1="“" u2="ô" k="123" /> +<hkern u1="“" u2="ó" k="123" /> +<hkern u1="“" u2="ò" k="123" /> +<hkern u1="“" u2="ë" k="123" /> +<hkern u1="“" u2="ê" k="123" /> +<hkern u1="“" u2="é" k="123" /> +<hkern u1="“" u2="è" k="123" /> +<hkern u1="“" u2="ç" k="123" /> +<hkern u1="“" u2="æ" k="82" /> +<hkern u1="“" u2="å" k="82" /> +<hkern u1="“" u2="ä" k="82" /> +<hkern u1="“" u2="ã" k="82" /> +<hkern u1="“" u2="â" k="82" /> +<hkern u1="“" u2="á" k="82" /> +<hkern u1="“" u2="à" k="123" /> +<hkern u1="“" u2="Ý" k="-20" /> +<hkern u1="“" u2="Å" k="143" /> +<hkern u1="“" u2="Ä" k="143" /> +<hkern u1="“" u2="Ã" k="143" /> +<hkern u1="“" u2="Â" k="143" /> +<hkern u1="“" u2="Á" k="143" /> +<hkern u1="“" u2="À" k="143" /> +<hkern u1="“" u2="u" k="61" /> +<hkern u1="“" u2="s" k="61" /> +<hkern u1="“" u2="r" k="61" /> +<hkern u1="“" u2="q" k="123" /> +<hkern u1="“" u2="p" k="61" /> +<hkern u1="“" u2="o" k="123" /> +<hkern u1="“" u2="n" k="61" /> +<hkern u1="“" u2="m" k="61" /> +<hkern u1="“" u2="g" k="61" /> +<hkern u1="“" u2="e" k="123" /> +<hkern u1="“" u2="d" k="123" /> +<hkern u1="“" u2="c" k="123" /> +<hkern u1="“" u2="a" k="82" /> +<hkern u1="“" u2="Y" k="-20" /> +<hkern u1="“" u2="W" k="-41" /> +<hkern u1="“" u2="V" k="-41" /> +<hkern u1="“" u2="T" k="-41" /> +<hkern u1="“" u2="A" k="143" /> +<hkern u1="„" u2="Ÿ" k="123" /> +<hkern u1="„" u2="Œ" k="102" /> +<hkern u1="„" u2="Ý" k="123" /> +<hkern u1="„" u2="Ü" k="41" /> +<hkern u1="„" u2="Û" k="41" /> +<hkern u1="„" u2="Ú" k="41" /> +<hkern u1="„" u2="Ù" k="41" /> +<hkern u1="„" u2="Ø" k="102" /> +<hkern u1="„" u2="Ö" k="102" /> +<hkern u1="„" u2="Õ" k="102" /> +<hkern u1="„" u2="Ô" k="102" /> +<hkern u1="„" u2="Ó" k="102" /> +<hkern u1="„" u2="Ò" k="102" /> +<hkern u1="„" u2="Ç" k="102" /> +<hkern u1="„" u2="Y" k="123" /> +<hkern u1="„" u2="W" k="123" /> +<hkern u1="„" u2="V" k="123" /> +<hkern u1="„" u2="U" k="41" /> +<hkern u1="„" u2="T" k="143" /> +<hkern u1="„" u2="Q" k="102" /> +<hkern u1="„" u2="O" k="102" /> +<hkern u1="„" u2="G" k="102" /> +<hkern u1="„" u2="C" k="102" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.ttf b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.ttf new file mode 100755 index 0000000..b329084 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.ttf Binary files differdiff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.woff b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.woff new file mode 100755 index 0000000..28d6ade --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-Semibold-webfont.woff Binary files differdiff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.eot b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.eot new file mode 100755 index 0000000..0ab1db2 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.eot Binary files differdiff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.svg b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.svg new file mode 100755 index 0000000..7166ec1 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.svg @@ -0,0 +1,1830 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="open_sanssemibold_italic" horiz-adv-x="1128" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode="fi" horiz-adv-x="1257" d="M0 0zM-76 -492q-90 0 -149 23v190q64 -20 114 -20q134 0 177 205l217 1022h-179l21 106l194 76l21 92q44 198 134.5 281.5t256.5 83.5q115 0 211 -43l-61 -176q-74 28 -136 28q-69 0 -110.5 -43t-63.5 -141l-18 -86h229l-37 -178h-229l-223 -1053q-40 -189 -131 -278 t-238 -89zM1022 1378q0 68 39 110t110 42q53 0 86 -26.5t33 -80.5q0 -71 -40 -112t-105 -41q-53 0 -88 26t-35 82zM975 0h-236l236 1106h235z" /> +<glyph unicode="fl" horiz-adv-x="1257" d="M0 0zM-76 -492q-90 0 -149 23v190q64 -20 114 -20q134 0 177 205l217 1022h-179l21 106l194 76l21 92q44 198 134.5 281.5t256.5 83.5q115 0 211 -43l-61 -176q-74 28 -136 28q-69 0 -110.5 -43t-63.5 -141l-18 -86h229l-37 -178h-229l-223 -1053q-40 -189 -131 -278 t-238 -89zM973 0h-234l330 1556h235z" /> +<glyph unicode="ffi" horiz-adv-x="1931" d="M-76 -492q-90 0 -149 23v190q64 -20 114 -20q133 0 177 205l217 1022h-179l21 106l194 76l21 92q44 198 134.5 281.5t256.5 83.5q115 0 211 -43l-61 -176q-74 28 -136 28q-69 0 -110.5 -43t-63.5 -141l-18 -86h438l23 96q44 197 133 281t256 84q117 0 213 -43l-62 -176 q-74 28 -135 28q-71 0 -111.5 -43t-62.5 -141l-18 -86h229l-39 -178h-227l-223 -1053q-43 -192 -133.5 -279.5t-235.5 -87.5q-95 0 -149 23v190q60 -20 114 -20q136 0 176 205l215 1022h-438l-223 -1053q-40 -189 -131 -278t-238 -89zM1649 0h-234l236 1106h233zM1698 1378 q0 68 39 110t108 42q54 0 86.5 -26.5t32.5 -80.5q0 -71 -39.5 -112t-105.5 -41q-51 0 -86 26t-35 82z" /> +<glyph unicode="ffl" horiz-adv-x="1931" d="M-76 -492q-90 0 -149 23v190q64 -20 114 -20q133 0 177 205l217 1022h-179l21 106l194 76l21 92q44 198 134.5 281.5t256.5 83.5q115 0 211 -43l-61 -176q-74 28 -136 28q-69 0 -110.5 -43t-63.5 -141l-18 -86h438l23 96q44 197 133 281t256 84q117 0 213 -43l-62 -176 q-74 28 -135 28q-71 0 -111.5 -43t-62.5 -141l-18 -86h229l-39 -178h-227l-223 -1053q-43 -192 -133.5 -279.5t-235.5 -87.5q-95 0 -149 23v190q60 -20 114 -20q136 0 176 205l215 1022h-438l-223 -1053q-40 -189 -131 -278t-238 -89zM1649 0h-236l332 1556h233z" /> +<glyph horiz-adv-x="2048" /> +<glyph horiz-adv-x="2048" /> +<glyph unicode="
" horiz-adv-x="1044" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="	" horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="557" d="M336 444h-176l168 1018h272zM33 96q0 80 45.5 130t130.5 50q57 0 91 -32.5t34 -93.5q0 -79 -47 -128t-123 -49q-62 0 -96.5 33.5t-34.5 89.5z" /> +<glyph unicode=""" horiz-adv-x="858" d="M516 1462l-151 -528h-152l72 528h231zM893 1462l-152 -528h-153l74 528h231z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M1036 872l-84 -286h271l-15 -168h-303l-121 -418h-180l123 418h-248l-121 -418h-174l117 418h-250l17 168h280l84 286h-264l16 168h295l121 422h178l-121 -422h252l121 422h174l-121 -422h252l-14 -168h-285zM526 586h250l82 286h-250z" /> +<glyph unicode="$" d="M987 494q0 -172 -119.5 -277t-337.5 -125l-45 -211h-135l45 211q-197 13 -334 80v209q78 -42 179.5 -70t193.5 -30l84 387q-156 56 -223.5 138.5t-67.5 199.5q0 167 118.5 267.5t324.5 117.5l37 163h135l-35 -165q161 -16 289 -82l-86 -185q-134 66 -244 74l-80 -371 q128 -51 186.5 -95t86.5 -101t28 -135zM571 285q86 11 136.5 60t50.5 126q0 101 -115 145zM629 1196q-89 -11 -133.5 -57.5t-44.5 -122.5q0 -98 110 -139z" /> +<glyph unicode="%" horiz-adv-x="1688" d="M530 1315q-55 0 -99 -61t-70.5 -173t-26.5 -215q0 -135 80 -135q52 0 95.5 58t73 175.5t29.5 219.5q0 131 -82 131zM805 1186q0 -160 -55.5 -313.5t-146.5 -230.5t-206 -77q-124 0 -190 79t-66 228q0 166 53 313.5t142.5 222.5t208.5 75q127 0 193.5 -76t66.5 -221z M1511 1462l-1085 -1462h-195l1086 1462h194zM1329 731q-52 0 -95.5 -57.5t-72 -171t-28.5 -221.5q0 -134 81 -134q52 0 96 58.5t73.5 174.5t29.5 220q0 131 -84 131zM1606 604q0 -161 -55.5 -315.5t-146.5 -231.5t-204 -77q-127 0 -193.5 76.5t-66.5 222.5q0 171 53 320 t142.5 223.5t207.5 74.5q127 0 195 -75t68 -218z" /> +<glyph unicode="&" horiz-adv-x="1411" d="M748 1298q-87 0 -134 -54t-47 -142q0 -109 62 -201q147 75 199.5 133.5t52.5 126.5q0 66 -36 101.5t-97 35.5zM508 176q77 0 147 27t144 82l-264 381q-133 -74 -181.5 -141.5t-48.5 -153.5t56 -140.5t147 -54.5zM66 350q0 147 85.5 254t286.5 205q-88 151 -88 283 q0 180 112.5 286.5t297.5 106.5q160 0 252 -81t92 -218q0 -129 -89.5 -230t-293.5 -192l235 -326q109 112 181 295h233q-113 -270 -297 -454l205 -279h-277l-94 131q-106 -80 -211 -115.5t-229 -35.5q-190 0 -295.5 97.5t-105.5 272.5z" /> +<glyph unicode="'" horiz-adv-x="483" d="M516 1462l-151 -528h-152l72 528h231z" /> +<glyph unicode="(" horiz-adv-x="639" d="M78 276q0 343 124.5 632.5t379.5 553.5h209q-498 -548 -498 -1190q0 -329 115 -596h-183q-147 261 -147 600z" /> +<glyph unicode=")" horiz-adv-x="639" d="M559 860q0 -342 -123 -629.5t-381 -554.5h-209q498 548 498 1190q0 327 -115 596h183q147 -265 147 -602z" /> +<glyph unicode="*" horiz-adv-x="1122" d="M868 1524l-116 -367l403 23l-12 -205l-367 45l170 -361l-205 -61l-102 371l-227 -312l-162 144l293 266l-350 100l71 195l354 -178l37 383z" /> +<glyph unicode="+" d="M496 631h-379v180h379v381h180v-381h377v-180h-377v-375h-180v375z" /> +<glyph unicode="," horiz-adv-x="530" d="M334 238l8 -23q-125 -260 -266 -479h-178q105 238 200 502h236z" /> +<glyph unicode="-" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" /> +<glyph unicode="." horiz-adv-x="551" d="M33 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5z" /> +<glyph unicode="/" horiz-adv-x="788" d="M952 1462l-811 -1462h-233l811 1462h233z" /> +<glyph unicode="0" d="M1100 1012q0 -306 -79 -546.5t-219 -363t-325 -122.5q-194 0 -289.5 127.5t-95.5 363.5q0 284 83 526t222.5 365t321.5 123q187 0 284 -118.5t97 -354.5zM700 1288q-97 0 -180 -112t-136.5 -312.5t-53.5 -394.5q0 -143 39 -218t129 -75q100 0 182.5 113.5t132 316.5 t49.5 414q0 268 -162 268z" /> +<glyph unicode="1" d="M637 0h-238l189 870q28 150 82 324q-57 -55 -135 -102l-187 -117l-106 170l508 317h198z" /> +<glyph unicode="2" d="M911 0h-929l36 180l471 422q176 159 238.5 231t90.5 133.5t28 131.5q0 85 -49.5 134.5t-139.5 49.5q-70 0 -139 -30t-170 -109l-115 160q120 97 231 138.5t228 41.5q181 0 288 -93t107 -251q0 -108 -39 -201t-123 -190.5t-284 -268.5l-311 -264v-8h622z" /> +<glyph unicode="3" d="M1087 1153q0 -158 -99 -264t-269 -137v-7q127 -24 196.5 -106t69.5 -205q0 -133 -68 -236.5t-196.5 -160.5t-304.5 -57q-225 0 -385 79v215q84 -49 185.5 -75.5t195.5 -26.5q157 0 245 71.5t88 196.5q0 219 -278 219h-133l37 183h106q164 0 267.5 74.5t103.5 199.5 q0 79 -49.5 124.5t-139.5 45.5q-72 0 -146.5 -25.5t-162.5 -84.5l-104 161q120 81 225.5 113.5t226.5 32.5q183 0 286 -88.5t103 -241.5z" /> +<glyph unicode="4" d="M1047 317h-201l-68 -317h-229l69 317h-622l37 197l803 952h254l-201 -952h201zM659 514l68 309q31 136 100 377h-8q-51 -86 -135 -186l-422 -500h397z" /> +<glyph unicode="5" d="M610 907q181 0 288.5 -103.5t107.5 -285.5q0 -161 -70 -283t-204 -188.5t-324 -66.5q-214 0 -355 79v217q167 -100 342 -100q173 0 270 83t97 230q0 105 -62 168.5t-188 63.5q-95 0 -225 -35l-88 68l200 708h713l-45 -209h-506l-106 -364q93 18 155 18z" /> +<glyph unicode="6" d="M111 446q0 205 60.5 406t165 343t251 215t342.5 73q117 0 203 -25l-43 -194q-72 22 -181 22q-205 0 -337 -129.5t-197 -392.5h6q125 170 326 170q156 0 243.5 -99t87.5 -272q0 -162 -68.5 -301t-185.5 -210.5t-270 -71.5q-194 0 -298.5 120t-104.5 346zM530 174 q81 0 143 48.5t96 134.5t34 188q0 200 -178 200q-51 0 -95.5 -19t-79 -48t-58.5 -64.5t-39 -82t-13 -113.5q0 -110 49.5 -177t140.5 -67z" /> +<glyph unicode="7" d="M125 0l754 1257h-674l43 205h932l-33 -168l-758 -1294h-264z" /> +<glyph unicode="8" d="M731 1485q179 0 283 -89t104 -239q0 -132 -79 -229.5t-248 -163.5q120 -78 172.5 -165.5t52.5 -201.5q0 -121 -61.5 -216.5t-175.5 -148t-271 -52.5q-203 0 -317.5 100t-114.5 268q0 297 368 432q-91 70 -130.5 145t-39.5 162q0 179 127 288.5t330 109.5zM594 672 q-149 -54 -216 -126.5t-67 -176.5q0 -93 59 -149t158 -56q115 0 184.5 64t69.5 167q0 91 -48.5 157.5t-139.5 119.5zM711 1300q-93 0 -150 -56t-57 -148q0 -83 39 -137t104 -93q115 43 177.5 105t62.5 157q0 81 -48 126.5t-128 45.5z" /> +<glyph unicode="9" d="M1079 1018q0 -205 -58 -414.5t-152.5 -349t-226 -207t-310.5 -67.5q-133 0 -240 32v207q121 -43 236 -43q188 0 306 123t177 389h-6q-113 -160 -305 -160q-165 0 -255.5 102t-90.5 288q0 156 67 289t186.5 204.5t274.5 71.5q192 0 294.5 -119.5t102.5 -345.5zM664 1288 q-82 0 -145.5 -47t-97.5 -130t-34 -179q0 -105 46 -160t134 -55q117 0 198 94t81 240q0 108 -48 172.5t-134 64.5z" /> +<glyph unicode=":" horiz-adv-x="551" d="M205 948q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -79 -48.5 -130t-125.5 -51q-66 0 -96.5 35.5t-30.5 87.5zM33 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5z" /> +<glyph unicode=";" horiz-adv-x="551" d="M334 238l8 -23q-125 -260 -266 -479h-176q95 214 198 502h236zM205 948q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -79 -48.5 -130t-125.5 -51q-66 0 -96.5 35.5t-30.5 87.5z" /> +<glyph unicode="<" d="M1051 221l-936 430v121l936 488v-195l-697 -344l697 -303v-197z" /> +<glyph unicode="=" d="M117 831v179h936v-179h-936zM117 430v180h936v-180h-936z" /> +<glyph unicode=">" d="M115 418l694 303l-694 344v195l936 -488v-121l-936 -430v197z" /> +<glyph unicode="?" horiz-adv-x="907" d="M260 444q18 133 71.5 220.5t176.5 177.5q107 77 146.5 117t58 80.5t18.5 88.5q0 70 -42.5 114t-123.5 44q-77 0 -150 -27.5t-151 -64.5l-78 176q207 113 410 113q171 0 269 -85.5t98 -242.5q0 -120 -63.5 -217.5t-231.5 -216.5q-104 -74 -150 -133t-61 -144h-197zM162 94 q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -79 -49 -129t-125 -50q-66 0 -96.5 34.5t-30.5 86.5z" /> +<glyph unicode="@" horiz-adv-x="1743" d="M1706 846q0 -176 -59.5 -322.5t-166.5 -229.5t-239 -83q-98 0 -150.5 46t-64.5 120h-6q-101 -166 -277 -166q-123 0 -189.5 78.5t-66.5 218.5q0 151 67.5 279.5t188 203t263.5 74.5q52 0 94.5 -5t79.5 -13t129 -39l-101 -392q-30 -114 -30 -159q0 -92 79 -92 q72 0 134 66.5t97.5 174.5t35.5 230q0 228 -128.5 347.5t-363.5 119.5q-214 0 -385 -99.5t-266.5 -281.5t-95.5 -406q0 -259 140.5 -401t391.5 -142q200 0 430 86v-155q-219 -90 -454 -90q-210 0 -367 83.5t-241.5 239.5t-84.5 365q0 270 122.5 489t343 344t493.5 125 q200 0 346 -74.5t223.5 -214.5t77.5 -325zM989 913q-86 0 -158.5 -53.5t-113.5 -144t-41 -193.5q0 -157 112 -157q82 0 141.5 72t100.5 220l64 240q-53 16 -105 16z" /> +<glyph unicode="A" horiz-adv-x="1210" d="M827 406h-485l-209 -406h-254l783 1464h274l166 -1464h-234zM811 614q-40 416 -45.5 503.5t-5.5 139.5q-55 -139 -142 -307l-172 -336h365z" /> +<glyph unicode="B" horiz-adv-x="1247" d="M778 1462q222 0 335.5 -84t113.5 -248q0 -146 -86.5 -243t-239.5 -127v-8q108 -28 167.5 -103.5t59.5 -183.5q0 -217 -150 -341t-417 -124h-491l309 1462h399zM489 858h199q139 0 215 60.5t76 171.5q0 172 -223 172h-181zM348 201h223q147 0 230.5 68t83.5 194 q0 98 -60 149.5t-176 51.5h-200z" /> +<glyph unicode="C" horiz-adv-x="1225" d="M924 1278q-154 0 -275 -89t-193.5 -259.5t-72.5 -374.5q0 -180 82.5 -275.5t243.5 -95.5q141 0 329 68v-205q-180 -67 -374 -67q-248 0 -388.5 148.5t-140.5 416.5q0 260 105.5 483t281.5 339t402 116q217 0 389 -92l-94 -195q-63 34 -134 58t-161 24z" /> +<glyph unicode="D" horiz-adv-x="1374" d="M1311 893q0 -271 -100 -473t-291 -311t-449 -109h-401l309 1462h369q271 0 417 -145t146 -424zM483 201q177 0 309 86t202.5 242t70.5 356q0 184 -88 280.5t-256 96.5h-146l-227 -1061h135z" /> +<glyph unicode="E" horiz-adv-x="1077" d="M846 0h-776l309 1462h776l-43 -205h-539l-84 -395h502l-41 -203h-504l-96 -456h539z" /> +<glyph unicode="F" horiz-adv-x="1026" d="M307 0h-237l309 1462h774l-43 -205h-537l-96 -454h502l-45 -203h-500z" /> +<glyph unicode="G" horiz-adv-x="1399" d="M786 793h512l-157 -736q-112 -40 -218.5 -58.5t-238.5 -18.5q-261 0 -405 146t-144 413q0 264 102.5 483t290 340t426.5 121q111 0 213 -20.5t205 -69.5l-90 -203q-174 86 -334 86q-158 0 -287 -90.5t-203.5 -258t-74.5 -372.5q0 -183 89 -277t253 -94q109 0 215 33 l80 371h-277z" /> +<glyph unicode="H" horiz-adv-x="1411" d="M1110 0h-238l140 659h-566l-139 -659h-237l309 1462h237l-127 -598h566l127 598h237z" /> +<glyph unicode="I" horiz-adv-x="608" d="M70 0l311 1462h235l-311 -1462h-235z" /> +<glyph unicode="J" horiz-adv-x="612" d="M-152 -408q-104 0 -170 25l5 201q84 -21 153 -21q201 0 254 250l299 1415h238l-305 -1446q-46 -217 -161.5 -320.5t-312.5 -103.5z" /> +<glyph unicode="K" horiz-adv-x="1198" d="M1087 0h-262l-252 655l-149 -100l-117 -555h-237l309 1462h237l-151 -706l141 166l492 540h284l-616 -669z" /> +<glyph unicode="L" horiz-adv-x="1016" d="M70 0l309 1462h237l-266 -1257h539l-43 -205h-776z" /> +<glyph unicode="M" horiz-adv-x="1757" d="M647 0l-115 1214h-6q-9 -118 -55 -340l-184 -874h-219l309 1462h323l109 -1149h6l606 1149h344l-305 -1462h-227l182 872q39 186 86 342h-6l-643 -1214h-205z" /> +<glyph unicode="N" horiz-adv-x="1491" d="M1192 0h-260l-410 1163h-6l-10 -69q-24 -149 -35.5 -212.5t-183.5 -881.5h-219l309 1462h268l399 -1149h7q6 54 31 192.5t40 203.5l160 753h219z" /> +<glyph unicode="O" horiz-adv-x="1485" d="M1421 922q0 -279 -95 -497t-261.5 -331.5t-386.5 -113.5q-259 0 -401 149.5t-142 413.5q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414zM872 1280q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5q0 -173 81.5 -267t227.5 -94q138 0 248.5 95.5 t172 265t61.5 375.5q0 170 -79 265t-223 95z" /> +<glyph unicode="P" horiz-adv-x="1174" d="M465 748h94q178 0 275.5 79.5t97.5 225.5q0 109 -58.5 159t-179.5 50h-119zM1174 1061q0 -248 -169.5 -381t-472.5 -133h-110l-115 -547h-237l309 1462h334q229 0 345 -100.5t116 -300.5z" /> +<glyph unicode="Q" horiz-adv-x="1485" d="M1421 922q0 -322 -130 -563t-355 -332l264 -375h-289l-202 328h-31q-259 0 -401 149.5t-142 413.5q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414zM872 1280q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5q0 -173 81.5 -267t227.5 -94 q138 0 248.5 94t172 263.5t61.5 378.5q0 170 -79 265t-223 95z" /> +<glyph unicode="R" horiz-adv-x="1206" d="M430 584l-123 -584h-237l309 1462h338q223 0 342 -94.5t119 -290.5q0 -165 -86.5 -278.5t-257.5 -165.5l249 -633h-260l-207 584h-186zM473 782h123q170 0 254 75t84 206q0 105 -59 151t-183 46h-119z" /> +<glyph unicode="S" horiz-adv-x="1057" d="M930 428q0 -210 -144.5 -329t-398.5 -119q-210 0 -348 75v224q173 -97 350 -97q137 0 216 58.5t79 162.5q0 69 -41 122.5t-172 136.5q-105 67 -155 122t-76.5 120.5t-26.5 144.5q0 128 61.5 227t174 153t253.5 54q205 0 381 -92l-86 -191q-161 78 -295 78 q-109 0 -175 -58.5t-66 -152.5q0 -47 15 -82.5t46.5 -66t134.5 -95.5q155 -97 214 -187.5t59 -207.5z" /> +<glyph unicode="T" horiz-adv-x="1053" d="M528 0h-237l264 1257h-379l45 205h998l-43 -205h-381z" /> +<glyph unicode="U" horiz-adv-x="1399" d="M1419 1462l-202 -956q-56 -267 -208 -396.5t-403 -129.5q-217 0 -335.5 106t-118.5 305q0 83 20 170l193 901h237l-192 -905q-21 -88 -21 -158q0 -102 59.5 -158.5t180.5 -56.5q145 0 230 80.5t124 261.5l199 936h237z" /> +<glyph unicode="V" horiz-adv-x="1165" d="M506 248q70 178 137 309l455 905h254l-764 -1462h-258l-144 1462h232l74 -905q9 -103 11 -233l-1 -76h4z" /> +<glyph unicode="W" horiz-adv-x="1788" d="M1317 0h-258l-37 842l-6 185l4 106h-6q-47 -144 -117 -291l-385 -842h-256l-53 1462h229l19 -850q0 -136 -13 -346h6q83 221 142 355l387 841h225l31 -839l3 -169l-3 -188h8q28 88 70 197.5t61 152.5l358 846h246z" /> +<glyph unicode="X" horiz-adv-x="1151" d="M1040 0h-256l-192 592l-438 -592h-265l586 770l-250 692h246l178 -540l402 540h266l-551 -710z" /> +<glyph unicode="Y" horiz-adv-x="1092" d="M582 793l432 669h266l-623 -913l-114 -549h-238l119 553l-238 909h242z" /> +<glyph unicode="Z" horiz-adv-x="1092" d="M901 0h-940l33 168l850 1087h-598l43 207h897l-35 -172l-852 -1085h645z" /> +<glyph unicode="[" horiz-adv-x="631" d="M403 -324h-430l381 1786h430l-39 -176h-221l-303 -1433h221z" /> +<glyph unicode="\" horiz-adv-x="788" d="M428 1462l219 -1462h-209l-217 1462h207z" /> +<glyph unicode="]" horiz-adv-x="631" d="M-106 -147h219l305 1433h-221l39 176h430l-381 -1786h-428z" /> +<glyph unicode="^" horiz-adv-x="1069" d="M37 537l608 933h127l272 -933h-184l-188 690l-434 -690h-201z" /> +<glyph unicode="_" horiz-adv-x="813" d="M629 -324h-817l30 140h817z" /> +<glyph unicode="`" horiz-adv-x="1135" d="M918 1241h-144q-65 63 -132 151.5t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="a" horiz-adv-x="1186" d="M399 -20q-141 0 -223 101.5t-82 285.5q0 202 69.5 378t191.5 278.5t268 102.5q97 0 167 -45.5t109 -132.5h10l62 158h180l-236 -1106h-182l21 176h-6q-158 -196 -349 -196zM485 170q82 0 161 77.5t130 207.5t51 284q0 88 -47 141.5t-123 53.5q-85 0 -160 -77t-120 -209.5 t-45 -274.5q0 -102 40.5 -152.5t112.5 -50.5z" /> +<glyph unicode="b" horiz-adv-x="1200" d="M578 -20q-98 0 -168.5 45t-110.5 131h-10l-64 -156h-178l330 1556h235l-71 -333q-13 -63 -38 -156.5t-40 -140.5h8q90 113 165 156.5t161 43.5q145 0 226 -103.5t81 -285.5q0 -202 -69.5 -379.5t-190.5 -277.5t-266 -100zM711 934q-81 0 -162 -80t-130.5 -210.5 t-49.5 -270.5q0 -96 46.5 -149.5t131.5 -53.5t159 78.5t117 210t43 274.5q0 201 -155 201z" /> +<glyph unicode="c" horiz-adv-x="954" d="M506 -20q-196 0 -304 106t-108 303q0 207 73.5 376.5t206.5 265t302 95.5q164 0 297 -61l-70 -184q-122 53 -221 53q-150 0 -250 -153.5t-100 -379.5q0 -111 56 -171t155 -60q74 0 138.5 22t129.5 54v-195q-140 -71 -305 -71z" /> +<glyph unicode="d" horiz-adv-x="1198" d="M623 1126q179 0 268 -178h8q13 146 37 250l76 358h233l-330 -1556h-184l19 176h-7q-88 -106 -170 -151t-174 -45q-143 0 -224 101.5t-81 287.5q0 205 71.5 383t191.5 276t266 98zM489 170q82 0 162.5 82t129 214t48.5 267q0 91 -43.5 146t-132.5 55q-85 0 -159 -77 t-118 -211t-44 -273q0 -203 157 -203z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M664 946q-96 0 -180.5 -86t-121.5 -227h29q188 0 294 53.5t106 151.5q0 51 -32 79.5t-95 28.5zM512 -20q-197 0 -307.5 111t-110.5 310q0 198 77.5 368.5t210 263.5t296.5 93q161 0 250.5 -72.5t89.5 -205.5q0 -182 -166.5 -284.5t-474.5 -102.5h-43l-2 -31v-29 q0 -111 56.5 -174t168.5 -63q72 0 143 19t168 65v-187q-96 -44 -176.5 -62.5t-179.5 -18.5z" /> +<glyph unicode="f" horiz-adv-x="702" d="M-76 -492q-90 0 -149 23v190q64 -20 114 -20q134 0 177 205l217 1022h-179l21 106l194 76l21 92q44 198 134.5 281.5t256.5 83.5q115 0 211 -43l-61 -176q-74 28 -136 28q-69 0 -110.5 -43t-63.5 -141l-18 -86h229l-37 -178h-229l-223 -1053q-40 -189 -131 -278t-238 -89 z" /> +<glyph unicode="g" horiz-adv-x="1067" d="M1143 1106l-31 -137l-192 -33q28 -58 28 -137q0 -193 -119 -306.5t-319 -113.5q-52 0 -92 8q-111 -40 -111 -104q0 -38 31.5 -52t91.5 -22l127 -16q176 -22 252 -87.5t76 -187.5q0 -196 -151 -303t-429 -107q-203 0 -314.5 75t-111.5 206q0 103 69.5 178t223.5 127 q-76 45 -76 127q0 69 46.5 119.5t146.5 97.5q-135 81 -135 252q0 196 122.5 316t323.5 120q80 0 160 -20h383zM324 18q-112 -18 -172 -71t-60 -131q0 -65 55.5 -103.5t169.5 -38.5q163 0 255 54t92 155q0 51 -45 80t-158 41zM594 969q-65 0 -114 -38.5t-76 -105t-27 -145.5 q0 -71 35.5 -109.5t101.5 -38.5q65 0 112.5 39t74 107t26.5 149q0 142 -133 142z" /> +<glyph unicode="h" horiz-adv-x="1208" d="M702 0l142 672q18 90 18 127q0 135 -129 135q-112 0 -209.5 -125t-142.5 -342l-98 -467h-236l330 1556h235l-57 -262q-27 -126 -73 -293l-19 -75h8q84 106 168.5 153t177.5 47q136 0 208.5 -77.5t72.5 -221.5q0 -76 -23 -174l-139 -653h-234z" /> +<glyph unicode="i" horiz-adv-x="563" d="M330 1378q0 68 39 110t110 42q53 0 86 -26.5t33 -80.5q0 -71 -40 -112t-105 -41q-53 0 -88 26t-35 82zM283 0h-236l236 1106h235z" /> +<glyph unicode="j" horiz-adv-x="563" d="M-113 -492q-90 0 -149 23v190q64 -20 117 -20q131 0 170 186l260 1219h233l-266 -1247q-38 -181 -127.5 -266t-237.5 -85zM332 1378q0 68 38 110t109 42q54 0 86.5 -26.5t32.5 -80.5q0 -71 -40 -112t-105 -41q-53 0 -87 25.5t-34 82.5z" /> +<glyph unicode="k" horiz-adv-x="1081" d="M887 1106h272l-483 -485l291 -621h-262l-209 471l-136 -96l-77 -375h-236l330 1556h235q-135 -627 -159.5 -729.5t-59.5 -226.5h4z" /> +<glyph unicode="l" horiz-adv-x="563" d="M281 0h-234l330 1556h235z" /> +<glyph unicode="m" horiz-adv-x="1819" d="M807 1126q220 0 254 -235h8q75 116 170.5 175.5t198.5 59.5q133 0 202.5 -76.5t69.5 -215.5q0 -64 -22 -181l-140 -653h-235l143 672q19 95 19 133q0 129 -121 129q-108 0 -201.5 -124t-136.5 -329l-101 -481h-235l143 672q17 82 17 127q0 135 -117 135 q-110 0 -203.5 -127t-138.5 -338l-98 -469h-236l236 1106h184l-21 -205h9q148 225 352 225z" /> +<glyph unicode="n" horiz-adv-x="1208" d="M702 0l142 672q18 90 18 131q0 131 -129 131q-72 0 -142 -57t-126 -164.5t-84 -243.5l-98 -469h-236l236 1106h184l-21 -205h9q83 118 171 171.5t191 53.5q134 0 207.5 -76t73.5 -216q0 -69 -23 -181l-137 -653h-236z" /> +<glyph unicode="o" horiz-adv-x="1174" d="M842 702q0 107 -49 167.5t-140 60.5q-93 0 -166.5 -71.5t-114 -194t-40.5 -261.5q0 -111 49.5 -170t146.5 -59q90 0 162 68t112 190.5t40 269.5zM1079 692q0 -202 -73 -367.5t-200.5 -254t-293.5 -88.5q-192 0 -305 114.5t-113 311.5q0 199 71.5 365t200.5 258.5 t298 92.5q195 0 305 -116t110 -316z" /> +<glyph unicode="p" horiz-adv-x="1200" d="M578 -20q-181 0 -269 176h-10q-7 -97 -25 -185l-96 -463h-233l338 1598h184l-21 -188h9q157 208 344 208q143 0 224 -103t81 -286q0 -204 -70 -381.5t-190.5 -276.5t-265.5 -99zM711 934q-81 0 -161 -79.5t-130.5 -210.5t-50.5 -271q0 -96 46.5 -149.5t131.5 -53.5 t159 78.5t117 210t43 274.5q0 201 -155 201z" /> +<glyph unicode="q" horiz-adv-x="1198" d="M625 1126q183 0 274 -178h10l64 158h178l-340 -1598h-233l75 349q12 56 43.5 180t38.5 141h-8q-84 -108 -164 -153t-170 -45q-139 0 -219 102.5t-80 284.5q0 208 73 387t192.5 275.5t265.5 96.5zM492 170q80 0 159 81t127.5 213t48.5 269q0 94 -45.5 147.5t-126.5 53.5 q-86 0 -160 -77.5t-118.5 -209.5t-44.5 -274q0 -203 160 -203z" /> +<glyph unicode="r" horiz-adv-x="836" d="M797 1126q62 0 108 -12l-51 -219q-54 14 -102 14q-126 0 -225 -113t-138 -296l-106 -500h-236l236 1106h184l-21 -205h9q83 120 166 172.5t176 52.5z" /> +<glyph unicode="s" horiz-adv-x="922" d="M782 340q0 -173 -118 -266.5t-328 -93.5q-190 0 -322 67v203q153 -90 312 -90q97 0 157 40t60 109q0 51 -34.5 87.5t-141.5 97.5q-125 67 -176.5 136.5t-51.5 164.5q0 155 107 243t289 88q196 0 346 -84l-76 -176q-140 76 -266 76q-73 0 -118.5 -33t-45.5 -92 q0 -45 33 -80t135 -90q105 -59 149 -101t67 -91.5t23 -114.5z" /> +<glyph unicode="t" horiz-adv-x="752" d="M455 170q68 0 151 31v-178q-35 -17 -95 -30t-120 -13q-274 0 -274 247q0 57 16 131l121 570h-162l21 110l190 82l129 232h146l-52 -246h279l-39 -178h-277l-122 -572q-13 -55 -13 -92q0 -43 25 -68.5t76 -25.5z" /> +<glyph unicode="u" horiz-adv-x="1208" d="M506 1106l-129 -610q-31 -141 -31 -193q0 -133 127 -133q72 0 143 57t126 162.5t85 247.5l99 469h233l-233 -1106h-185l21 205h-8q-82 -116 -171 -170.5t-192 -54.5q-134 0 -207 76t-73 218q0 63 12 124.5t24 123.5l123 584h236z" /> +<glyph unicode="v" horiz-adv-x="997" d="M231 0l-131 1106h232l55 -598q14 -159 14 -297h7q28 74 70 165t65 132l311 598h250l-598 -1106h-275z" /> +<glyph unicode="w" horiz-adv-x="1540" d="M844 0l-19 627l-1 70l3 200q-25 -62 -51.5 -125t-345.5 -772h-262l-47 1106h221l13 -646q-2 -87 -11 -245h6q66 176 109 272l278 619h254l19 -604l1 -53l-3 -234h6q17 50 57 158.5t63.5 163.5t251.5 569h244l-518 -1106h-268z" /> +<glyph unicode="x" horiz-adv-x="1032" d="M489 387l-305 -387h-270l475 569l-231 537h245l144 -373l287 373h274l-461 -549l248 -557h-246z" /> +<glyph unicode="y" horiz-adv-x="1004" d="M100 1106h232l63 -531q9 -62 16 -174.5t7 -181.5h6q86 215 135 313l293 574h254l-688 -1280q-90 -165 -196 -241.5t-249 -76.5q-76 0 -143 19v188q75 -16 125 -16q74 0 134 43.5t124 155.5l51 92z" /> +<glyph unicode="z" horiz-adv-x="920" d="M719 0h-758l29 147l635 781h-439l39 178h705l-37 -170l-623 -758h486z" /> +<glyph unicode="{" horiz-adv-x="721" d="M457 -324q-316 0 -316 236q0 61 17 133l45 201q14 65 14 98q0 141 -209 141l39 187q120 0 191.5 42.5t93.5 143.5l59 275q28 134 73 201.5t120 97.5t198 30h60l-41 -184q-96 0 -139.5 -34t-61.5 -116l-70 -309q-24 -108 -87 -170.5t-179 -79.5v-6q160 -45 160 -215 q0 -38 -16 -121l-43 -194q-11 -48 -11 -74q0 -51 32.5 -74.5t109.5 -23.5v-185h-39z" /> +<glyph unicode="|" d="M498 1552h178v-2033h-178v2033z" /> +<glyph unicode="}" horiz-adv-x="721" d="M270 1462q318 0 318 -235q0 -61 -17 -133l-45 -203q-14 -65 -14 -98q0 -142 209 -142l-39 -186q-121 0 -192 -42t-93 -142l-63 -306q-34 -165 -123.5 -232t-269.5 -67h-29v183q106 2 152.5 36.5t64.5 114.5l70 309q24 109 87 170t179 78v6q-158 48 -158 215q0 55 17 121 l43 197q10 44 10 74q0 58 -43 78t-121 20l35 184h22z" /> +<glyph unicode="~" d="M344 692q-51 0 -112 -31t-121 -90v191q100 108 249 108q64 0 118.5 -12t146.5 -51q70 -30 115 -42.5t94 -12.5q50 0 112.5 31t120.5 89v-190q-103 -111 -250 -111q-63 0 -124 16.5t-138 49.5q-76 32 -119.5 43.5t-91.5 11.5z" /> +<glyph unicode="¡" horiz-adv-x="557" d="M221 645h174l-166 -1018h-274zM522 993q0 -80 -47 -130t-127 -50q-59 0 -93 31.5t-34 91.5q0 82 49 132t127 50q65 0 95 -35.5t30 -89.5z" /> +<glyph unicode="¢" d="M578 -20h-156l45 213q-132 34 -202 134.5t-70 258.5q0 190 63.5 351t178 260.5t261.5 121.5l35 164h156l-37 -164q124 -12 221 -57l-69 -185q-125 53 -222 53q-99 0 -180 -71.5t-125.5 -194.5t-44.5 -266q0 -111 56 -171t155 -60q74 0 138.5 21.5t129.5 53.5v-194 q-133 -69 -293 -74z" /> +<glyph unicode="£" d="M856 1483q188 0 352 -86l-88 -183q-143 74 -258 74q-185 0 -227 -205l-57 -278h333l-34 -172h-336l-33 -152q-21 -98 -68.5 -165t-130.5 -109h690l-45 -207h-972l38 193q200 45 250 276l35 164h-196l36 172h197l61 299q38 185 153 282t300 97z" /> +<glyph unicode="¤" d="M209 723q0 110 61 205l-129 129l119 119l127 -127q102 61 207 61q108 0 207 -63l127 129l121 -117l-129 -129q61 -99 61 -207q0 -114 -61 -209l127 -125l-119 -119l-127 127q-95 -59 -207 -59q-120 0 -207 59l-127 -125l-117 119l127 125q-61 95 -61 207zM377 723 q0 -91 62.5 -154t154.5 -63q91 0 156 62t65 155t-65 156t-156 63q-92 0 -154.5 -64t-62.5 -155z" /> +<glyph unicode="¥" d="M594 793l432 669h248l-518 -760h217l-35 -155h-274l-31 -148h274l-33 -155h-272l-53 -244h-221l51 244h-273l33 155h273l30 148h-272l35 155h211l-199 760h232z" /> +<glyph unicode="¦" d="M498 1552h178v-794h-178v794zM498 315h178v-796h-178v796z" /> +<glyph unicode="§" horiz-adv-x="995" d="M162 764q0 188 219 307q-47 32 -78 82t-31 115q0 138 111.5 220.5t296.5 82.5q178 0 332 -78l-68 -158q-62 29 -129.5 50.5t-144.5 21.5q-86 0 -134.5 -34.5t-48.5 -94.5q0 -43 36.5 -76.5t148.5 -83.5q127 -56 186.5 -127.5t59.5 -167.5q0 -92 -52.5 -171t-160.5 -140 q102 -76 102 -193q0 -157 -123 -245t-330 -88q-188 0 -315 67v187q152 -93 319 -93q116 0 174 40.5t58 111.5q0 43 -39 79.5t-141 84.5q-130 60 -189 131.5t-59 169.5zM510 987q-69 -26 -110.5 -79t-41.5 -115q0 -61 46.5 -104.5t173.5 -100.5q62 36 99.5 90.5t37.5 114.5 t-49.5 104.5t-155.5 89.5z" /> +<glyph unicode="¨" horiz-adv-x="1135" d="M426 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM809 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="©" horiz-adv-x="1704" d="M930 1034q-113 0 -175.5 -76t-62.5 -231q0 -301 238 -301q47 0 112 16t109 35v-158q-117 -51 -240 -51q-197 0 -303 123.5t-106 335.5q0 216 113.5 340.5t312.5 124.5q138 0 266 -66l-68 -147q-106 55 -196 55zM131 731q0 200 100 375t275 276t377 101q199 0 373.5 -99 t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM254 731q0 -168 83 -312.5t229 -230.5t317 -86q173 0 319.5 87t227.5 231.5t81 310.5q0 165 -82 310.5t-227.5 232t-318.5 86.5q-168 0 -314.5 -84.5 t-230.5 -231t-84 -313.5z" /> +<glyph unicode="ª" horiz-adv-x="729" d="M498 1479q113 0 166 -103h6l39 90h118l-147 -684h-123l10 105h-4q-50 -62 -98 -89.5t-109 -27.5q-91 0 -143.5 66t-52.5 180q0 128 47 238.5t122.5 167.5t168.5 57zM412 897q50 0 97.5 48t77 127.5t29.5 158.5q0 119 -102 119q-82 0 -138.5 -97.5t-56.5 -230.5 q0 -125 93 -125z" /> +<glyph unicode="«" horiz-adv-x="1055" d="M80 575l395 420l135 -118l-288 -332l153 -369l-178 -76l-217 453v22zM520 555l385 434l137 -112l-280 -351l147 -350l-180 -76l-209 430v25z" /> +<glyph unicode="¬" d="M1053 811v-555h-179v375h-757v180h936z" /> +<glyph unicode="­" horiz-adv-x="649" d="M47 446zM47 446l45 203h502l-45 -203h-502z" /> +<glyph unicode="®" horiz-adv-x="1704" d="M131 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM254 731q0 -168 83 -312.5t229 -230.5t317 -86q173 0 319.5 87t227.5 231.5t81 310.5 q0 165 -82 310.5t-227.5 232t-318.5 86.5q-168 0 -314.5 -84.5t-230.5 -231t-84 -313.5zM1214 907q0 -83 -45.5 -145t-130.5 -98l211 -373h-200l-172 325h-91v-325h-178v878h269q337 0 337 -262zM786 760h72q84 0 129 36t45 99q0 73 -45.5 101t-128.5 28h-72v-264z" /> +<glyph unicode="¯" horiz-adv-x="903" d="M1020 1556h-909l39 166h911z" /> +<glyph unicode="°" horiz-adv-x="877" d="M188 1153q0 136 97 233t233 97t232 -97t96 -233q0 -137 -96 -231.5t-232 -94.5q-88 0 -165 44t-121 119t-44 163zM340 1153q0 -70 52 -122t126 -52q72 0 124 52t52 122q0 74 -51.5 126t-124.5 52q-74 0 -126 -51.5t-52 -126.5z" /> +<glyph unicode="±" d="M496 657h-379v181h379v381h180v-381h377v-181h-377v-374h-180v374zM117 0v180h936v-180h-936z" /> +<glyph unicode="²" horiz-adv-x="745" d="M682 586h-604l28 135l269 223q111 95 148.5 136t55 77t17.5 74q0 46 -28 72t-76 26q-91 0 -191 -80l-80 123q68 54 142.5 81.5t168.5 27.5q115 0 183.5 -60t68.5 -155q0 -69 -23.5 -124.5t-74 -110.5t-168.5 -146l-174 -142h371z" /> +<glyph unicode="³" horiz-adv-x="745" d="M784 1272q0 -90 -54.5 -149t-158.5 -85v-4q78 -18 115 -67t37 -115q0 -129 -99.5 -206t-269.5 -77q-138 0 -250 56v159q126 -71 248 -71q90 0 139.5 37t49.5 106q0 113 -146 113h-108l28 133h93q89 0 142.5 34t53.5 99q0 100 -117 100q-92 0 -188 -65l-68 121 q126 90 291 90q124 0 193 -55.5t69 -153.5z" /> +<glyph unicode="´" horiz-adv-x="1135" d="M508 1266q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="µ" horiz-adv-x="1221" d="M358 307q0 -65 33 -101t96 -36q113 0 209.5 125.5t141.5 337.5l102 473h231l-235 -1106h-184l22 190h-10q-75 -111 -153 -160.5t-165 -49.5q-108 0 -155 81h-8q-9 -73 -39 -235l-66 -318h-233l338 1598h235l-141 -670q-19 -84 -19 -129z" /> +<glyph unicode="¶" horiz-adv-x="1341" d="M1204 -260h-139v1638h-188v-1638h-140v819q-62 -18 -145 -18q-216 0 -318 125t-102 376q0 260 109 387t342 127h581v-1816z" /> +<glyph unicode="·" horiz-adv-x="551" d="M150 569zM150 692q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5z" /> +<glyph unicode="¸" horiz-adv-x="420" d="M236 -264q0 -106 -82 -167t-224 -61q-64 0 -118 15v135q47 -14 96 -14q137 0 137 96q0 40 -35 61.5t-104 30.5l98 168h146l-50 -96q72 -25 104 -67t32 -101z" /> +<glyph unicode="¹" horiz-adv-x="745" d="M532 1462h162l-186 -876h-191l99 461q17 79 57 217q-21 -20 -49.5 -43t-153.5 -103l-77 129z" /> +<glyph unicode="º" horiz-adv-x="721" d="M776 1206q0 -126 -42 -225t-121 -155t-189 -56q-122 0 -191 73t-69 204q0 122 44 221.5t125.5 155t188.5 55.5q124 0 189 -71.5t65 -201.5zM510 1346q-81 0 -132.5 -87.5t-51.5 -216.5q0 -141 112 -141q77 0 127.5 87.5t50.5 219.5q0 138 -106 138z" /> +<glyph unicode="»" horiz-adv-x="1055" d="M975 510l-397 -418l-134 119l287 330l-153 370l180 76l217 -455v-22zM535 530l-385 -432l-140 113l281 348l-146 352l179 76l211 -432v-25z" /> +<glyph unicode="¼" horiz-adv-x="1661" d="M149 0zM1429 1462l-1083 -1462h-197l1085 1462h195zM490 1462h162l-186 -876h-191l99 461q17 79 57 217q-21 -20 -49.5 -43t-153.5 -103l-77 129zM1448 177h-122l-39 -176h-183l39 176h-368l26 137l477 569h197l-121 -563h123zM1172 320l52 221l34 129q-32 -51 -98 -131 l-187 -219h199z" /> +<glyph unicode="½" horiz-adv-x="1661" d="M121 0zM1401 1462l-1083 -1462h-197l1085 1462h195zM461 1462h162l-186 -876h-191l99 461q17 79 57 217q-21 -20 -49.5 -43t-153.5 -103l-77 129zM1464 1h-604l28 135l269 223q111 95 148.5 136t55 77t17.5 74q0 46 -28 72t-76 26q-91 0 -191 -80l-80 123 q68 54 142.5 81.5t168.5 27.5q115 0 183.5 -60t68.5 -155q0 -69 -23.5 -124.5t-74 -110.5t-168.5 -146l-174 -142h371z" /> +<glyph unicode="¾" horiz-adv-x="1683" d="M108 0zM1571 1462l-1083 -1462h-197l1085 1462h195zM1554 177h-122l-39 -176h-183l39 176h-368l26 137l477 569h197l-121 -563h123zM1278 320l52 221l34 129q-32 -51 -98 -131l-187 -219h199zM788 1272q0 -90 -54.5 -149t-158.5 -85v-4q78 -18 115 -67t37 -115 q0 -129 -99.5 -206t-269.5 -77q-138 0 -250 56v159q126 -71 248 -71q90 0 139.5 37t49.5 106q0 113 -146 113h-108l28 133h93q89 0 142.5 34t53.5 99q0 100 -117 100q-92 0 -188 -65l-68 121q126 90 291 90q124 0 193 -55.5t69 -153.5z" /> +<glyph unicode="¿" horiz-adv-x="907" d="M668 643q-25 -146 -79.5 -231t-170.5 -168q-107 -79 -145.5 -118t-57 -79t-18.5 -88q0 -71 42 -114.5t123 -43.5q76 0 149.5 27.5t152.5 65.5l75 -177q-205 -112 -409 -112q-174 0 -269.5 85.5t-95.5 241.5q0 120 64 219t231 216q93 64 141 122.5t70 153.5h197zM766 993 q0 -85 -48 -134.5t-130 -49.5q-56 0 -89.5 32.5t-33.5 92.5q0 78 46.5 129t125.5 51q66 0 97.5 -34t31.5 -87z" /> +<glyph unicode="À" horiz-adv-x="1210" d="M0 0zM827 406h-485l-209 -406h-254l783 1464h274l166 -1464h-234zM811 614q-40 416 -45.5 503.5t-5.5 139.5q-55 -139 -142 -307l-172 -336h365zM915 1579h-144q-65 63 -132 151.5t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="Á" horiz-adv-x="1210" d="M0 0zM827 406h-485l-209 -406h-254l783 1464h274l166 -1464h-234zM811 614q-40 416 -45.5 503.5t-5.5 139.5q-55 -139 -142 -307l-172 -336h365zM707 1604q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="Â" horiz-adv-x="1210" d="M0 0zM827 406h-485l-209 -406h-254l783 1464h274l166 -1464h-234zM811 614q-40 416 -45.5 503.5t-5.5 139.5q-55 -139 -142 -307l-172 -336h365zM1157 1579h-152q-76 63 -161 178q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="Ã" horiz-adv-x="1210" d="M0 0zM827 406h-485l-209 -406h-254l783 1464h274l166 -1464h-234zM811 614q-40 416 -45.5 503.5t-5.5 139.5q-55 -139 -142 -307l-172 -336h365zM967 1579q-45 0 -82.5 17t-71.5 37.5t-65.5 37.5t-63.5 17q-38 0 -63 -27.5t-43 -83.5h-137q57 285 256 285q46 0 85 -17.5 t72.5 -38t63.5 -38t59 -17.5q40 0 65 26.5t48 86.5h137q-66 -285 -260 -285z" /> +<glyph unicode="Ä" horiz-adv-x="1210" d="M0 0zM827 406h-485l-209 -406h-254l783 1464h274l166 -1464h-234zM811 614q-40 416 -45.5 503.5t-5.5 139.5q-55 -139 -142 -307l-172 -336h365zM518 1718q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM901 1718 q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="Å" horiz-adv-x="1210" d="M0 0zM827 406h-485l-209 -406h-254l783 1464h274l166 -1464h-234zM811 614q-40 416 -45.5 503.5t-5.5 139.5q-55 -139 -142 -307l-172 -336h365zM1039 1575q0 -104 -66 -165.5t-172 -61.5t-169.5 61t-63.5 164t65 164.5t168 61.5q104 0 171 -60.5t67 -163.5zM908 1573 q0 50 -30 78.5t-77 28.5q-45 0 -74.5 -28.5t-29.5 -78.5q0 -49 26.5 -76.5t77.5 -27.5q47 0 77 27.5t30 76.5z" /> +<glyph unicode="Æ" horiz-adv-x="1753" d="M1520 0h-777l86 406h-432l-256 -406h-262l930 1462h1020l-43 -205h-539l-84 -395h504l-43 -200h-502l-98 -459h539zM872 614l138 643h-82l-400 -643h344z" /> +<glyph unicode="Ç" horiz-adv-x="1225" d="M135 0zM924 1278q-154 0 -275 -89t-193.5 -259.5t-72.5 -374.5q0 -180 82.5 -275.5t243.5 -95.5q141 0 329 68v-205q-180 -67 -374 -67q-248 0 -388.5 148.5t-140.5 416.5q0 260 105.5 483t281.5 339t402 116q217 0 389 -92l-94 -195q-63 34 -134 58t-161 24zM791 -264 q0 -106 -82 -167t-224 -61q-64 0 -118 15v135q47 -14 96 -14q137 0 137 96q0 40 -35 61.5t-104 30.5l98 168h146l-50 -96q72 -25 104 -67t32 -101z" /> +<glyph unicode="È" horiz-adv-x="1077" d="M70 0zM846 0h-776l309 1462h776l-43 -205h-539l-84 -395h502l-41 -203h-504l-96 -456h539zM903 1579h-144q-65 63 -132 151.5t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="É" horiz-adv-x="1077" d="M70 0zM846 0h-776l309 1462h776l-43 -205h-539l-84 -395h502l-41 -203h-504l-96 -456h539zM633 1604q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="Ê" horiz-adv-x="1077" d="M70 0zM846 0h-776l309 1462h776l-43 -205h-539l-84 -395h502l-41 -203h-504l-96 -456h539zM1130 1579h-152q-76 63 -161 178q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="Ë" horiz-adv-x="1077" d="M70 0zM846 0h-776l309 1462h776l-43 -205h-539l-84 -395h502l-41 -203h-504l-96 -456h539zM479 1718q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM862 1718q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5 q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="Ì" horiz-adv-x="608" d="M70 0zM70 0l311 1462h235l-311 -1462h-235zM630 1579h-144q-65 63 -132 151.5t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="Í" horiz-adv-x="608" d="M70 0zM70 0l311 1462h235l-311 -1462h-235zM415 1604q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="Î" horiz-adv-x="608" d="M70 0zM70 0l311 1462h235l-311 -1462h-235zM873 1579h-152q-76 63 -161 178q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="Ï" horiz-adv-x="608" d="M70 0zM70 0l311 1462h235l-311 -1462h-235zM243 1718q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM626 1718q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z " /> +<glyph unicode="Ð" horiz-adv-x="1374" d="M1311 893q0 -271 -100 -473t-291 -311t-449 -109h-401l129 623h-146l45 200h144l137 639h369q271 0 417 -145t146 -424zM483 201q177 0 309 86t202.5 242t70.5 356q0 184 -88 280.5t-256 96.5h-146l-94 -439h285l-45 -200h-283l-90 -422h135z" /> +<glyph unicode="Ñ" horiz-adv-x="1491" d="M68 0zM1192 0h-260l-410 1163h-6l-10 -69q-24 -149 -35.5 -212.5t-183.5 -881.5h-219l309 1462h268l399 -1149h7q6 54 31 192.5t40 203.5l160 753h219zM1108 1579q-45 0 -82.5 17t-71.5 37.5t-65.5 37.5t-63.5 17q-38 0 -63 -27.5t-43 -83.5h-137q57 285 256 285 q46 0 85 -17.5t72.5 -38t63.5 -38t59 -17.5q40 0 65 26.5t48 86.5h137q-66 -285 -260 -285z" /> +<glyph unicode="Ò" horiz-adv-x="1485" d="M135 0zM1421 922q0 -279 -95 -497t-261.5 -331.5t-386.5 -113.5q-259 0 -401 149.5t-142 413.5q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414zM872 1280q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5q0 -173 81.5 -267t227.5 -94q138 0 248.5 95.5 t172 265t61.5 375.5q0 170 -79 265t-223 95zM1029 1579h-144q-65 63 -132 151.5t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="Ó" horiz-adv-x="1485" d="M135 0zM1421 922q0 -279 -95 -497t-261.5 -331.5t-386.5 -113.5q-259 0 -401 149.5t-142 413.5q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414zM872 1280q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5q0 -173 81.5 -267t227.5 -94q138 0 248.5 95.5 t172 265t61.5 375.5q0 170 -79 265t-223 95zM787 1604q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="Ô" horiz-adv-x="1485" d="M135 0zM1421 922q0 -279 -95 -497t-261.5 -331.5t-386.5 -113.5q-259 0 -401 149.5t-142 413.5q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414zM872 1280q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5q0 -173 81.5 -267t227.5 -94q138 0 248.5 95.5 t172 265t61.5 375.5q0 170 -79 265t-223 95zM1268 1579h-152q-76 63 -161 178q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="Õ" horiz-adv-x="1485" d="M135 0zM1421 922q0 -279 -95 -497t-261.5 -331.5t-386.5 -113.5q-259 0 -401 149.5t-142 413.5q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414zM872 1280q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5q0 -173 81.5 -267t227.5 -94q138 0 248.5 95.5 t172 265t61.5 375.5q0 170 -79 265t-223 95zM1069 1579q-45 0 -82.5 17t-71.5 37.5t-65.5 37.5t-63.5 17q-38 0 -63 -27.5t-43 -83.5h-137q57 285 256 285q46 0 85 -17.5t72.5 -38t63.5 -38t59 -17.5q40 0 65 26.5t48 86.5h137q-66 -285 -260 -285z" /> +<glyph unicode="Ö" horiz-adv-x="1485" d="M135 0zM1421 922q0 -279 -95 -497t-261.5 -331.5t-386.5 -113.5q-259 0 -401 149.5t-142 413.5q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414zM872 1280q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5q0 -173 81.5 -267t227.5 -94q138 0 248.5 95.5 t172 265t61.5 375.5q0 170 -79 265t-223 95zM623 1718q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM1006 1718q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z " /> +<glyph unicode="×" d="M457 723l-310 311l125 125l312 -309l313 309l127 -123l-315 -313l311 -313l-123 -123l-313 309l-312 -307l-122 123z" /> +<glyph unicode="Ø" horiz-adv-x="1485" d="M1421 922q0 -279 -95 -497t-261.5 -331.5t-386.5 -113.5q-193 0 -318 83l-118 -149l-133 104l129 160q-103 138 -103 365q0 267 98.5 487.5t269.5 337.5t388 117q189 0 317 -94l119 149l133 -104l-133 -166q94 -130 94 -348zM872 1282q-141 0 -253 -93t-177 -265 t-65 -379q0 -88 24 -164l668 836q-80 65 -197 65zM1180 920q0 88 -19 143l-661 -825q75 -56 194 -56q139 0 250.5 95.5t173.5 264.5t62 378z" /> +<glyph unicode="Ù" horiz-adv-x="1399" d="M152 0zM1419 1462l-202 -956q-56 -267 -208 -396.5t-403 -129.5q-217 0 -335.5 106t-118.5 305q0 83 20 170l193 901h237l-192 -905q-21 -88 -21 -158q0 -102 59.5 -158.5t180.5 -56.5q145 0 230 80.5t124 261.5l199 936h237zM996 1579h-144q-65 63 -132 151.5 t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="Ú" horiz-adv-x="1399" d="M152 0zM1419 1462l-202 -956q-56 -267 -208 -396.5t-403 -129.5q-217 0 -335.5 106t-118.5 305q0 83 20 170l193 901h237l-192 -905q-21 -88 -21 -158q0 -102 59.5 -158.5t180.5 -56.5q145 0 230 80.5t124 261.5l199 936h237zM791 1604q97 108 225 303h264v-19 q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="Û" horiz-adv-x="1399" d="M152 0zM1419 1462l-202 -956q-56 -267 -208 -396.5t-403 -129.5q-217 0 -335.5 106t-118.5 305q0 83 20 170l193 901h237l-192 -905q-21 -88 -21 -158q0 -102 59.5 -158.5t180.5 -56.5q145 0 230 80.5t124 261.5l199 936h237zM1249 1579h-152q-76 63 -161 178 q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="Ü" horiz-adv-x="1399" d="M152 0zM1419 1462l-202 -956q-56 -267 -208 -396.5t-403 -129.5q-217 0 -335.5 106t-118.5 305q0 83 20 170l193 901h237l-192 -905q-21 -88 -21 -158q0 -102 59.5 -158.5t180.5 -56.5q145 0 230 80.5t124 261.5l199 936h237zM602 1718q0 60 35 98t98 38q48 0 76.5 -23.5 t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM985 1718q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="Ý" horiz-adv-x="1092" d="M186 0zM582 793l432 669h266l-623 -913l-114 -549h-238l119 553l-238 909h242zM610 1604q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="Þ" horiz-adv-x="1174" d="M1124 817q0 -243 -166.5 -377.5t-476.5 -134.5h-108l-66 -305h-237l309 1462h237l-51 -243h97q227 0 344.5 -101t117.5 -301zM414 506h96q176 0 274.5 78.5t98.5 226.5q0 109 -59.5 158t-180.5 49h-121z" /> +<glyph unicode="ß" horiz-adv-x="1266" d="M-117 -492q-69 0 -141 23v193q61 -21 113 -21q65 0 106.5 43.5t63.5 147.5l262 1234q48 231 173 333t349 102q188 0 292.5 -80t104.5 -215q0 -169 -179 -299q-118 -87 -148.5 -119.5t-30.5 -67.5q0 -44 74 -101q107 -84 143 -127t55 -92.5t19 -109.5q0 -172 -116 -272 t-314 -100q-182 0 -283 65v201q126 -86 252 -86q105 0 164 44t59 124q0 48 -23.5 85t-111.5 107q-82 64 -121 121.5t-39 126.5q0 75 44.5 139t135.5 124q98 66 138.5 112t40.5 98q0 65 -47 101t-132 36q-210 0 -262 -239l-264 -1260q-42 -197 -134.5 -284t-242.5 -87z" /> +<glyph unicode="à" horiz-adv-x="1186" d="M94 0zM399 -20q-141 0 -223 101.5t-82 285.5q0 202 69.5 378t191.5 278.5t268 102.5q97 0 167 -45.5t109 -132.5h10l62 158h180l-236 -1106h-182l21 176h-6q-158 -196 -349 -196zM485 170q82 0 161 77.5t130 207.5t51 284q0 88 -47 141.5t-123 53.5q-85 0 -160 -77 t-120 -209.5t-45 -274.5q0 -102 40.5 -152.5t112.5 -50.5zM847 1241h-144q-65 63 -132 151.5t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="á" horiz-adv-x="1186" d="M94 0zM399 -20q-141 0 -223 101.5t-82 285.5q0 202 69.5 378t191.5 278.5t268 102.5q97 0 167 -45.5t109 -132.5h10l62 158h180l-236 -1106h-182l21 176h-6q-158 -196 -349 -196zM485 170q82 0 161 77.5t130 207.5t51 284q0 88 -47 141.5t-123 53.5q-85 0 -160 -77 t-120 -209.5t-45 -274.5q0 -102 40.5 -152.5t112.5 -50.5zM598 1266q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="â" horiz-adv-x="1186" d="M94 0zM399 -20q-141 0 -223 101.5t-82 285.5q0 202 69.5 378t191.5 278.5t268 102.5q97 0 167 -45.5t109 -132.5h10l62 158h180l-236 -1106h-182l21 176h-6q-158 -196 -349 -196zM485 170q82 0 161 77.5t130 207.5t51 284q0 88 -47 141.5t-123 53.5q-85 0 -160 -77 t-120 -209.5t-45 -274.5q0 -102 40.5 -152.5t112.5 -50.5zM1064 1241h-152q-76 63 -161 178q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="ã" horiz-adv-x="1186" d="M94 0zM399 -20q-141 0 -223 101.5t-82 285.5q0 202 69.5 378t191.5 278.5t268 102.5q97 0 167 -45.5t109 -132.5h10l62 158h180l-236 -1106h-182l21 176h-6q-158 -196 -349 -196zM485 170q82 0 161 77.5t130 207.5t51 284q0 88 -47 141.5t-123 53.5q-85 0 -160 -77 t-120 -209.5t-45 -274.5q0 -102 40.5 -152.5t112.5 -50.5zM870 1241q-45 0 -82.5 17t-71.5 37.5t-65.5 37.5t-63.5 17q-38 0 -63 -27.5t-43 -83.5h-137q57 285 256 285q46 0 85 -17.5t72.5 -38t63.5 -38t59 -17.5q40 0 65 26.5t48 86.5h137q-66 -285 -260 -285z" /> +<glyph unicode="ä" horiz-adv-x="1186" d="M94 0zM399 -20q-141 0 -223 101.5t-82 285.5q0 202 69.5 378t191.5 278.5t268 102.5q97 0 167 -45.5t109 -132.5h10l62 158h180l-236 -1106h-182l21 176h-6q-158 -196 -349 -196zM485 170q82 0 161 77.5t130 207.5t51 284q0 88 -47 141.5t-123 53.5q-85 0 -160 -77 t-120 -209.5t-45 -274.5q0 -102 40.5 -152.5t112.5 -50.5zM425 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM808 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37 q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="å" horiz-adv-x="1186" d="M94 0zM399 -20q-141 0 -223 101.5t-82 285.5q0 202 69.5 378t191.5 278.5t268 102.5q97 0 167 -45.5t109 -132.5h10l62 158h180l-236 -1106h-182l21 176h-6q-158 -196 -349 -196zM485 170q82 0 161 77.5t130 207.5t51 284q0 88 -47 141.5t-123 53.5q-85 0 -160 -77 t-120 -209.5t-45 -274.5q0 -102 40.5 -152.5t112.5 -50.5zM988 1466q0 -104 -66 -165.5t-172 -61.5t-169.5 61t-63.5 164t65 164.5t168 61.5q104 0 171 -60.5t67 -163.5zM857 1464q0 50 -30 78.5t-77 28.5q-45 0 -74.5 -28.5t-29.5 -78.5q0 -49 26.5 -76.5t77.5 -27.5 q47 0 77 27.5t30 76.5z" /> +<glyph unicode="æ" horiz-adv-x="1726" d="M1186 -20q-222 0 -305 137l-23 -117h-151l20 176h-8q-85 -106 -165.5 -151t-174.5 -45q-134 0 -209.5 103t-75.5 284q0 201 69 378t188.5 279t260.5 102q88 0 152 -43.5t108 -134.5h9l63 158h148l-25 -117q51 63 131 100t180 37q140 0 220.5 -76.5t80.5 -201.5 q0 -182 -166.5 -284.5t-474.5 -102.5h-45l-4 -60q0 -117 60.5 -177t175.5 -60q125 0 305 84v-189q-175 -79 -344 -79zM465 170q85 0 162.5 80.5t125.5 215.5t48 267q0 91 -38.5 146t-113.5 55q-85 0 -159.5 -80t-116 -211t-41.5 -270q0 -105 37 -154t96 -49zM1333 946 q-103 0 -188.5 -86t-122.5 -227h31q187 0 293 53.5t106 149.5q0 58 -34 84t-85 26z" /> +<glyph unicode="ç" horiz-adv-x="954" d="M94 0zM506 -20q-196 0 -304 106t-108 303q0 207 73.5 376.5t206.5 265t302 95.5q164 0 297 -61l-70 -184q-122 53 -221 53q-150 0 -250 -153.5t-100 -379.5q0 -111 56 -171t155 -60q74 0 138.5 22t129.5 54v-195q-140 -71 -305 -71zM621 -264q0 -106 -82 -167t-224 -61 q-64 0 -118 15v135q47 -14 96 -14q137 0 137 96q0 40 -35 61.5t-104 30.5l98 168h146l-50 -96q72 -25 104 -67t32 -101z" /> +<glyph unicode="è" horiz-adv-x="1075" d="M94 0zM664 946q-96 0 -180.5 -86t-121.5 -227h29q188 0 294 53.5t106 151.5q0 51 -32 79.5t-95 28.5zM512 -20q-197 0 -307.5 111t-110.5 310q0 198 77.5 368.5t210 263.5t296.5 93q161 0 250.5 -72.5t89.5 -205.5q0 -182 -166.5 -284.5t-474.5 -102.5h-43l-2 -31v-29 q0 -111 56.5 -174t168.5 -63q72 0 143 19t168 65v-187q-96 -44 -176.5 -62.5t-179.5 -18.5zM813 1241h-144q-65 63 -132 151.5t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="é" horiz-adv-x="1075" d="M94 0zM664 946q-96 0 -180.5 -86t-121.5 -227h29q188 0 294 53.5t106 151.5q0 51 -32 79.5t-95 28.5zM512 -20q-197 0 -307.5 111t-110.5 310q0 198 77.5 368.5t210 263.5t296.5 93q161 0 250.5 -72.5t89.5 -205.5q0 -182 -166.5 -284.5t-474.5 -102.5h-43l-2 -31v-29 q0 -111 56.5 -174t168.5 -63q72 0 143 19t168 65v-187q-96 -44 -176.5 -62.5t-179.5 -18.5zM557 1266q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="ê" horiz-adv-x="1075" d="M94 0zM664 946q-96 0 -180.5 -86t-121.5 -227h29q188 0 294 53.5t106 151.5q0 51 -32 79.5t-95 28.5zM512 -20q-197 0 -307.5 111t-110.5 310q0 198 77.5 368.5t210 263.5t296.5 93q161 0 250.5 -72.5t89.5 -205.5q0 -182 -166.5 -284.5t-474.5 -102.5h-43l-2 -31v-29 q0 -111 56.5 -174t168.5 -63q72 0 143 19t168 65v-187q-96 -44 -176.5 -62.5t-179.5 -18.5zM1033 1241h-152q-76 63 -161 178q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="ë" horiz-adv-x="1075" d="M94 0zM664 946q-96 0 -180.5 -86t-121.5 -227h29q188 0 294 53.5t106 151.5q0 51 -32 79.5t-95 28.5zM512 -20q-197 0 -307.5 111t-110.5 310q0 198 77.5 368.5t210 263.5t296.5 93q161 0 250.5 -72.5t89.5 -205.5q0 -182 -166.5 -284.5t-474.5 -102.5h-43l-2 -31v-29 q0 -111 56.5 -174t168.5 -63q72 0 143 19t168 65v-187q-96 -44 -176.5 -62.5t-179.5 -18.5zM388 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM771 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5 q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="ì" horiz-adv-x="563" d="M47 0zM283 0h-236l236 1106h235zM536 1241h-144q-65 63 -132 151.5t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="í" horiz-adv-x="563" d="M47 0zM283 0h-236l236 1106h235zM308 1266q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="î" horiz-adv-x="563" d="M47 0zM283 0h-236l236 1106h235zM777 1241h-152q-76 63 -161 178q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="ï" horiz-adv-x="563" d="M47 0zM283 0h-236l236 1106h235zM142 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM525 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="ð" horiz-adv-x="1174" d="M647 1325q-44 41 -135 96l106 152q129 -72 209 -146l250 138l70 -127l-217 -121q155 -205 155 -512q0 -255 -73 -444.5t-204 -285t-312 -95.5q-197 0 -306.5 107t-109.5 302q0 162 65.5 299t184.5 215t266 78q96 0 168 -38.5t113 -108.5h6q-10 243 -133 383l-250 -142 l-72 129zM508 162q92 0 161.5 59.5t108.5 159t39 205.5q0 97 -52 155t-144 58q-91 0 -160.5 -56t-106.5 -153.5t-37 -212.5q0 -104 49 -159.5t142 -55.5z" /> +<glyph unicode="ñ" horiz-adv-x="1208" d="M47 0zM702 0l142 672q18 90 18 131q0 131 -129 131q-72 0 -142 -57t-126 -164.5t-84 -243.5l-98 -469h-236l236 1106h184l-21 -205h9q83 118 171 171.5t191 53.5q134 0 207.5 -76t73.5 -216q0 -69 -23 -181l-137 -653h-236zM889 1241q-45 0 -82.5 17t-71.5 37.5 t-65.5 37.5t-63.5 17q-38 0 -63 -27.5t-43 -83.5h-137q57 285 256 285q46 0 85 -17.5t72.5 -38t63.5 -38t59 -17.5q40 0 65 26.5t48 86.5h137q-66 -285 -260 -285z" /> +<glyph unicode="ò" horiz-adv-x="1174" d="M94 0zM842 702q0 107 -49 167.5t-140 60.5q-93 0 -166.5 -71.5t-114 -194t-40.5 -261.5q0 -111 49.5 -170t146.5 -59q90 0 162 68t112 190.5t40 269.5zM1079 692q0 -202 -73 -367.5t-200.5 -254t-293.5 -88.5q-192 0 -305 114.5t-113 311.5q0 199 71.5 365t200.5 258.5 t298 92.5q195 0 305 -116t110 -316zM821 1241h-144q-65 63 -132 151.5t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="ó" horiz-adv-x="1174" d="M94 0zM842 702q0 107 -49 167.5t-140 60.5q-93 0 -166.5 -71.5t-114 -194t-40.5 -261.5q0 -111 49.5 -170t146.5 -59q90 0 162 68t112 190.5t40 269.5zM1079 692q0 -202 -73 -367.5t-200.5 -254t-293.5 -88.5q-192 0 -305 114.5t-113 311.5q0 199 71.5 365t200.5 258.5 t298 92.5q195 0 305 -116t110 -316zM580 1266q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="ô" horiz-adv-x="1174" d="M94 0zM842 702q0 107 -49 167.5t-140 60.5q-93 0 -166.5 -71.5t-114 -194t-40.5 -261.5q0 -111 49.5 -170t146.5 -59q90 0 162 68t112 190.5t40 269.5zM1079 692q0 -202 -73 -367.5t-200.5 -254t-293.5 -88.5q-192 0 -305 114.5t-113 311.5q0 199 71.5 365t200.5 258.5 t298 92.5q195 0 305 -116t110 -316zM1054 1241h-152q-76 63 -161 178q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="õ" horiz-adv-x="1174" d="M94 0zM842 702q0 107 -49 167.5t-140 60.5q-93 0 -166.5 -71.5t-114 -194t-40.5 -261.5q0 -111 49.5 -170t146.5 -59q90 0 162 68t112 190.5t40 269.5zM1079 692q0 -202 -73 -367.5t-200.5 -254t-293.5 -88.5q-192 0 -305 114.5t-113 311.5q0 199 71.5 365t200.5 258.5 t298 92.5q195 0 305 -116t110 -316zM854 1241q-45 0 -82.5 17t-71.5 37.5t-65.5 37.5t-63.5 17q-38 0 -63 -27.5t-43 -83.5h-137q57 285 256 285q46 0 85 -17.5t72.5 -38t63.5 -38t59 -17.5q40 0 65 26.5t48 86.5h137q-66 -285 -260 -285z" /> +<glyph unicode="ö" horiz-adv-x="1174" d="M94 0zM842 702q0 107 -49 167.5t-140 60.5q-93 0 -166.5 -71.5t-114 -194t-40.5 -261.5q0 -111 49.5 -170t146.5 -59q90 0 162 68t112 190.5t40 269.5zM1079 692q0 -202 -73 -367.5t-200.5 -254t-293.5 -88.5q-192 0 -305 114.5t-113 311.5q0 199 71.5 365t200.5 258.5 t298 92.5q195 0 305 -116t110 -316zM409 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM792 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="÷" d="M117 631v180h936v-180h-936zM459 373q0 64 31.5 99.5t93.5 35.5t94.5 -36t32.5 -99q0 -64 -34.5 -100.5t-92.5 -36.5t-91.5 35.5t-33.5 101.5zM459 1071q0 64 31.5 99.5t93.5 35.5t94.5 -36t32.5 -99q0 -64 -34.5 -100.5t-92.5 -36.5t-91.5 35.5t-33.5 101.5z" /> +<glyph unicode="ø" horiz-adv-x="1174" d="M1077 700q0 -208 -74 -376t-200.5 -255t-288.5 -87q-137 0 -235 59l-105 -131l-123 96l115 141q-70 104 -70 261q0 200 70.5 365t199.5 258t298 93q136 0 239 -61l86 108l125 -96l-100 -117q63 -100 63 -258zM653 936q-141 0 -235 -145.5t-94 -364.5q0 -39 8 -74l442 549 q-45 35 -121 35zM528 168q89 0 163 66.5t116.5 184t42.5 257.5q0 45 -6 67l-436 -542q41 -33 120 -33z" /> +<glyph unicode="ù" horiz-adv-x="1208" d="M111 0zM506 1106l-129 -610q-31 -141 -31 -193q0 -133 127 -133q72 0 143 57t126 162.5t85 247.5l99 469h233l-233 -1106h-185l21 205h-8q-82 -116 -171 -170.5t-192 -54.5q-134 0 -207 76t-73 218q0 63 12 124.5t24 123.5l123 584h236zM823 1241h-144q-65 63 -132 151.5 t-101 155.5v21h245q47 -154 132 -303v-25z" /> +<glyph unicode="ú" horiz-adv-x="1208" d="M111 0zM506 1106l-129 -610q-31 -141 -31 -193q0 -133 127 -133q72 0 143 57t126 162.5t85 247.5l99 469h233l-233 -1106h-185l21 205h-8q-82 -116 -171 -170.5t-192 -54.5q-134 0 -207 76t-73 218q0 63 12 124.5t24 123.5l123 584h236zM623 1266q97 108 225 303h264v-19 q-54 -66 -158 -161.5t-175 -147.5h-156v25z" /> +<glyph unicode="û" horiz-adv-x="1208" d="M111 0zM506 1106l-129 -610q-31 -141 -31 -193q0 -133 127 -133q72 0 143 57t126 162.5t85 247.5l99 469h233l-233 -1106h-185l21 205h-8q-82 -116 -171 -170.5t-192 -54.5q-134 0 -207 76t-73 218q0 63 12 124.5t24 123.5l123 584h236zM1083 1241h-152q-76 63 -161 178 q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="ü" horiz-adv-x="1208" d="M111 0zM506 1106l-129 -610q-31 -141 -31 -193q0 -133 127 -133q72 0 143 57t126 162.5t85 247.5l99 469h233l-233 -1106h-185l21 205h-8q-82 -116 -171 -170.5t-192 -54.5q-134 0 -207 76t-73 218q0 63 12 124.5t24 123.5l123 584h236zM432 1380q0 60 35 98t98 38 q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM815 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="ý" horiz-adv-x="1004" d="M0 0zM100 1106h232l63 -531q9 -62 16 -174.5t7 -181.5h6q86 215 135 313l293 574h254l-688 -1280q-90 -165 -196 -241.5t-249 -76.5q-76 0 -143 19v188q75 -16 125 -16q74 0 134 43.5t124 155.5l51 92zM501 1266q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5 h-156v25z" /> +<glyph unicode="þ" horiz-adv-x="1200" d="M586 -20q-94 0 -165 45.5t-114 130.5h-8q-7 -91 -25 -185l-96 -463h-233l432 2048h235q-48 -223 -73 -339t-76 -291h8q155 200 328 200q144 0 224.5 -102t80.5 -287q0 -204 -68 -381.5t-184.5 -276.5t-265.5 -99zM707 934q-84 0 -163 -81t-127 -213.5t-48 -266.5 q0 -98 46 -150.5t132 -52.5t159.5 77t116.5 209t43 277q0 100 -41 150.5t-118 50.5z" /> +<glyph unicode="ÿ" horiz-adv-x="1004" d="M0 0zM100 1106h232l63 -531q9 -62 16 -174.5t7 -181.5h6q86 215 135 313l293 574h254l-688 -1280q-90 -165 -196 -241.5t-249 -76.5q-76 0 -143 19v188q75 -16 125 -16q74 0 134 43.5t124 155.5l51 92zM323 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5 q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM706 1380q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="ı" horiz-adv-x="563" d="M283 0h-236l236 1106h235z" /> +<glyph unicode="Œ" horiz-adv-x="1798" d="M1565 0h-717q-84 -20 -170 -20q-259 0 -401 149.5t-142 413.5q0 267 98.5 487.5t269.5 337.5t388 117q145 0 223 -23h760l-43 -205h-539l-84 -395h504l-43 -200h-504l-96 -459h539zM692 184q74 0 139 27l222 1038q-68 31 -181 31q-138 0 -250 -96t-175.5 -266.5 t-63.5 -372.5q0 -173 81.5 -267t227.5 -94z" /> +<glyph unicode="œ" horiz-adv-x="1788" d="M1225 -20q-120 0 -212.5 46t-140.5 138q-137 -182 -374 -182q-186 0 -295 115.5t-109 312.5q0 206 73.5 372.5t201 254t293.5 87.5q237 0 335 -192q73 91 174 142.5t226 51.5q159 0 246.5 -74.5t87.5 -203.5q0 -183 -165.5 -285t-471.5 -102h-47l-3 -60q0 -111 56.5 -174 t169.5 -63q69 0 134.5 17.5t176.5 66.5v-189q-91 -43 -175 -61t-181 -18zM647 930q-87 0 -157.5 -64t-114 -186.5t-43.5 -267.5q0 -116 48.5 -177t139.5 -61q143 0 229.5 146.5t86.5 381.5q0 111 -49.5 169.5t-139.5 58.5zM1386 946q-105 0 -192 -85.5t-121 -227.5h31 q189 0 294 54t105 155q0 48 -30 76t-87 28z" /> +<glyph unicode="Ÿ" horiz-adv-x="1092" d="M186 0zM582 793l432 669h266l-623 -913l-114 -549h-238l119 553l-238 909h242zM440 1718q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102t-93.5 -37q-47 0 -78 23.5t-31 74.5zM823 1718q0 60 35 98t98 38q48 0 76.5 -23.5t28.5 -71.5q0 -65 -35.5 -102 t-93.5 -37q-47 0 -78 23.5t-31 74.5z" /> +<glyph unicode="ˆ" horiz-adv-x="1135" d="M1067 1241h-152q-76 63 -161 178q-131 -110 -236 -178h-164v25q138 128 201 195.5t90 107.5h248q38 -99 174 -303v-25z" /> +<glyph unicode="˚" horiz-adv-x="1182" d="M1012 1466q0 -104 -66 -165.5t-172 -61.5t-169.5 61t-63.5 164t65 164.5t168 61.5q104 0 171 -60.5t67 -163.5zM881 1464q0 50 -30 78.5t-77 28.5q-45 0 -74.5 -28.5t-29.5 -78.5q0 -49 26.5 -76.5t77.5 -27.5q47 0 77 27.5t30 76.5z" /> +<glyph unicode="˜" horiz-adv-x="1135" d="M852 1241q-45 0 -82.5 17t-71.5 37.5t-65.5 37.5t-63.5 17q-38 0 -63 -27.5t-43 -83.5h-137q57 285 256 285q46 0 85 -17.5t72.5 -38t63.5 -38t59 -17.5q40 0 65 26.5t48 86.5h137q-66 -285 -260 -285z" /> +<glyph unicode=" " horiz-adv-x="953" /> +<glyph unicode=" " horiz-adv-x="1907" /> +<glyph unicode=" " horiz-adv-x="953" /> +<glyph unicode=" " horiz-adv-x="1907" /> +<glyph unicode=" " horiz-adv-x="635" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="317" /> +<glyph unicode=" " horiz-adv-x="238" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode=" " horiz-adv-x="105" /> +<glyph unicode="‐" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" /> +<glyph unicode="‑" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" /> +<glyph unicode="‒" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" /> +<glyph unicode="–" horiz-adv-x="983" d="M47 453l43 194h838l-43 -194h-838z" /> +<glyph unicode="—" horiz-adv-x="1966" d="M47 453l43 194h1821l-43 -194h-1821z" /> +<glyph unicode="‘" horiz-adv-x="393" d="M125 961l-6 22q34 76 106.5 209t159.5 270h176q-122 -286 -199 -501h-237z" /> +<glyph unicode="’" horiz-adv-x="393" d="M551 1462l8 -22q-37 -83 -110.5 -217.5t-155.5 -261.5h-178q43 95 106 255t92 246h238z" /> +<glyph unicode="‚" horiz-adv-x="530" d="M334 238l8 -23q-108 -233 -266 -479h-178q105 238 200 502h236z" /> +<glyph unicode="“" horiz-adv-x="803" d="M535 961l-9 22q84 190 267 479h176q-122 -286 -199 -501h-235zM125 961l-6 22q34 76 106.5 209t159.5 270h176q-122 -286 -199 -501h-237z" /> +<glyph unicode="”" horiz-adv-x="803" d="M551 1462l8 -22q-37 -83 -110.5 -217.5t-155.5 -261.5h-178q43 95 106 255t92 246h238zM958 1462l9 -22q-98 -220 -269 -479h-176q51 114 109 261t90 240h237z" /> +<glyph unicode="„" horiz-adv-x="938" d="M334 238l8 -23q-108 -233 -266 -479h-178q105 238 200 502h236zM741 238l9 -23q-92 -206 -267 -479h-176q120 281 199 502h235z" /> +<glyph unicode="•" horiz-adv-x="756" d="M152 684q0 156 83.5 252t223.5 96q100 0 158.5 -54.5t58.5 -168.5q0 -156 -82 -252t-227 -96q-102 0 -158.5 57.5t-56.5 165.5z" /> +<glyph unicode="…" horiz-adv-x="1634" d="M293 0zM834 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5zM594 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5zM293 94 q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5z" /> +<glyph unicode=" " horiz-adv-x="381" /> +<glyph unicode="‹" horiz-adv-x="621" d="M80 573l395 422l135 -118l-288 -334l153 -367l-178 -76l-217 449v24z" /> +<glyph unicode="›" horiz-adv-x="621" d="M541 514l-396 -422l-135 119l289 334l-154 366l179 76l217 -448v-25z" /> +<glyph unicode="⁄" horiz-adv-x="262" d="M770 1462l-1083 -1462h-197l1085 1462h195z" /> +<glyph unicode=" " horiz-adv-x="476" /> +<glyph unicode="⁴" horiz-adv-x="745" d="M743 762h-122l-39 -176h-183l39 176h-368l26 137l477 569h197l-121 -563h123zM467 905l52 221l34 129q-32 -51 -98 -131l-187 -219h199z" /> +<glyph unicode="€" d="M913 1282q-118 0 -214.5 -87t-161.5 -255h387l-33 -154h-402q-18 -67 -28 -139h340l-33 -155h-319q0 -161 60.5 -234.5t195.5 -73.5q120 0 258 60v-203q-129 -61 -306 -61q-216 0 -330 130t-114 382h-162l33 155h139q15 95 27 139h-137l32 154h148q92 260 255.5 401.5 t371.5 141.5q88 0 164.5 -22t156.5 -77l-102 -180q-54 34 -107 56t-119 22z" /> +<glyph unicode="™" horiz-adv-x="1534" d="M455 741h-146v594h-196v127h540v-127h-198v-594zM1030 741l-178 539h-6l4 -115v-424h-141v721h215l170 -534l182 534h205v-721h-146v418l4 121h-6l-184 -539h-119z" /> +<glyph unicode="" horiz-adv-x="1105" d="M0 1105h1105v-1105h-1105v1105z" /> +<glyph horiz-adv-x="1198" d="M0 0z" /> +<hkern u1=""" u2="Ÿ" k="-20" /> +<hkern u1=""" u2="œ" k="123" /> +<hkern u1=""" u2="ü" k="61" /> +<hkern u1=""" u2="û" k="61" /> +<hkern u1=""" u2="ú" k="61" /> +<hkern u1=""" u2="ù" k="61" /> +<hkern u1=""" u2="ø" k="123" /> +<hkern u1=""" u2="ö" k="123" /> +<hkern u1=""" u2="õ" k="123" /> +<hkern u1=""" u2="ô" k="123" /> +<hkern u1=""" u2="ó" k="123" /> +<hkern u1=""" u2="ò" k="123" /> +<hkern u1=""" u2="ë" k="123" /> +<hkern u1=""" u2="ê" k="123" /> +<hkern u1=""" u2="é" k="123" /> +<hkern u1=""" u2="è" k="123" /> +<hkern u1=""" u2="ç" k="123" /> +<hkern u1=""" u2="æ" k="82" /> +<hkern u1=""" u2="å" k="82" /> +<hkern u1=""" u2="ä" k="82" /> +<hkern u1=""" u2="ã" k="82" /> +<hkern u1=""" u2="â" k="82" /> +<hkern u1=""" u2="á" k="82" /> +<hkern u1=""" u2="à" k="123" /> +<hkern u1=""" u2="Ý" k="-20" /> +<hkern u1=""" u2="Å" k="143" /> +<hkern u1=""" u2="Ä" k="143" /> +<hkern u1=""" u2="Ã" k="143" /> +<hkern u1=""" u2="Â" k="143" /> +<hkern u1=""" u2="Á" k="143" /> +<hkern u1=""" u2="À" k="143" /> +<hkern u1=""" u2="u" k="61" /> +<hkern u1=""" u2="s" k="61" /> +<hkern u1=""" u2="r" k="61" /> +<hkern u1=""" u2="q" k="123" /> +<hkern u1=""" u2="p" k="61" /> +<hkern u1=""" u2="o" k="123" /> +<hkern u1=""" u2="n" k="61" /> +<hkern u1=""" u2="m" k="61" /> +<hkern u1=""" u2="g" k="61" /> +<hkern u1=""" u2="e" k="123" /> +<hkern u1=""" u2="d" k="123" /> +<hkern u1=""" u2="c" k="123" /> +<hkern u1=""" u2="a" k="82" /> +<hkern u1=""" u2="Y" k="-20" /> +<hkern u1=""" u2="W" k="-41" /> +<hkern u1=""" u2="V" k="-41" /> +<hkern u1=""" u2="T" k="-41" /> +<hkern u1=""" u2="A" k="143" /> +<hkern u1="'" u2="Ÿ" k="-20" /> +<hkern u1="'" u2="œ" k="123" /> +<hkern u1="'" u2="ü" k="61" /> +<hkern u1="'" u2="û" k="61" /> +<hkern u1="'" u2="ú" k="61" /> +<hkern u1="'" u2="ù" k="61" /> +<hkern u1="'" u2="ø" k="123" /> +<hkern u1="'" u2="ö" k="123" /> +<hkern u1="'" u2="õ" k="123" /> +<hkern u1="'" u2="ô" k="123" /> +<hkern u1="'" u2="ó" k="123" /> +<hkern u1="'" u2="ò" k="123" /> +<hkern u1="'" u2="ë" k="123" /> +<hkern u1="'" u2="ê" k="123" /> +<hkern u1="'" u2="é" k="123" /> +<hkern u1="'" u2="è" k="123" /> +<hkern u1="'" u2="ç" k="123" /> +<hkern u1="'" u2="æ" k="82" /> +<hkern u1="'" u2="å" k="82" /> +<hkern u1="'" u2="ä" k="82" /> +<hkern u1="'" u2="ã" k="82" /> +<hkern u1="'" u2="â" k="82" /> +<hkern u1="'" u2="á" k="82" /> +<hkern u1="'" u2="à" k="123" /> +<hkern u1="'" u2="Ý" k="-20" /> +<hkern u1="'" u2="Å" k="143" /> +<hkern u1="'" u2="Ä" k="143" /> +<hkern u1="'" u2="Ã" k="143" /> +<hkern u1="'" u2="Â" k="143" /> +<hkern u1="'" u2="Á" k="143" /> +<hkern u1="'" u2="À" k="143" /> +<hkern u1="'" u2="u" k="61" /> +<hkern u1="'" u2="s" k="61" /> +<hkern u1="'" u2="r" k="61" /> +<hkern u1="'" u2="q" k="123" /> +<hkern u1="'" u2="p" k="61" /> +<hkern u1="'" u2="o" k="123" /> +<hkern u1="'" u2="n" k="61" /> +<hkern u1="'" u2="m" k="61" /> +<hkern u1="'" u2="g" k="61" /> +<hkern u1="'" u2="e" k="123" /> +<hkern u1="'" u2="d" k="123" /> +<hkern u1="'" u2="c" k="123" /> +<hkern u1="'" u2="a" k="82" /> +<hkern u1="'" u2="Y" k="-20" /> +<hkern u1="'" u2="W" k="-41" /> +<hkern u1="'" u2="V" k="-41" /> +<hkern u1="'" u2="T" k="-41" /> +<hkern u1="'" u2="A" k="143" /> +<hkern u1="(" u2="J" k="-184" /> +<hkern u1="," u2="Ÿ" k="123" /> +<hkern u1="," u2="Œ" k="102" /> +<hkern u1="," u2="Ý" k="123" /> +<hkern u1="," u2="Ü" k="41" /> +<hkern u1="," u2="Û" k="41" /> +<hkern u1="," u2="Ú" k="41" /> +<hkern u1="," u2="Ù" k="41" /> +<hkern u1="," u2="Ø" k="102" /> +<hkern u1="," u2="Ö" k="102" /> +<hkern u1="," u2="Õ" k="102" /> +<hkern u1="," u2="Ô" k="102" /> +<hkern u1="," u2="Ó" k="102" /> +<hkern u1="," u2="Ò" k="102" /> +<hkern u1="," u2="Ç" k="102" /> +<hkern u1="," u2="Y" k="123" /> +<hkern u1="," u2="W" k="123" /> +<hkern u1="," u2="V" k="123" /> +<hkern u1="," u2="U" k="41" /> +<hkern u1="," u2="T" k="143" /> +<hkern u1="," u2="Q" k="102" /> +<hkern u1="," u2="O" k="102" /> +<hkern u1="," u2="G" k="102" /> +<hkern u1="," u2="C" k="102" /> +<hkern u1="-" u2="T" k="82" /> +<hkern u1="." u2="Ÿ" k="123" /> +<hkern u1="." u2="Œ" k="102" /> +<hkern u1="." u2="Ý" k="123" /> +<hkern u1="." u2="Ü" k="41" /> +<hkern u1="." u2="Û" k="41" /> +<hkern u1="." u2="Ú" k="41" /> +<hkern u1="." u2="Ù" k="41" /> +<hkern u1="." u2="Ø" k="102" /> +<hkern u1="." u2="Ö" k="102" /> +<hkern u1="." u2="Õ" k="102" /> +<hkern u1="." u2="Ô" k="102" /> +<hkern u1="." u2="Ó" k="102" /> +<hkern u1="." u2="Ò" k="102" /> +<hkern u1="." u2="Ç" k="102" /> +<hkern u1="." u2="Y" k="123" /> +<hkern u1="." u2="W" k="123" /> +<hkern u1="." u2="V" k="123" /> +<hkern u1="." u2="U" k="41" /> +<hkern u1="." u2="T" k="143" /> +<hkern u1="." u2="Q" k="102" /> +<hkern u1="." u2="O" k="102" /> +<hkern u1="." u2="G" k="102" /> +<hkern u1="." u2="C" k="102" /> +<hkern u1="A" u2="”" k="143" /> +<hkern u1="A" u2="’" k="143" /> +<hkern u1="A" u2="Ÿ" k="123" /> +<hkern u1="A" u2="Œ" k="41" /> +<hkern u1="A" u2="Ý" k="123" /> +<hkern u1="A" u2="Ø" k="41" /> +<hkern u1="A" u2="Ö" k="41" /> +<hkern u1="A" u2="Õ" k="41" /> +<hkern u1="A" u2="Ô" k="41" /> +<hkern u1="A" u2="Ó" k="41" /> +<hkern u1="A" u2="Ò" k="41" /> +<hkern u1="A" u2="Ç" k="41" /> +<hkern u1="A" u2="Y" k="123" /> +<hkern u1="A" u2="W" k="82" /> +<hkern u1="A" u2="V" k="82" /> +<hkern u1="A" u2="T" k="143" /> +<hkern u1="A" u2="Q" k="41" /> +<hkern u1="A" u2="O" k="41" /> +<hkern u1="A" u2="J" k="-266" /> +<hkern u1="A" u2="G" k="41" /> +<hkern u1="A" u2="C" k="41" /> +<hkern u1="A" u2="'" k="143" /> +<hkern u1="A" u2=""" k="143" /> +<hkern u1="B" u2="„" k="82" /> +<hkern u1="B" u2="‚" k="82" /> +<hkern u1="B" u2="Ÿ" k="20" /> +<hkern u1="B" u2="Ý" k="20" /> +<hkern u1="B" u2="Å" k="41" /> +<hkern u1="B" u2="Ä" k="41" /> +<hkern u1="B" u2="Ã" k="41" /> +<hkern u1="B" u2="Â" k="41" /> +<hkern u1="B" u2="Á" k="41" /> +<hkern u1="B" u2="À" k="41" /> +<hkern u1="B" u2="Z" k="20" /> +<hkern u1="B" u2="Y" k="20" /> +<hkern u1="B" u2="X" k="41" /> +<hkern u1="B" u2="W" k="20" /> +<hkern u1="B" u2="V" k="20" /> +<hkern u1="B" u2="T" k="61" /> +<hkern u1="B" u2="A" k="41" /> +<hkern u1="B" u2="." k="82" /> +<hkern u1="B" u2="," k="82" /> +<hkern u1="C" u2="Œ" k="41" /> +<hkern u1="C" u2="Ø" k="41" /> +<hkern u1="C" u2="Ö" k="41" /> +<hkern u1="C" u2="Õ" k="41" /> +<hkern u1="C" u2="Ô" k="41" /> +<hkern u1="C" u2="Ó" k="41" /> +<hkern u1="C" u2="Ò" k="41" /> +<hkern u1="C" u2="Ç" k="41" /> +<hkern u1="C" u2="Q" k="41" /> +<hkern u1="C" u2="O" k="41" /> +<hkern u1="C" u2="G" k="41" /> +<hkern u1="C" u2="C" k="41" /> +<hkern u1="D" u2="„" k="82" /> +<hkern u1="D" u2="‚" k="82" /> +<hkern u1="D" u2="Ÿ" k="20" /> +<hkern u1="D" u2="Ý" k="20" /> +<hkern u1="D" u2="Å" k="41" /> +<hkern u1="D" u2="Ä" k="41" /> +<hkern u1="D" u2="Ã" k="41" /> +<hkern u1="D" u2="Â" k="41" /> +<hkern u1="D" u2="Á" k="41" /> +<hkern u1="D" u2="À" k="41" /> +<hkern u1="D" u2="Z" k="20" /> +<hkern u1="D" u2="Y" k="20" /> +<hkern u1="D" u2="X" k="41" /> +<hkern u1="D" u2="W" k="20" /> +<hkern u1="D" u2="V" k="20" /> +<hkern u1="D" u2="T" k="61" /> +<hkern u1="D" u2="A" k="41" /> +<hkern u1="D" u2="." k="82" /> +<hkern u1="D" u2="," k="82" /> +<hkern u1="E" u2="J" k="-123" /> +<hkern u1="F" u2="„" k="123" /> +<hkern u1="F" u2="‚" k="123" /> +<hkern u1="F" u2="Å" k="41" /> +<hkern u1="F" u2="Ä" k="41" /> +<hkern u1="F" u2="Ã" k="41" /> +<hkern u1="F" u2="Â" k="41" /> +<hkern u1="F" u2="Á" k="41" /> +<hkern u1="F" u2="À" k="41" /> +<hkern u1="F" u2="A" k="41" /> +<hkern u1="F" u2="?" k="-41" /> +<hkern u1="F" u2="." k="123" /> +<hkern u1="F" u2="," k="123" /> +<hkern u1="K" u2="Œ" k="41" /> +<hkern u1="K" u2="Ø" k="41" /> +<hkern u1="K" u2="Ö" k="41" /> +<hkern u1="K" u2="Õ" k="41" /> +<hkern u1="K" u2="Ô" k="41" /> +<hkern u1="K" u2="Ó" k="41" /> +<hkern u1="K" u2="Ò" k="41" /> +<hkern u1="K" u2="Ç" k="41" /> +<hkern u1="K" u2="Q" k="41" /> +<hkern u1="K" u2="O" k="41" /> +<hkern u1="K" u2="G" k="41" /> +<hkern u1="K" u2="C" k="41" /> +<hkern u1="L" u2="”" k="164" /> +<hkern u1="L" u2="’" k="164" /> +<hkern u1="L" u2="Ÿ" k="61" /> +<hkern u1="L" u2="Œ" k="41" /> +<hkern u1="L" u2="Ý" k="61" /> +<hkern u1="L" u2="Ü" k="20" /> +<hkern u1="L" u2="Û" k="20" /> +<hkern u1="L" u2="Ú" k="20" /> +<hkern u1="L" u2="Ù" k="20" /> +<hkern u1="L" u2="Ø" k="41" /> +<hkern u1="L" u2="Ö" k="41" /> +<hkern u1="L" u2="Õ" k="41" /> +<hkern u1="L" u2="Ô" k="41" /> +<hkern u1="L" u2="Ó" k="41" /> +<hkern u1="L" u2="Ò" k="41" /> +<hkern u1="L" u2="Ç" k="41" /> +<hkern u1="L" u2="Y" k="61" /> +<hkern u1="L" u2="W" k="41" /> +<hkern u1="L" u2="V" k="41" /> +<hkern u1="L" u2="U" k="20" /> +<hkern u1="L" u2="T" k="41" /> +<hkern u1="L" u2="Q" k="41" /> +<hkern u1="L" u2="O" k="41" /> +<hkern u1="L" u2="G" k="41" /> +<hkern u1="L" u2="C" k="41" /> +<hkern u1="L" u2="'" k="164" /> +<hkern u1="L" u2=""" k="164" /> +<hkern u1="O" u2="„" k="82" /> +<hkern u1="O" u2="‚" k="82" /> +<hkern u1="O" u2="Ÿ" k="20" /> +<hkern u1="O" u2="Ý" k="20" /> +<hkern u1="O" u2="Å" k="41" /> +<hkern u1="O" u2="Ä" k="41" /> +<hkern u1="O" u2="Ã" k="41" /> +<hkern u1="O" u2="Â" k="41" /> +<hkern u1="O" u2="Á" k="41" /> +<hkern u1="O" u2="À" k="41" /> +<hkern u1="O" u2="Z" k="20" /> +<hkern u1="O" u2="Y" k="20" /> +<hkern u1="O" u2="X" k="41" /> +<hkern u1="O" u2="W" k="20" /> +<hkern u1="O" u2="V" k="20" /> +<hkern u1="O" u2="T" k="61" /> +<hkern u1="O" u2="A" k="41" /> +<hkern u1="O" u2="." k="82" /> +<hkern u1="O" u2="," k="82" /> +<hkern u1="P" u2="„" k="266" /> +<hkern u1="P" u2="‚" k="266" /> +<hkern u1="P" u2="Å" k="102" /> +<hkern u1="P" u2="Ä" k="102" /> +<hkern u1="P" u2="Ã" k="102" /> +<hkern u1="P" u2="Â" k="102" /> +<hkern u1="P" u2="Á" k="102" /> +<hkern u1="P" u2="À" k="102" /> +<hkern u1="P" u2="Z" k="20" /> +<hkern u1="P" u2="X" k="41" /> +<hkern u1="P" u2="A" k="102" /> +<hkern u1="P" u2="." k="266" /> +<hkern u1="P" u2="," k="266" /> +<hkern u1="Q" u2="„" k="82" /> +<hkern u1="Q" u2="‚" k="82" /> +<hkern u1="Q" u2="Ÿ" k="20" /> +<hkern u1="Q" u2="Ý" k="20" /> +<hkern u1="Q" u2="Å" k="41" /> +<hkern u1="Q" u2="Ä" k="41" /> +<hkern u1="Q" u2="Ã" k="41" /> +<hkern u1="Q" u2="Â" k="41" /> +<hkern u1="Q" u2="Á" k="41" /> +<hkern u1="Q" u2="À" k="41" /> +<hkern u1="Q" u2="Z" k="20" /> +<hkern u1="Q" u2="Y" k="20" /> +<hkern u1="Q" u2="X" k="41" /> +<hkern u1="Q" u2="W" k="20" /> +<hkern u1="Q" u2="V" k="20" /> +<hkern u1="Q" u2="T" k="61" /> +<hkern u1="Q" u2="A" k="41" /> +<hkern u1="Q" u2="." k="82" /> +<hkern u1="Q" u2="," k="82" /> +<hkern u1="T" u2="„" k="123" /> +<hkern u1="T" u2="‚" k="123" /> +<hkern u1="T" u2="—" k="82" /> +<hkern u1="T" u2="–" k="82" /> +<hkern u1="T" u2="œ" k="143" /> +<hkern u1="T" u2="Œ" k="41" /> +<hkern u1="T" u2="ý" k="41" /> +<hkern u1="T" u2="ü" k="102" /> +<hkern u1="T" u2="û" k="102" /> +<hkern u1="T" u2="ú" k="102" /> +<hkern u1="T" u2="ù" k="102" /> +<hkern u1="T" u2="ø" k="143" /> +<hkern u1="T" u2="ö" k="143" /> +<hkern u1="T" u2="õ" k="143" /> +<hkern u1="T" u2="ô" k="143" /> +<hkern u1="T" u2="ó" k="143" /> +<hkern u1="T" u2="ò" k="143" /> +<hkern u1="T" u2="ë" k="143" /> +<hkern u1="T" u2="ê" k="143" /> +<hkern u1="T" u2="é" k="143" /> +<hkern u1="T" u2="è" k="143" /> +<hkern u1="T" u2="ç" k="143" /> +<hkern u1="T" u2="æ" k="164" /> +<hkern u1="T" u2="å" k="164" /> +<hkern u1="T" u2="ä" k="164" /> +<hkern u1="T" u2="ã" k="164" /> +<hkern u1="T" u2="â" k="164" /> +<hkern u1="T" u2="á" k="164" /> +<hkern u1="T" u2="à" k="143" /> +<hkern u1="T" u2="Ø" k="41" /> +<hkern u1="T" u2="Ö" k="41" /> +<hkern u1="T" u2="Õ" k="41" /> +<hkern u1="T" u2="Ô" k="41" /> +<hkern u1="T" u2="Ó" k="41" /> +<hkern u1="T" u2="Ò" k="41" /> +<hkern u1="T" u2="Ç" k="41" /> +<hkern u1="T" u2="Å" k="143" /> +<hkern u1="T" u2="Ä" k="143" /> +<hkern u1="T" u2="Ã" k="143" /> +<hkern u1="T" u2="Â" k="143" /> +<hkern u1="T" u2="Á" k="143" /> +<hkern u1="T" u2="À" k="143" /> +<hkern u1="T" u2="z" k="82" /> +<hkern u1="T" u2="y" k="41" /> +<hkern u1="T" u2="x" k="41" /> +<hkern u1="T" u2="w" k="41" /> +<hkern u1="T" u2="v" k="41" /> +<hkern u1="T" u2="u" k="102" /> +<hkern u1="T" u2="s" k="123" /> +<hkern u1="T" u2="r" k="102" /> +<hkern u1="T" u2="q" k="143" /> +<hkern u1="T" u2="p" k="102" /> +<hkern u1="T" u2="o" k="143" /> +<hkern u1="T" u2="n" k="102" /> +<hkern u1="T" u2="m" k="102" /> +<hkern u1="T" u2="g" k="143" /> +<hkern u1="T" u2="e" k="143" /> +<hkern u1="T" u2="d" k="143" /> +<hkern u1="T" u2="c" k="143" /> +<hkern u1="T" u2="a" k="164" /> +<hkern u1="T" u2="T" k="-41" /> +<hkern u1="T" u2="Q" k="41" /> +<hkern u1="T" u2="O" k="41" /> +<hkern u1="T" u2="G" k="41" /> +<hkern u1="T" u2="C" k="41" /> +<hkern u1="T" u2="A" k="143" /> +<hkern u1="T" u2="?" k="-41" /> +<hkern u1="T" u2="." k="123" /> +<hkern u1="T" u2="-" k="82" /> +<hkern u1="T" u2="," k="123" /> +<hkern u1="U" u2="„" k="41" /> +<hkern u1="U" u2="‚" k="41" /> +<hkern u1="U" u2="Å" k="20" /> +<hkern u1="U" u2="Ä" k="20" /> +<hkern u1="U" u2="Ã" k="20" /> +<hkern u1="U" u2="Â" k="20" /> +<hkern u1="U" u2="Á" k="20" /> +<hkern u1="U" u2="À" k="20" /> +<hkern u1="U" u2="A" k="20" /> +<hkern u1="U" u2="." k="41" /> +<hkern u1="U" u2="," k="41" /> +<hkern u1="V" u2="„" k="102" /> +<hkern u1="V" u2="‚" k="102" /> +<hkern u1="V" u2="œ" k="41" /> +<hkern u1="V" u2="Œ" k="20" /> +<hkern u1="V" u2="ü" k="20" /> +<hkern u1="V" u2="û" k="20" /> +<hkern u1="V" u2="ú" k="20" /> +<hkern u1="V" u2="ù" k="20" /> +<hkern u1="V" u2="ø" k="41" /> +<hkern u1="V" u2="ö" k="41" /> +<hkern u1="V" u2="õ" k="41" /> +<hkern u1="V" u2="ô" k="41" /> +<hkern u1="V" u2="ó" k="41" /> +<hkern u1="V" u2="ò" k="41" /> +<hkern u1="V" u2="ë" k="41" /> +<hkern u1="V" u2="ê" k="41" /> +<hkern u1="V" u2="é" k="41" /> +<hkern u1="V" u2="è" k="41" /> +<hkern u1="V" u2="ç" k="41" /> +<hkern u1="V" u2="æ" k="41" /> +<hkern u1="V" u2="å" k="41" /> +<hkern u1="V" u2="ä" k="41" /> +<hkern u1="V" u2="ã" k="41" /> +<hkern u1="V" u2="â" k="41" /> +<hkern u1="V" u2="á" k="41" /> +<hkern u1="V" u2="à" k="41" /> +<hkern u1="V" u2="Ø" k="20" /> +<hkern u1="V" u2="Ö" k="20" /> +<hkern u1="V" u2="Õ" k="20" /> +<hkern u1="V" u2="Ô" k="20" /> +<hkern u1="V" u2="Ó" k="20" /> +<hkern u1="V" u2="Ò" k="20" /> +<hkern u1="V" u2="Ç" k="20" /> +<hkern u1="V" u2="Å" k="82" /> +<hkern u1="V" u2="Ä" k="82" /> +<hkern u1="V" u2="Ã" k="82" /> +<hkern u1="V" u2="Â" k="82" /> +<hkern u1="V" u2="Á" k="82" /> +<hkern u1="V" u2="À" k="82" /> +<hkern u1="V" u2="u" k="20" /> +<hkern u1="V" u2="s" k="20" /> +<hkern u1="V" u2="r" k="20" /> +<hkern u1="V" u2="q" k="41" /> +<hkern u1="V" u2="p" k="20" /> +<hkern u1="V" u2="o" k="41" /> +<hkern u1="V" u2="n" k="20" /> +<hkern u1="V" u2="m" k="20" /> +<hkern u1="V" u2="g" k="20" /> +<hkern u1="V" u2="e" k="41" /> +<hkern u1="V" u2="d" k="41" /> +<hkern u1="V" u2="c" k="41" /> +<hkern u1="V" u2="a" k="41" /> +<hkern u1="V" u2="Q" k="20" /> +<hkern u1="V" u2="O" k="20" /> +<hkern u1="V" u2="G" k="20" /> +<hkern u1="V" u2="C" k="20" /> +<hkern u1="V" u2="A" k="82" /> +<hkern u1="V" u2="?" k="-41" /> +<hkern u1="V" u2="." k="102" /> +<hkern u1="V" u2="," k="102" /> +<hkern u1="W" u2="„" k="102" /> +<hkern u1="W" u2="‚" k="102" /> +<hkern u1="W" u2="œ" k="41" /> +<hkern u1="W" u2="Œ" k="20" /> +<hkern u1="W" u2="ü" k="20" /> +<hkern u1="W" u2="û" k="20" /> +<hkern u1="W" u2="ú" k="20" /> +<hkern u1="W" u2="ù" k="20" /> +<hkern u1="W" u2="ø" k="41" /> +<hkern u1="W" u2="ö" k="41" /> +<hkern u1="W" u2="õ" k="41" /> +<hkern u1="W" u2="ô" k="41" /> +<hkern u1="W" u2="ó" k="41" /> +<hkern u1="W" u2="ò" k="41" /> +<hkern u1="W" u2="ë" k="41" /> +<hkern u1="W" u2="ê" k="41" /> +<hkern u1="W" u2="é" k="41" /> +<hkern u1="W" u2="è" k="41" /> +<hkern u1="W" u2="ç" k="41" /> +<hkern u1="W" u2="æ" k="41" /> +<hkern u1="W" u2="å" k="41" /> +<hkern u1="W" u2="ä" k="41" /> +<hkern u1="W" u2="ã" k="41" /> +<hkern u1="W" u2="â" k="41" /> +<hkern u1="W" u2="á" k="41" /> +<hkern u1="W" u2="à" k="41" /> +<hkern u1="W" u2="Ø" k="20" /> +<hkern u1="W" u2="Ö" k="20" /> +<hkern u1="W" u2="Õ" k="20" /> +<hkern u1="W" u2="Ô" k="20" /> +<hkern u1="W" u2="Ó" k="20" /> +<hkern u1="W" u2="Ò" k="20" /> +<hkern u1="W" u2="Ç" k="20" /> +<hkern u1="W" u2="Å" k="82" /> +<hkern u1="W" u2="Ä" k="82" /> +<hkern u1="W" u2="Ã" k="82" /> +<hkern u1="W" u2="Â" k="82" /> +<hkern u1="W" u2="Á" k="82" /> +<hkern u1="W" u2="À" k="82" /> +<hkern u1="W" u2="u" k="20" /> +<hkern u1="W" u2="s" k="20" /> +<hkern u1="W" u2="r" k="20" /> +<hkern u1="W" u2="q" k="41" /> +<hkern u1="W" u2="p" k="20" /> +<hkern u1="W" u2="o" k="41" /> +<hkern u1="W" u2="n" k="20" /> +<hkern u1="W" u2="m" k="20" /> +<hkern u1="W" u2="g" k="20" /> +<hkern u1="W" u2="e" k="41" /> +<hkern u1="W" u2="d" k="41" /> +<hkern u1="W" u2="c" k="41" /> +<hkern u1="W" u2="a" k="41" /> +<hkern u1="W" u2="Q" k="20" /> +<hkern u1="W" u2="O" k="20" /> +<hkern u1="W" u2="G" k="20" /> +<hkern u1="W" u2="C" k="20" /> +<hkern u1="W" u2="A" k="82" /> +<hkern u1="W" u2="?" k="-41" /> +<hkern u1="W" u2="." k="102" /> +<hkern u1="W" u2="," k="102" /> +<hkern u1="X" u2="Œ" k="41" /> +<hkern u1="X" u2="Ø" k="41" /> +<hkern u1="X" u2="Ö" k="41" /> +<hkern u1="X" u2="Õ" k="41" /> +<hkern u1="X" u2="Ô" k="41" /> +<hkern u1="X" u2="Ó" k="41" /> +<hkern u1="X" u2="Ò" k="41" /> +<hkern u1="X" u2="Ç" k="41" /> +<hkern u1="X" u2="Q" k="41" /> +<hkern u1="X" u2="O" k="41" /> +<hkern u1="X" u2="G" k="41" /> +<hkern u1="X" u2="C" k="41" /> +<hkern u1="Y" u2="„" k="123" /> +<hkern u1="Y" u2="‚" k="123" /> +<hkern u1="Y" u2="œ" k="102" /> +<hkern u1="Y" u2="Œ" k="41" /> +<hkern u1="Y" u2="ü" k="61" /> +<hkern u1="Y" u2="û" k="61" /> +<hkern u1="Y" u2="ú" k="61" /> +<hkern u1="Y" u2="ù" k="61" /> +<hkern u1="Y" u2="ø" k="102" /> +<hkern u1="Y" u2="ö" k="102" /> +<hkern u1="Y" u2="õ" k="102" /> +<hkern u1="Y" u2="ô" k="102" /> +<hkern u1="Y" u2="ó" k="102" /> +<hkern u1="Y" u2="ò" k="102" /> +<hkern u1="Y" u2="ë" k="102" /> +<hkern u1="Y" u2="ê" k="102" /> +<hkern u1="Y" u2="é" k="102" /> +<hkern u1="Y" u2="è" k="102" /> +<hkern u1="Y" u2="ç" k="102" /> +<hkern u1="Y" u2="æ" k="102" /> +<hkern u1="Y" u2="å" k="102" /> +<hkern u1="Y" u2="ä" k="102" /> +<hkern u1="Y" u2="ã" k="102" /> +<hkern u1="Y" u2="â" k="102" /> +<hkern u1="Y" u2="á" k="102" /> +<hkern u1="Y" u2="à" k="102" /> +<hkern u1="Y" u2="Ø" k="41" /> +<hkern u1="Y" u2="Ö" k="41" /> +<hkern u1="Y" u2="Õ" k="41" /> +<hkern u1="Y" u2="Ô" k="41" /> +<hkern u1="Y" u2="Ó" k="41" /> +<hkern u1="Y" u2="Ò" k="41" /> +<hkern u1="Y" u2="Ç" k="41" /> +<hkern u1="Y" u2="Å" k="123" /> +<hkern u1="Y" u2="Ä" k="123" /> +<hkern u1="Y" u2="Ã" k="123" /> +<hkern u1="Y" u2="Â" k="123" /> +<hkern u1="Y" u2="Á" k="123" /> +<hkern u1="Y" u2="À" k="123" /> +<hkern u1="Y" u2="z" k="41" /> +<hkern u1="Y" u2="u" k="61" /> +<hkern u1="Y" u2="s" k="82" /> +<hkern u1="Y" u2="r" k="61" /> +<hkern u1="Y" u2="q" k="102" /> +<hkern u1="Y" u2="p" k="61" /> +<hkern u1="Y" u2="o" k="102" /> +<hkern u1="Y" u2="n" k="61" /> +<hkern u1="Y" u2="m" k="61" /> +<hkern u1="Y" u2="g" k="41" /> +<hkern u1="Y" u2="e" k="102" /> +<hkern u1="Y" u2="d" k="102" /> +<hkern u1="Y" u2="c" k="102" /> +<hkern u1="Y" u2="a" k="102" /> +<hkern u1="Y" u2="Q" k="41" /> +<hkern u1="Y" u2="O" k="41" /> +<hkern u1="Y" u2="G" k="41" /> +<hkern u1="Y" u2="C" k="41" /> +<hkern u1="Y" u2="A" k="123" /> +<hkern u1="Y" u2="?" k="-41" /> +<hkern u1="Y" u2="." k="123" /> +<hkern u1="Y" u2="," k="123" /> +<hkern u1="Z" u2="Œ" k="20" /> +<hkern u1="Z" u2="Ø" k="20" /> +<hkern u1="Z" u2="Ö" k="20" /> +<hkern u1="Z" u2="Õ" k="20" /> +<hkern u1="Z" u2="Ô" k="20" /> +<hkern u1="Z" u2="Ó" k="20" /> +<hkern u1="Z" u2="Ò" k="20" /> +<hkern u1="Z" u2="Ç" k="20" /> +<hkern u1="Z" u2="Q" k="20" /> +<hkern u1="Z" u2="O" k="20" /> +<hkern u1="Z" u2="G" k="20" /> +<hkern u1="Z" u2="C" k="20" /> +<hkern u1="[" u2="J" k="-184" /> +<hkern u1="a" u2="”" k="20" /> +<hkern u1="a" u2="’" k="20" /> +<hkern u1="a" u2="'" k="20" /> +<hkern u1="a" u2=""" k="20" /> +<hkern u1="b" u2="”" k="20" /> +<hkern u1="b" u2="’" k="20" /> +<hkern u1="b" u2="ý" k="41" /> +<hkern u1="b" u2="z" k="20" /> +<hkern u1="b" u2="y" k="41" /> +<hkern u1="b" u2="x" k="41" /> +<hkern u1="b" u2="w" k="41" /> +<hkern u1="b" u2="v" k="41" /> +<hkern u1="b" u2="'" k="20" /> +<hkern u1="b" u2=""" k="20" /> +<hkern u1="c" u2="”" k="-41" /> +<hkern u1="c" u2="’" k="-41" /> +<hkern u1="c" u2="'" k="-41" /> +<hkern u1="c" u2=""" k="-41" /> +<hkern u1="e" u2="”" k="20" /> +<hkern u1="e" u2="’" k="20" /> +<hkern u1="e" u2="ý" k="41" /> +<hkern u1="e" u2="z" k="20" /> +<hkern u1="e" u2="y" k="41" /> +<hkern u1="e" u2="x" k="41" /> +<hkern u1="e" u2="w" k="41" /> +<hkern u1="e" u2="v" k="41" /> +<hkern u1="e" u2="'" k="20" /> +<hkern u1="e" u2=""" k="20" /> +<hkern u1="f" u2="”" k="-123" /> +<hkern u1="f" u2="’" k="-123" /> +<hkern u1="f" u2="'" k="-123" /> +<hkern u1="f" u2=""" k="-123" /> +<hkern u1="h" u2="”" k="20" /> +<hkern u1="h" u2="’" k="20" /> +<hkern u1="h" u2="'" k="20" /> +<hkern u1="h" u2=""" k="20" /> +<hkern u1="k" u2="œ" k="41" /> +<hkern u1="k" u2="ø" k="41" /> +<hkern u1="k" u2="ö" k="41" /> +<hkern u1="k" u2="õ" k="41" /> +<hkern u1="k" u2="ô" k="41" /> +<hkern u1="k" u2="ó" k="41" /> +<hkern u1="k" u2="ò" k="41" /> +<hkern u1="k" u2="ë" k="41" /> +<hkern u1="k" u2="ê" k="41" /> +<hkern u1="k" u2="é" k="41" /> +<hkern u1="k" u2="è" k="41" /> +<hkern u1="k" u2="ç" k="41" /> +<hkern u1="k" u2="à" k="41" /> +<hkern u1="k" u2="q" k="41" /> +<hkern u1="k" u2="o" k="41" /> +<hkern u1="k" u2="e" k="41" /> +<hkern u1="k" u2="d" k="41" /> +<hkern u1="k" u2="c" k="41" /> +<hkern u1="m" u2="”" k="20" /> +<hkern u1="m" u2="’" k="20" /> +<hkern u1="m" u2="'" k="20" /> +<hkern u1="m" u2=""" k="20" /> +<hkern u1="n" u2="”" k="20" /> +<hkern u1="n" u2="’" k="20" /> +<hkern u1="n" u2="'" k="20" /> +<hkern u1="n" u2=""" k="20" /> +<hkern u1="o" u2="”" k="20" /> +<hkern u1="o" u2="’" k="20" /> +<hkern u1="o" u2="ý" k="41" /> +<hkern u1="o" u2="z" k="20" /> +<hkern u1="o" u2="y" k="41" /> +<hkern u1="o" u2="x" k="41" /> +<hkern u1="o" u2="w" k="41" /> +<hkern u1="o" u2="v" k="41" /> +<hkern u1="o" u2="'" k="20" /> +<hkern u1="o" u2=""" k="20" /> +<hkern u1="p" u2="”" k="20" /> +<hkern u1="p" u2="’" k="20" /> +<hkern u1="p" u2="ý" k="41" /> +<hkern u1="p" u2="z" k="20" /> +<hkern u1="p" u2="y" k="41" /> +<hkern u1="p" u2="x" k="41" /> +<hkern u1="p" u2="w" k="41" /> +<hkern u1="p" u2="v" k="41" /> +<hkern u1="p" u2="'" k="20" /> +<hkern u1="p" u2=""" k="20" /> +<hkern u1="r" u2="”" k="-82" /> +<hkern u1="r" u2="’" k="-82" /> +<hkern u1="r" u2="œ" k="41" /> +<hkern u1="r" u2="ø" k="41" /> +<hkern u1="r" u2="ö" k="41" /> +<hkern u1="r" u2="õ" k="41" /> +<hkern u1="r" u2="ô" k="41" /> +<hkern u1="r" u2="ó" k="41" /> +<hkern u1="r" u2="ò" k="41" /> +<hkern u1="r" u2="ë" k="41" /> +<hkern u1="r" u2="ê" k="41" /> +<hkern u1="r" u2="é" k="41" /> +<hkern u1="r" u2="è" k="41" /> +<hkern u1="r" u2="ç" k="41" /> +<hkern u1="r" u2="æ" k="41" /> +<hkern u1="r" u2="å" k="41" /> +<hkern u1="r" u2="ä" k="41" /> +<hkern u1="r" u2="ã" k="41" /> +<hkern u1="r" u2="â" k="41" /> +<hkern u1="r" u2="á" k="41" /> +<hkern u1="r" u2="à" k="41" /> +<hkern u1="r" u2="q" k="41" /> +<hkern u1="r" u2="o" k="41" /> +<hkern u1="r" u2="g" k="20" /> +<hkern u1="r" u2="e" k="41" /> +<hkern u1="r" u2="d" k="41" /> +<hkern u1="r" u2="c" k="41" /> +<hkern u1="r" u2="a" k="41" /> +<hkern u1="r" u2="'" k="-82" /> +<hkern u1="r" u2=""" k="-82" /> +<hkern u1="t" u2="”" k="-41" /> +<hkern u1="t" u2="’" k="-41" /> +<hkern u1="t" u2="'" k="-41" /> +<hkern u1="t" u2=""" k="-41" /> +<hkern u1="v" u2="„" k="82" /> +<hkern u1="v" u2="”" k="-82" /> +<hkern u1="v" u2="‚" k="82" /> +<hkern u1="v" u2="’" k="-82" /> +<hkern u1="v" u2="?" k="-41" /> +<hkern u1="v" u2="." k="82" /> +<hkern u1="v" u2="," k="82" /> +<hkern u1="v" u2="'" k="-82" /> +<hkern u1="v" u2=""" k="-82" /> +<hkern u1="w" u2="„" k="82" /> +<hkern u1="w" u2="”" k="-82" /> +<hkern u1="w" u2="‚" k="82" /> +<hkern u1="w" u2="’" k="-82" /> +<hkern u1="w" u2="?" k="-41" /> +<hkern u1="w" u2="." k="82" /> +<hkern u1="w" u2="," k="82" /> +<hkern u1="w" u2="'" k="-82" /> +<hkern u1="w" u2=""" k="-82" /> +<hkern u1="x" u2="œ" k="41" /> +<hkern u1="x" u2="ø" k="41" /> +<hkern u1="x" u2="ö" k="41" /> +<hkern u1="x" u2="õ" k="41" /> +<hkern u1="x" u2="ô" k="41" /> +<hkern u1="x" u2="ó" k="41" /> +<hkern u1="x" u2="ò" k="41" /> +<hkern u1="x" u2="ë" k="41" /> +<hkern u1="x" u2="ê" k="41" /> +<hkern u1="x" u2="é" k="41" /> +<hkern u1="x" u2="è" k="41" /> +<hkern u1="x" u2="ç" k="41" /> +<hkern u1="x" u2="à" k="41" /> +<hkern u1="x" u2="q" k="41" /> +<hkern u1="x" u2="o" k="41" /> +<hkern u1="x" u2="e" k="41" /> +<hkern u1="x" u2="d" k="41" /> +<hkern u1="x" u2="c" k="41" /> +<hkern u1="y" u2="„" k="82" /> +<hkern u1="y" u2="”" k="-82" /> +<hkern u1="y" u2="‚" k="82" /> +<hkern u1="y" u2="’" k="-82" /> +<hkern u1="y" u2="?" k="-41" /> +<hkern u1="y" u2="." k="82" /> +<hkern u1="y" u2="," k="82" /> +<hkern u1="y" u2="'" k="-82" /> +<hkern u1="y" u2=""" k="-82" /> +<hkern u1="{" u2="J" k="-184" /> +<hkern u1="À" u2="”" k="143" /> +<hkern u1="À" u2="’" k="143" /> +<hkern u1="À" u2="Ÿ" k="123" /> +<hkern u1="À" u2="Œ" k="41" /> +<hkern u1="À" u2="Ý" k="123" /> +<hkern u1="À" u2="Ø" k="41" /> +<hkern u1="À" u2="Ö" k="41" /> +<hkern u1="À" u2="Õ" k="41" /> +<hkern u1="À" u2="Ô" k="41" /> +<hkern u1="À" u2="Ó" k="41" /> +<hkern u1="À" u2="Ò" k="41" /> +<hkern u1="À" u2="Ç" k="41" /> +<hkern u1="À" u2="Y" k="123" /> +<hkern u1="À" u2="W" k="82" /> +<hkern u1="À" u2="V" k="82" /> +<hkern u1="À" u2="T" k="143" /> +<hkern u1="À" u2="Q" k="41" /> +<hkern u1="À" u2="O" k="41" /> +<hkern u1="À" u2="J" k="-266" /> +<hkern u1="À" u2="G" k="41" /> +<hkern u1="À" u2="C" k="41" /> +<hkern u1="À" u2="'" k="143" /> +<hkern u1="À" u2=""" k="143" /> +<hkern u1="Á" u2="”" k="143" /> +<hkern u1="Á" u2="’" k="143" /> +<hkern u1="Á" u2="Ÿ" k="123" /> +<hkern u1="Á" u2="Œ" k="41" /> +<hkern u1="Á" u2="Ý" k="123" /> +<hkern u1="Á" u2="Ø" k="41" /> +<hkern u1="Á" u2="Ö" k="41" /> +<hkern u1="Á" u2="Õ" k="41" /> +<hkern u1="Á" u2="Ô" k="41" /> +<hkern u1="Á" u2="Ó" k="41" /> +<hkern u1="Á" u2="Ò" k="41" /> +<hkern u1="Á" u2="Ç" k="41" /> +<hkern u1="Á" u2="Y" k="123" /> +<hkern u1="Á" u2="W" k="82" /> +<hkern u1="Á" u2="V" k="82" /> +<hkern u1="Á" u2="T" k="143" /> +<hkern u1="Á" u2="Q" k="41" /> +<hkern u1="Á" u2="O" k="41" /> +<hkern u1="Á" u2="J" k="-266" /> +<hkern u1="Á" u2="G" k="41" /> +<hkern u1="Á" u2="C" k="41" /> +<hkern u1="Á" u2="'" k="143" /> +<hkern u1="Á" u2=""" k="143" /> +<hkern u1="Â" u2="”" k="143" /> +<hkern u1="Â" u2="’" k="143" /> +<hkern u1="Â" u2="Ÿ" k="123" /> +<hkern u1="Â" u2="Œ" k="41" /> +<hkern u1="Â" u2="Ý" k="123" /> +<hkern u1="Â" u2="Ø" k="41" /> +<hkern u1="Â" u2="Ö" k="41" /> +<hkern u1="Â" u2="Õ" k="41" /> +<hkern u1="Â" u2="Ô" k="41" /> +<hkern u1="Â" u2="Ó" k="41" /> +<hkern u1="Â" u2="Ò" k="41" /> +<hkern u1="Â" u2="Ç" k="41" /> +<hkern u1="Â" u2="Y" k="123" /> +<hkern u1="Â" u2="W" k="82" /> +<hkern u1="Â" u2="V" k="82" /> +<hkern u1="Â" u2="T" k="143" /> +<hkern u1="Â" u2="Q" k="41" /> +<hkern u1="Â" u2="O" k="41" /> +<hkern u1="Â" u2="J" k="-266" /> +<hkern u1="Â" u2="G" k="41" /> +<hkern u1="Â" u2="C" k="41" /> +<hkern u1="Â" u2="'" k="143" /> +<hkern u1="Â" u2=""" k="143" /> +<hkern u1="Ã" u2="”" k="143" /> +<hkern u1="Ã" u2="’" k="143" /> +<hkern u1="Ã" u2="Ÿ" k="123" /> +<hkern u1="Ã" u2="Œ" k="41" /> +<hkern u1="Ã" u2="Ý" k="123" /> +<hkern u1="Ã" u2="Ø" k="41" /> +<hkern u1="Ã" u2="Ö" k="41" /> +<hkern u1="Ã" u2="Õ" k="41" /> +<hkern u1="Ã" u2="Ô" k="41" /> +<hkern u1="Ã" u2="Ó" k="41" /> +<hkern u1="Ã" u2="Ò" k="41" /> +<hkern u1="Ã" u2="Ç" k="41" /> +<hkern u1="Ã" u2="Y" k="123" /> +<hkern u1="Ã" u2="W" k="82" /> +<hkern u1="Ã" u2="V" k="82" /> +<hkern u1="Ã" u2="T" k="143" /> +<hkern u1="Ã" u2="Q" k="41" /> +<hkern u1="Ã" u2="O" k="41" /> +<hkern u1="Ã" u2="J" k="-266" /> +<hkern u1="Ã" u2="G" k="41" /> +<hkern u1="Ã" u2="C" k="41" /> +<hkern u1="Ã" u2="'" k="143" /> +<hkern u1="Ã" u2=""" k="143" /> +<hkern u1="Ä" u2="”" k="143" /> +<hkern u1="Ä" u2="’" k="143" /> +<hkern u1="Ä" u2="Ÿ" k="123" /> +<hkern u1="Ä" u2="Œ" k="41" /> +<hkern u1="Ä" u2="Ý" k="123" /> +<hkern u1="Ä" u2="Ø" k="41" /> +<hkern u1="Ä" u2="Ö" k="41" /> +<hkern u1="Ä" u2="Õ" k="41" /> +<hkern u1="Ä" u2="Ô" k="41" /> +<hkern u1="Ä" u2="Ó" k="41" /> +<hkern u1="Ä" u2="Ò" k="41" /> +<hkern u1="Ä" u2="Ç" k="41" /> +<hkern u1="Ä" u2="Y" k="123" /> +<hkern u1="Ä" u2="W" k="82" /> +<hkern u1="Ä" u2="V" k="82" /> +<hkern u1="Ä" u2="T" k="143" /> +<hkern u1="Ä" u2="Q" k="41" /> +<hkern u1="Ä" u2="O" k="41" /> +<hkern u1="Ä" u2="J" k="-266" /> +<hkern u1="Ä" u2="G" k="41" /> +<hkern u1="Ä" u2="C" k="41" /> +<hkern u1="Ä" u2="'" k="143" /> +<hkern u1="Ä" u2=""" k="143" /> +<hkern u1="Å" u2="”" k="143" /> +<hkern u1="Å" u2="’" k="143" /> +<hkern u1="Å" u2="Ÿ" k="123" /> +<hkern u1="Å" u2="Œ" k="41" /> +<hkern u1="Å" u2="Ý" k="123" /> +<hkern u1="Å" u2="Ø" k="41" /> +<hkern u1="Å" u2="Ö" k="41" /> +<hkern u1="Å" u2="Õ" k="41" /> +<hkern u1="Å" u2="Ô" k="41" /> +<hkern u1="Å" u2="Ó" k="41" /> +<hkern u1="Å" u2="Ò" k="41" /> +<hkern u1="Å" u2="Ç" k="41" /> +<hkern u1="Å" u2="Y" k="123" /> +<hkern u1="Å" u2="W" k="82" /> +<hkern u1="Å" u2="V" k="82" /> +<hkern u1="Å" u2="T" k="143" /> +<hkern u1="Å" u2="Q" k="41" /> +<hkern u1="Å" u2="O" k="41" /> +<hkern u1="Å" u2="J" k="-266" /> +<hkern u1="Å" u2="G" k="41" /> +<hkern u1="Å" u2="C" k="41" /> +<hkern u1="Å" u2="'" k="143" /> +<hkern u1="Å" u2=""" k="143" /> +<hkern u1="Æ" u2="J" k="-123" /> +<hkern u1="Ç" u2="Œ" k="41" /> +<hkern u1="Ç" u2="Ø" k="41" /> +<hkern u1="Ç" u2="Ö" k="41" /> +<hkern u1="Ç" u2="Õ" k="41" /> +<hkern u1="Ç" u2="Ô" k="41" /> +<hkern u1="Ç" u2="Ó" k="41" /> +<hkern u1="Ç" u2="Ò" k="41" /> +<hkern u1="Ç" u2="Ç" k="41" /> +<hkern u1="Ç" u2="Q" k="41" /> +<hkern u1="Ç" u2="O" k="41" /> +<hkern u1="Ç" u2="G" k="41" /> +<hkern u1="Ç" u2="C" k="41" /> +<hkern u1="È" u2="J" k="-123" /> +<hkern u1="É" u2="J" k="-123" /> +<hkern u1="Ê" u2="J" k="-123" /> +<hkern u1="Ë" u2="J" k="-123" /> +<hkern u1="Ð" u2="„" k="82" /> +<hkern u1="Ð" u2="‚" k="82" /> +<hkern u1="Ð" u2="Ÿ" k="20" /> +<hkern u1="Ð" u2="Ý" k="20" /> +<hkern u1="Ð" u2="Å" k="41" /> +<hkern u1="Ð" u2="Ä" k="41" /> +<hkern u1="Ð" u2="Ã" k="41" /> +<hkern u1="Ð" u2="Â" k="41" /> +<hkern u1="Ð" u2="Á" k="41" /> +<hkern u1="Ð" u2="À" k="41" /> +<hkern u1="Ð" u2="Z" k="20" /> +<hkern u1="Ð" u2="Y" k="20" /> +<hkern u1="Ð" u2="X" k="41" /> +<hkern u1="Ð" u2="W" k="20" /> +<hkern u1="Ð" u2="V" k="20" /> +<hkern u1="Ð" u2="T" k="61" /> +<hkern u1="Ð" u2="A" k="41" /> +<hkern u1="Ð" u2="." k="82" /> +<hkern u1="Ð" u2="," k="82" /> +<hkern u1="Ò" u2="„" k="82" /> +<hkern u1="Ò" u2="‚" k="82" /> +<hkern u1="Ò" u2="Ÿ" k="20" /> +<hkern u1="Ò" u2="Ý" k="20" /> +<hkern u1="Ò" u2="Å" k="41" /> +<hkern u1="Ò" u2="Ä" k="41" /> +<hkern u1="Ò" u2="Ã" k="41" /> +<hkern u1="Ò" u2="Â" k="41" /> +<hkern u1="Ò" u2="Á" k="41" /> +<hkern u1="Ò" u2="À" k="41" /> +<hkern u1="Ò" u2="Z" k="20" /> +<hkern u1="Ò" u2="Y" k="20" /> +<hkern u1="Ò" u2="X" k="41" /> +<hkern u1="Ò" u2="W" k="20" /> +<hkern u1="Ò" u2="V" k="20" /> +<hkern u1="Ò" u2="T" k="61" /> +<hkern u1="Ò" u2="A" k="41" /> +<hkern u1="Ò" u2="." k="82" /> +<hkern u1="Ò" u2="," k="82" /> +<hkern u1="Ó" u2="„" k="82" /> +<hkern u1="Ó" u2="‚" k="82" /> +<hkern u1="Ó" u2="Ÿ" k="20" /> +<hkern u1="Ó" u2="Ý" k="20" /> +<hkern u1="Ó" u2="Å" k="41" /> +<hkern u1="Ó" u2="Ä" k="41" /> +<hkern u1="Ó" u2="Ã" k="41" /> +<hkern u1="Ó" u2="Â" k="41" /> +<hkern u1="Ó" u2="Á" k="41" /> +<hkern u1="Ó" u2="À" k="41" /> +<hkern u1="Ó" u2="Z" k="20" /> +<hkern u1="Ó" u2="Y" k="20" /> +<hkern u1="Ó" u2="X" k="41" /> +<hkern u1="Ó" u2="W" k="20" /> +<hkern u1="Ó" u2="V" k="20" /> +<hkern u1="Ó" u2="T" k="61" /> +<hkern u1="Ó" u2="A" k="41" /> +<hkern u1="Ó" u2="." k="82" /> +<hkern u1="Ó" u2="," k="82" /> +<hkern u1="Ô" u2="„" k="82" /> +<hkern u1="Ô" u2="‚" k="82" /> +<hkern u1="Ô" u2="Ÿ" k="20" /> +<hkern u1="Ô" u2="Ý" k="20" /> +<hkern u1="Ô" u2="Å" k="41" /> +<hkern u1="Ô" u2="Ä" k="41" /> +<hkern u1="Ô" u2="Ã" k="41" /> +<hkern u1="Ô" u2="Â" k="41" /> +<hkern u1="Ô" u2="Á" k="41" /> +<hkern u1="Ô" u2="À" k="41" /> +<hkern u1="Ô" u2="Z" k="20" /> +<hkern u1="Ô" u2="Y" k="20" /> +<hkern u1="Ô" u2="X" k="41" /> +<hkern u1="Ô" u2="W" k="20" /> +<hkern u1="Ô" u2="V" k="20" /> +<hkern u1="Ô" u2="T" k="61" /> +<hkern u1="Ô" u2="A" k="41" /> +<hkern u1="Ô" u2="." k="82" /> +<hkern u1="Ô" u2="," k="82" /> +<hkern u1="Õ" u2="„" k="82" /> +<hkern u1="Õ" u2="‚" k="82" /> +<hkern u1="Õ" u2="Ÿ" k="20" /> +<hkern u1="Õ" u2="Ý" k="20" /> +<hkern u1="Õ" u2="Å" k="41" /> +<hkern u1="Õ" u2="Ä" k="41" /> +<hkern u1="Õ" u2="Ã" k="41" /> +<hkern u1="Õ" u2="Â" k="41" /> +<hkern u1="Õ" u2="Á" k="41" /> +<hkern u1="Õ" u2="À" k="41" /> +<hkern u1="Õ" u2="Z" k="20" /> +<hkern u1="Õ" u2="Y" k="20" /> +<hkern u1="Õ" u2="X" k="41" /> +<hkern u1="Õ" u2="W" k="20" /> +<hkern u1="Õ" u2="V" k="20" /> +<hkern u1="Õ" u2="T" k="61" /> +<hkern u1="Õ" u2="A" k="41" /> +<hkern u1="Õ" u2="." k="82" /> +<hkern u1="Õ" u2="," k="82" /> +<hkern u1="Ö" u2="„" k="82" /> +<hkern u1="Ö" u2="‚" k="82" /> +<hkern u1="Ö" u2="Ÿ" k="20" /> +<hkern u1="Ö" u2="Ý" k="20" /> +<hkern u1="Ö" u2="Å" k="41" /> +<hkern u1="Ö" u2="Ä" k="41" /> +<hkern u1="Ö" u2="Ã" k="41" /> +<hkern u1="Ö" u2="Â" k="41" /> +<hkern u1="Ö" u2="Á" k="41" /> +<hkern u1="Ö" u2="À" k="41" /> +<hkern u1="Ö" u2="Z" k="20" /> +<hkern u1="Ö" u2="Y" k="20" /> +<hkern u1="Ö" u2="X" k="41" /> +<hkern u1="Ö" u2="W" k="20" /> +<hkern u1="Ö" u2="V" k="20" /> +<hkern u1="Ö" u2="T" k="61" /> +<hkern u1="Ö" u2="A" k="41" /> +<hkern u1="Ö" u2="." k="82" /> +<hkern u1="Ö" u2="," k="82" /> +<hkern u1="Ø" u2="„" k="82" /> +<hkern u1="Ø" u2="‚" k="82" /> +<hkern u1="Ø" u2="Ÿ" k="20" /> +<hkern u1="Ø" u2="Ý" k="20" /> +<hkern u1="Ø" u2="Å" k="41" /> +<hkern u1="Ø" u2="Ä" k="41" /> +<hkern u1="Ø" u2="Ã" k="41" /> +<hkern u1="Ø" u2="Â" k="41" /> +<hkern u1="Ø" u2="Á" k="41" /> +<hkern u1="Ø" u2="À" k="41" /> +<hkern u1="Ø" u2="Z" k="20" /> +<hkern u1="Ø" u2="Y" k="20" /> +<hkern u1="Ø" u2="X" k="41" /> +<hkern u1="Ø" u2="W" k="20" /> +<hkern u1="Ø" u2="V" k="20" /> +<hkern u1="Ø" u2="T" k="61" /> +<hkern u1="Ø" u2="A" k="41" /> +<hkern u1="Ø" u2="." k="82" /> +<hkern u1="Ø" u2="," k="82" /> +<hkern u1="Ù" u2="„" k="41" /> +<hkern u1="Ù" u2="‚" k="41" /> +<hkern u1="Ù" u2="Å" k="20" /> +<hkern u1="Ù" u2="Ä" k="20" /> +<hkern u1="Ù" u2="Ã" k="20" /> +<hkern u1="Ù" u2="Â" k="20" /> +<hkern u1="Ù" u2="Á" k="20" /> +<hkern u1="Ù" u2="À" k="20" /> +<hkern u1="Ù" u2="A" k="20" /> +<hkern u1="Ù" u2="." k="41" /> +<hkern u1="Ù" u2="," k="41" /> +<hkern u1="Ú" u2="„" k="41" /> +<hkern u1="Ú" u2="‚" k="41" /> +<hkern u1="Ú" u2="Å" k="20" /> +<hkern u1="Ú" u2="Ä" k="20" /> +<hkern u1="Ú" u2="Ã" k="20" /> +<hkern u1="Ú" u2="Â" k="20" /> +<hkern u1="Ú" u2="Á" k="20" /> +<hkern u1="Ú" u2="À" k="20" /> +<hkern u1="Ú" u2="A" k="20" /> +<hkern u1="Ú" u2="." k="41" /> +<hkern u1="Ú" u2="," k="41" /> +<hkern u1="Û" u2="„" k="41" /> +<hkern u1="Û" u2="‚" k="41" /> +<hkern u1="Û" u2="Å" k="20" /> +<hkern u1="Û" u2="Ä" k="20" /> +<hkern u1="Û" u2="Ã" k="20" /> +<hkern u1="Û" u2="Â" k="20" /> +<hkern u1="Û" u2="Á" k="20" /> +<hkern u1="Û" u2="À" k="20" /> +<hkern u1="Û" u2="A" k="20" /> +<hkern u1="Û" u2="." k="41" /> +<hkern u1="Û" u2="," k="41" /> +<hkern u1="Ü" u2="„" k="41" /> +<hkern u1="Ü" u2="‚" k="41" /> +<hkern u1="Ü" u2="Å" k="20" /> +<hkern u1="Ü" u2="Ä" k="20" /> +<hkern u1="Ü" u2="Ã" k="20" /> +<hkern u1="Ü" u2="Â" k="20" /> +<hkern u1="Ü" u2="Á" k="20" /> +<hkern u1="Ü" u2="À" k="20" /> +<hkern u1="Ü" u2="A" k="20" /> +<hkern u1="Ü" u2="." k="41" /> +<hkern u1="Ü" u2="," k="41" /> +<hkern u1="Ý" u2="„" k="123" /> +<hkern u1="Ý" u2="‚" k="123" /> +<hkern u1="Ý" u2="œ" k="102" /> +<hkern u1="Ý" u2="Œ" k="41" /> +<hkern u1="Ý" u2="ü" k="61" /> +<hkern u1="Ý" u2="û" k="61" /> +<hkern u1="Ý" u2="ú" k="61" /> +<hkern u1="Ý" u2="ù" k="61" /> +<hkern u1="Ý" u2="ø" k="102" /> +<hkern u1="Ý" u2="ö" k="102" /> +<hkern u1="Ý" u2="õ" k="102" /> +<hkern u1="Ý" u2="ô" k="102" /> +<hkern u1="Ý" u2="ó" k="102" /> +<hkern u1="Ý" u2="ò" k="102" /> +<hkern u1="Ý" u2="ë" k="102" /> +<hkern u1="Ý" u2="ê" k="102" /> +<hkern u1="Ý" u2="é" k="102" /> +<hkern u1="Ý" u2="è" k="102" /> +<hkern u1="Ý" u2="ç" k="102" /> +<hkern u1="Ý" u2="æ" k="102" /> +<hkern u1="Ý" u2="å" k="102" /> +<hkern u1="Ý" u2="ä" k="102" /> +<hkern u1="Ý" u2="ã" k="102" /> +<hkern u1="Ý" u2="â" k="102" /> +<hkern u1="Ý" u2="á" k="102" /> +<hkern u1="Ý" u2="à" k="102" /> +<hkern u1="Ý" u2="Ø" k="41" /> +<hkern u1="Ý" u2="Ö" k="41" /> +<hkern u1="Ý" u2="Õ" k="41" /> +<hkern u1="Ý" u2="Ô" k="41" /> +<hkern u1="Ý" u2="Ó" k="41" /> +<hkern u1="Ý" u2="Ò" k="41" /> +<hkern u1="Ý" u2="Ç" k="41" /> +<hkern u1="Ý" u2="Å" k="123" /> +<hkern u1="Ý" u2="Ä" k="123" /> +<hkern u1="Ý" u2="Ã" k="123" /> +<hkern u1="Ý" u2="Â" k="123" /> +<hkern u1="Ý" u2="Á" k="123" /> +<hkern u1="Ý" u2="À" k="123" /> +<hkern u1="Ý" u2="z" k="41" /> +<hkern u1="Ý" u2="u" k="61" /> +<hkern u1="Ý" u2="s" k="82" /> +<hkern u1="Ý" u2="r" k="61" /> +<hkern u1="Ý" u2="q" k="102" /> +<hkern u1="Ý" u2="p" k="61" /> +<hkern u1="Ý" u2="o" k="102" /> +<hkern u1="Ý" u2="n" k="61" /> +<hkern u1="Ý" u2="m" k="61" /> +<hkern u1="Ý" u2="g" k="41" /> +<hkern u1="Ý" u2="e" k="102" /> +<hkern u1="Ý" u2="d" k="102" /> +<hkern u1="Ý" u2="c" k="102" /> +<hkern u1="Ý" u2="a" k="102" /> +<hkern u1="Ý" u2="Q" k="41" /> +<hkern u1="Ý" u2="O" k="41" /> +<hkern u1="Ý" u2="G" k="41" /> +<hkern u1="Ý" u2="C" k="41" /> +<hkern u1="Ý" u2="A" k="123" /> +<hkern u1="Ý" u2="?" k="-41" /> +<hkern u1="Ý" u2="." k="123" /> +<hkern u1="Ý" u2="," k="123" /> +<hkern u1="Þ" u2="„" k="266" /> +<hkern u1="Þ" u2="‚" k="266" /> +<hkern u1="Þ" u2="Å" k="102" /> +<hkern u1="Þ" u2="Ä" k="102" /> +<hkern u1="Þ" u2="Ã" k="102" /> +<hkern u1="Þ" u2="Â" k="102" /> +<hkern u1="Þ" u2="Á" k="102" /> +<hkern u1="Þ" u2="À" k="102" /> +<hkern u1="Þ" u2="Z" k="20" /> +<hkern u1="Þ" u2="X" k="41" /> +<hkern u1="Þ" u2="A" k="102" /> +<hkern u1="Þ" u2="." k="266" /> +<hkern u1="Þ" u2="," k="266" /> +<hkern u1="à" u2="”" k="20" /> +<hkern u1="à" u2="’" k="20" /> +<hkern u1="à" u2="'" k="20" /> +<hkern u1="à" u2=""" k="20" /> +<hkern u1="á" u2="”" k="20" /> +<hkern u1="á" u2="’" k="20" /> +<hkern u1="á" u2="'" k="20" /> +<hkern u1="á" u2=""" k="20" /> +<hkern u1="â" u2="”" k="20" /> +<hkern u1="â" u2="’" k="20" /> +<hkern u1="â" u2="'" k="20" /> +<hkern u1="â" u2=""" k="20" /> +<hkern u1="ã" u2="”" k="20" /> +<hkern u1="ã" u2="’" k="20" /> +<hkern u1="ã" u2="'" k="20" /> +<hkern u1="ã" u2=""" k="20" /> +<hkern u1="ä" u2="”" k="20" /> +<hkern u1="ä" u2="’" k="20" /> +<hkern u1="ä" u2="'" k="20" /> +<hkern u1="ä" u2=""" k="20" /> +<hkern u1="å" u2="”" k="20" /> +<hkern u1="å" u2="’" k="20" /> +<hkern u1="å" u2="'" k="20" /> +<hkern u1="å" u2=""" k="20" /> +<hkern u1="è" u2="”" k="20" /> +<hkern u1="è" u2="’" k="20" /> +<hkern u1="è" u2="ý" k="41" /> +<hkern u1="è" u2="z" k="20" /> +<hkern u1="è" u2="y" k="41" /> +<hkern u1="è" u2="x" k="41" /> +<hkern u1="è" u2="w" k="41" /> +<hkern u1="è" u2="v" k="41" /> +<hkern u1="è" u2="'" k="20" /> +<hkern u1="è" u2=""" k="20" /> +<hkern u1="é" u2="”" k="20" /> +<hkern u1="é" u2="’" k="20" /> +<hkern u1="é" u2="ý" k="41" /> +<hkern u1="é" u2="z" k="20" /> +<hkern u1="é" u2="y" k="41" /> +<hkern u1="é" u2="x" k="41" /> +<hkern u1="é" u2="w" k="41" /> +<hkern u1="é" u2="v" k="41" /> +<hkern u1="é" u2="'" k="20" /> +<hkern u1="é" u2=""" k="20" /> +<hkern u1="ê" u2="”" k="20" /> +<hkern u1="ê" u2="’" k="20" /> +<hkern u1="ê" u2="ý" k="41" /> +<hkern u1="ê" u2="z" k="20" /> +<hkern u1="ê" u2="y" k="41" /> +<hkern u1="ê" u2="x" k="41" /> +<hkern u1="ê" u2="w" k="41" /> +<hkern u1="ê" u2="v" k="41" /> +<hkern u1="ê" u2="'" k="20" /> +<hkern u1="ê" u2=""" k="20" /> +<hkern u1="ë" u2="”" k="20" /> +<hkern u1="ë" u2="’" k="20" /> +<hkern u1="ë" u2="ý" k="41" /> +<hkern u1="ë" u2="z" k="20" /> +<hkern u1="ë" u2="y" k="41" /> +<hkern u1="ë" u2="x" k="41" /> +<hkern u1="ë" u2="w" k="41" /> +<hkern u1="ë" u2="v" k="41" /> +<hkern u1="ë" u2="'" k="20" /> +<hkern u1="ë" u2=""" k="20" /> +<hkern u1="ð" u2="”" k="20" /> +<hkern u1="ð" u2="’" k="20" /> +<hkern u1="ð" u2="ý" k="41" /> +<hkern u1="ð" u2="z" k="20" /> +<hkern u1="ð" u2="y" k="41" /> +<hkern u1="ð" u2="x" k="41" /> +<hkern u1="ð" u2="w" k="41" /> +<hkern u1="ð" u2="v" k="41" /> +<hkern u1="ð" u2="'" k="20" /> +<hkern u1="ð" u2=""" k="20" /> +<hkern u1="ò" u2="”" k="20" /> +<hkern u1="ò" u2="’" k="20" /> +<hkern u1="ò" u2="ý" k="41" /> +<hkern u1="ò" u2="z" k="20" /> +<hkern u1="ò" u2="y" k="41" /> +<hkern u1="ò" u2="x" k="41" /> +<hkern u1="ò" u2="w" k="41" /> +<hkern u1="ò" u2="v" k="41" /> +<hkern u1="ò" u2="'" k="20" /> +<hkern u1="ò" u2=""" k="20" /> +<hkern u1="ó" u2="”" k="20" /> +<hkern u1="ó" u2="’" k="20" /> +<hkern u1="ó" u2="ý" k="41" /> +<hkern u1="ó" u2="z" k="20" /> +<hkern u1="ó" u2="y" k="41" /> +<hkern u1="ó" u2="x" k="41" /> +<hkern u1="ó" u2="w" k="41" /> +<hkern u1="ó" u2="v" k="41" /> +<hkern u1="ó" u2="'" k="20" /> +<hkern u1="ó" u2=""" k="20" /> +<hkern u1="ô" u2="”" k="20" /> +<hkern u1="ô" u2="’" k="20" /> +<hkern u1="ô" u2="ý" k="41" /> +<hkern u1="ô" u2="z" k="20" /> +<hkern u1="ô" u2="y" k="41" /> +<hkern u1="ô" u2="x" k="41" /> +<hkern u1="ô" u2="w" k="41" /> +<hkern u1="ô" u2="v" k="41" /> +<hkern u1="ô" u2="'" k="20" /> +<hkern u1="ô" u2=""" k="20" /> +<hkern u1="ö" u2="”" k="41" /> +<hkern u1="ö" u2="’" k="41" /> +<hkern u1="ö" u2="'" k="41" /> +<hkern u1="ö" u2=""" k="41" /> +<hkern u1="ø" u2="”" k="20" /> +<hkern u1="ø" u2="’" k="20" /> +<hkern u1="ø" u2="ý" k="41" /> +<hkern u1="ø" u2="z" k="20" /> +<hkern u1="ø" u2="y" k="41" /> +<hkern u1="ø" u2="x" k="41" /> +<hkern u1="ø" u2="w" k="41" /> +<hkern u1="ø" u2="v" k="41" /> +<hkern u1="ø" u2="'" k="20" /> +<hkern u1="ø" u2=""" k="20" /> +<hkern u1="ý" u2="„" k="82" /> +<hkern u1="ý" u2="”" k="-82" /> +<hkern u1="ý" u2="‚" k="82" /> +<hkern u1="ý" u2="’" k="-82" /> +<hkern u1="ý" u2="?" k="-41" /> +<hkern u1="ý" u2="." k="82" /> +<hkern u1="ý" u2="," k="82" /> +<hkern u1="ý" u2="'" k="-82" /> +<hkern u1="ý" u2=""" k="-82" /> +<hkern u1="þ" u2="”" k="20" /> +<hkern u1="þ" u2="’" k="20" /> +<hkern u1="þ" u2="ý" k="41" /> +<hkern u1="þ" u2="z" k="20" /> +<hkern u1="þ" u2="y" k="41" /> +<hkern u1="þ" u2="x" k="41" /> +<hkern u1="þ" u2="w" k="41" /> +<hkern u1="þ" u2="v" k="41" /> +<hkern u1="þ" u2="'" k="20" /> +<hkern u1="þ" u2=""" k="20" /> +<hkern u1="ÿ" u2="„" k="82" /> +<hkern u1="ÿ" u2="”" k="-82" /> +<hkern u1="ÿ" u2="‚" k="82" /> +<hkern u1="ÿ" u2="’" k="-82" /> +<hkern u1="ÿ" u2="?" k="-41" /> +<hkern u1="ÿ" u2="." k="82" /> +<hkern u1="ÿ" u2="," k="82" /> +<hkern u1="ÿ" u2="'" k="-82" /> +<hkern u1="ÿ" u2=""" k="-82" /> +<hkern u1="Œ" u2="J" k="-123" /> +<hkern u1="Ÿ" u2="„" k="123" /> +<hkern u1="Ÿ" u2="‚" k="123" /> +<hkern u1="Ÿ" u2="œ" k="102" /> +<hkern u1="Ÿ" u2="Œ" k="41" /> +<hkern u1="Ÿ" u2="ü" k="61" /> +<hkern u1="Ÿ" u2="û" k="61" /> +<hkern u1="Ÿ" u2="ú" k="61" /> +<hkern u1="Ÿ" u2="ù" k="61" /> +<hkern u1="Ÿ" u2="ø" k="102" /> +<hkern u1="Ÿ" u2="ö" k="102" /> +<hkern u1="Ÿ" u2="õ" k="102" /> +<hkern u1="Ÿ" u2="ô" k="102" /> +<hkern u1="Ÿ" u2="ó" k="102" /> +<hkern u1="Ÿ" u2="ò" k="102" /> +<hkern u1="Ÿ" u2="ë" k="102" /> +<hkern u1="Ÿ" u2="ê" k="102" /> +<hkern u1="Ÿ" u2="é" k="102" /> +<hkern u1="Ÿ" u2="è" k="102" /> +<hkern u1="Ÿ" u2="ç" k="102" /> +<hkern u1="Ÿ" u2="æ" k="102" /> +<hkern u1="Ÿ" u2="å" k="102" /> +<hkern u1="Ÿ" u2="ä" k="102" /> +<hkern u1="Ÿ" u2="ã" k="102" /> +<hkern u1="Ÿ" u2="â" k="102" /> +<hkern u1="Ÿ" u2="á" k="102" /> +<hkern u1="Ÿ" u2="à" k="102" /> +<hkern u1="Ÿ" u2="Ø" k="41" /> +<hkern u1="Ÿ" u2="Ö" k="41" /> +<hkern u1="Ÿ" u2="Õ" k="41" /> +<hkern u1="Ÿ" u2="Ô" k="41" /> +<hkern u1="Ÿ" u2="Ó" k="41" /> +<hkern u1="Ÿ" u2="Ò" k="41" /> +<hkern u1="Ÿ" u2="Ç" k="41" /> +<hkern u1="Ÿ" u2="Å" k="123" /> +<hkern u1="Ÿ" u2="Ä" k="123" /> +<hkern u1="Ÿ" u2="Ã" k="123" /> +<hkern u1="Ÿ" u2="Â" k="123" /> +<hkern u1="Ÿ" u2="Á" k="123" /> +<hkern u1="Ÿ" u2="À" k="123" /> +<hkern u1="Ÿ" u2="z" k="41" /> +<hkern u1="Ÿ" u2="u" k="61" /> +<hkern u1="Ÿ" u2="s" k="82" /> +<hkern u1="Ÿ" u2="r" k="61" /> +<hkern u1="Ÿ" u2="q" k="102" /> +<hkern u1="Ÿ" u2="p" k="61" /> +<hkern u1="Ÿ" u2="o" k="102" /> +<hkern u1="Ÿ" u2="n" k="61" /> +<hkern u1="Ÿ" u2="m" k="61" /> +<hkern u1="Ÿ" u2="g" k="41" /> +<hkern u1="Ÿ" u2="e" k="102" /> +<hkern u1="Ÿ" u2="d" k="102" /> +<hkern u1="Ÿ" u2="c" k="102" /> +<hkern u1="Ÿ" u2="a" k="102" /> +<hkern u1="Ÿ" u2="Q" k="41" /> +<hkern u1="Ÿ" u2="O" k="41" /> +<hkern u1="Ÿ" u2="G" k="41" /> +<hkern u1="Ÿ" u2="C" k="41" /> +<hkern u1="Ÿ" u2="A" k="123" /> +<hkern u1="Ÿ" u2="?" k="-41" /> +<hkern u1="Ÿ" u2="." k="123" /> +<hkern u1="Ÿ" u2="," k="123" /> +<hkern u1="–" u2="T" k="82" /> +<hkern u1="—" u2="T" k="82" /> +<hkern u1="‘" u2="Ÿ" k="-20" /> +<hkern u1="‘" u2="œ" k="123" /> +<hkern u1="‘" u2="ü" k="61" /> +<hkern u1="‘" u2="û" k="61" /> +<hkern u1="‘" u2="ú" k="61" /> +<hkern u1="‘" u2="ù" k="61" /> +<hkern u1="‘" u2="ø" k="123" /> +<hkern u1="‘" u2="ö" k="123" /> +<hkern u1="‘" u2="õ" k="123" /> +<hkern u1="‘" u2="ô" k="123" /> +<hkern u1="‘" u2="ó" k="123" /> +<hkern u1="‘" u2="ò" k="123" /> +<hkern u1="‘" u2="ë" k="123" /> +<hkern u1="‘" u2="ê" k="123" /> +<hkern u1="‘" u2="é" k="123" /> +<hkern u1="‘" u2="è" k="123" /> +<hkern u1="‘" u2="ç" k="123" /> +<hkern u1="‘" u2="æ" k="82" /> +<hkern u1="‘" u2="å" k="82" /> +<hkern u1="‘" u2="ä" k="82" /> +<hkern u1="‘" u2="ã" k="82" /> +<hkern u1="‘" u2="â" k="82" /> +<hkern u1="‘" u2="á" k="82" /> +<hkern u1="‘" u2="à" k="123" /> +<hkern u1="‘" u2="Ý" k="-20" /> +<hkern u1="‘" u2="Å" k="143" /> +<hkern u1="‘" u2="Ä" k="143" /> +<hkern u1="‘" u2="Ã" k="143" /> +<hkern u1="‘" u2="Â" k="143" /> +<hkern u1="‘" u2="Á" k="143" /> +<hkern u1="‘" u2="À" k="143" /> +<hkern u1="‘" u2="u" k="61" /> +<hkern u1="‘" u2="s" k="61" /> +<hkern u1="‘" u2="r" k="61" /> +<hkern u1="‘" u2="q" k="123" /> +<hkern u1="‘" u2="p" k="61" /> +<hkern u1="‘" u2="o" k="123" /> +<hkern u1="‘" u2="n" k="61" /> +<hkern u1="‘" u2="m" k="61" /> +<hkern u1="‘" u2="g" k="61" /> +<hkern u1="‘" u2="e" k="123" /> +<hkern u1="‘" u2="d" k="123" /> +<hkern u1="‘" u2="c" k="123" /> +<hkern u1="‘" u2="a" k="82" /> +<hkern u1="‘" u2="Y" k="-20" /> +<hkern u1="‘" u2="W" k="-41" /> +<hkern u1="‘" u2="V" k="-41" /> +<hkern u1="‘" u2="T" k="-41" /> +<hkern u1="‘" u2="A" k="143" /> +<hkern u1="’" u2="Ÿ" k="-20" /> +<hkern u1="’" u2="œ" k="123" /> +<hkern u1="’" u2="ü" k="61" /> +<hkern u1="’" u2="û" k="61" /> +<hkern u1="’" u2="ú" k="61" /> +<hkern u1="’" u2="ù" k="61" /> +<hkern u1="’" u2="ø" k="123" /> +<hkern u1="’" u2="ö" k="123" /> +<hkern u1="’" u2="õ" k="123" /> +<hkern u1="’" u2="ô" k="123" /> +<hkern u1="’" u2="ó" k="123" /> +<hkern u1="’" u2="ò" k="123" /> +<hkern u1="’" u2="ë" k="123" /> +<hkern u1="’" u2="ê" k="123" /> +<hkern u1="’" u2="é" k="123" /> +<hkern u1="’" u2="è" k="123" /> +<hkern u1="’" u2="ç" k="123" /> +<hkern u1="’" u2="æ" k="82" /> +<hkern u1="’" u2="å" k="82" /> +<hkern u1="’" u2="ä" k="82" /> +<hkern u1="’" u2="ã" k="82" /> +<hkern u1="’" u2="â" k="82" /> +<hkern u1="’" u2="á" k="82" /> +<hkern u1="’" u2="à" k="123" /> +<hkern u1="’" u2="Ý" k="-20" /> +<hkern u1="’" u2="Å" k="143" /> +<hkern u1="’" u2="Ä" k="143" /> +<hkern u1="’" u2="Ã" k="143" /> +<hkern u1="’" u2="Â" k="143" /> +<hkern u1="’" u2="Á" k="143" /> +<hkern u1="’" u2="À" k="143" /> +<hkern u1="’" u2="u" k="61" /> +<hkern u1="’" u2="s" k="61" /> +<hkern u1="’" u2="r" k="61" /> +<hkern u1="’" u2="q" k="123" /> +<hkern u1="’" u2="p" k="61" /> +<hkern u1="’" u2="o" k="123" /> +<hkern u1="’" u2="n" k="61" /> +<hkern u1="’" u2="m" k="61" /> +<hkern u1="’" u2="g" k="61" /> +<hkern u1="’" u2="e" k="123" /> +<hkern u1="’" u2="d" k="123" /> +<hkern u1="’" u2="c" k="123" /> +<hkern u1="’" u2="a" k="82" /> +<hkern u1="’" u2="Y" k="-20" /> +<hkern u1="’" u2="W" k="-41" /> +<hkern u1="’" u2="V" k="-41" /> +<hkern u1="’" u2="T" k="-41" /> +<hkern u1="’" u2="A" k="143" /> +<hkern u1="‚" u2="Ÿ" k="123" /> +<hkern u1="‚" u2="Œ" k="102" /> +<hkern u1="‚" u2="Ý" k="123" /> +<hkern u1="‚" u2="Ü" k="41" /> +<hkern u1="‚" u2="Û" k="41" /> +<hkern u1="‚" u2="Ú" k="41" /> +<hkern u1="‚" u2="Ù" k="41" /> +<hkern u1="‚" u2="Ø" k="102" /> +<hkern u1="‚" u2="Ö" k="102" /> +<hkern u1="‚" u2="Õ" k="102" /> +<hkern u1="‚" u2="Ô" k="102" /> +<hkern u1="‚" u2="Ó" k="102" /> +<hkern u1="‚" u2="Ò" k="102" /> +<hkern u1="‚" u2="Ç" k="102" /> +<hkern u1="‚" u2="Y" k="123" /> +<hkern u1="‚" u2="W" k="123" /> +<hkern u1="‚" u2="V" k="123" /> +<hkern u1="‚" u2="U" k="41" /> +<hkern u1="‚" u2="T" k="143" /> +<hkern u1="‚" u2="Q" k="102" /> +<hkern u1="‚" u2="O" k="102" /> +<hkern u1="‚" u2="G" k="102" /> +<hkern u1="‚" u2="C" k="102" /> +<hkern u1="“" u2="Ÿ" k="-20" /> +<hkern u1="“" u2="œ" k="123" /> +<hkern u1="“" u2="ü" k="61" /> +<hkern u1="“" u2="û" k="61" /> +<hkern u1="“" u2="ú" k="61" /> +<hkern u1="“" u2="ù" k="61" /> +<hkern u1="“" u2="ø" k="123" /> +<hkern u1="“" u2="ö" k="123" /> +<hkern u1="“" u2="õ" k="123" /> +<hkern u1="“" u2="ô" k="123" /> +<hkern u1="“" u2="ó" k="123" /> +<hkern u1="“" u2="ò" k="123" /> +<hkern u1="“" u2="ë" k="123" /> +<hkern u1="“" u2="ê" k="123" /> +<hkern u1="“" u2="é" k="123" /> +<hkern u1="“" u2="è" k="123" /> +<hkern u1="“" u2="ç" k="123" /> +<hkern u1="“" u2="æ" k="82" /> +<hkern u1="“" u2="å" k="82" /> +<hkern u1="“" u2="ä" k="82" /> +<hkern u1="“" u2="ã" k="82" /> +<hkern u1="“" u2="â" k="82" /> +<hkern u1="“" u2="á" k="82" /> +<hkern u1="“" u2="à" k="123" /> +<hkern u1="“" u2="Ý" k="-20" /> +<hkern u1="“" u2="Å" k="143" /> +<hkern u1="“" u2="Ä" k="143" /> +<hkern u1="“" u2="Ã" k="143" /> +<hkern u1="“" u2="Â" k="143" /> +<hkern u1="“" u2="Á" k="143" /> +<hkern u1="“" u2="À" k="143" /> +<hkern u1="“" u2="u" k="61" /> +<hkern u1="“" u2="s" k="61" /> +<hkern u1="“" u2="r" k="61" /> +<hkern u1="“" u2="q" k="123" /> +<hkern u1="“" u2="p" k="61" /> +<hkern u1="“" u2="o" k="123" /> +<hkern u1="“" u2="n" k="61" /> +<hkern u1="“" u2="m" k="61" /> +<hkern u1="“" u2="g" k="61" /> +<hkern u1="“" u2="e" k="123" /> +<hkern u1="“" u2="d" k="123" /> +<hkern u1="“" u2="c" k="123" /> +<hkern u1="“" u2="a" k="82" /> +<hkern u1="“" u2="Y" k="-20" /> +<hkern u1="“" u2="W" k="-41" /> +<hkern u1="“" u2="V" k="-41" /> +<hkern u1="“" u2="T" k="-41" /> +<hkern u1="“" u2="A" k="143" /> +<hkern u1="„" u2="Ÿ" k="123" /> +<hkern u1="„" u2="Œ" k="102" /> +<hkern u1="„" u2="Ý" k="123" /> +<hkern u1="„" u2="Ü" k="41" /> +<hkern u1="„" u2="Û" k="41" /> +<hkern u1="„" u2="Ú" k="41" /> +<hkern u1="„" u2="Ù" k="41" /> +<hkern u1="„" u2="Ø" k="102" /> +<hkern u1="„" u2="Ö" k="102" /> +<hkern u1="„" u2="Õ" k="102" /> +<hkern u1="„" u2="Ô" k="102" /> +<hkern u1="„" u2="Ó" k="102" /> +<hkern u1="„" u2="Ò" k="102" /> +<hkern u1="„" u2="Ç" k="102" /> +<hkern u1="„" u2="Y" k="123" /> +<hkern u1="„" u2="W" k="123" /> +<hkern u1="„" u2="V" k="123" /> +<hkern u1="„" u2="U" k="41" /> +<hkern u1="„" u2="T" k="143" /> +<hkern u1="„" u2="Q" k="102" /> +<hkern u1="„" u2="O" k="102" /> +<hkern u1="„" u2="G" k="102" /> +<hkern u1="„" u2="C" k="102" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.ttf b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.ttf new file mode 100755 index 0000000..d2d6318 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.ttf Binary files differdiff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.woff b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.woff new file mode 100755 index 0000000..d4dfca4 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/fonts/OpenSans-SemiboldItalic-webfont.woff Binary files differdiff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/global.html b/js/scripting-lang/docs/baba-yaga/0.0.1/global.html new file mode 100644 index 0000000..4b02d15 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/global.html @@ -0,0 +1,4787 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>Global - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">Global</h1> + + + + + + + +<section> + +<header> + + <h2> + + </h2> + + +</header> + +<article> + <div class="container-overview"> + + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</dl> + + + + + </div> + + + + + + + + + + + + + <h3 class="subsection-title">Members</h3> + + + +<div class="section-members"> +<h4 class="name" id="callStackTracker"><span class="type-signature">(constant) </span>callStackTracker<span class="type-signature"></span></h4> + + + + +<div class="description"> + Tracks function calls to help identify infinite recursion +and deep call stacks that cause stack overflow errors. This is essential +for debugging the interpreter's recursive evaluation of AST nodes. + +The tracker maintains a stack of function calls with timestamps and context +information, counts function calls to identify hot paths, and detects +potential infinite recursion by monitoring stack depth. + +This tool is particularly important for the combinator-based architecture +where function calls are the primary execution mechanism, and +nested expressions can lead to deep call stacks. The tracker helps identify +when the combinator translation creates unexpectedly deep call chains, +enabling optimization of the function composition and application patterns. + +The tracker provides detailed statistics about function call patterns, +helping developers understand the execution characteristics of their code +and identify potential performance bottlenecks in the combinator evaluation. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2758">line 2758</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + +</div> + + + + + + <h3 class="subsection-title">Methods</h3> + + + +<div class="section-method"> + + + + <h4 class="name" id="debugError"><span class="type-signature"></span>debugError<span class="signature">(message, error<span class="signature-attributes">opt</span>)</span><span class="type-signature"></span></h4> + + + + + +<div class="description"> + Logs debug error messages to console when DEBUG environment variable is set. +Provides verbose error output during development while remaining silent in production. + +Debug functions are gated by the DEBUG environment variable, allowing for +verbose output during development and silent operation in production. This +approach makes it easy to trace execution and diagnose issues without +cluttering normal output. + +This function is particularly useful for debugging parsing and evaluation errors, +providing detailed context about where and why errors occur in the language +execution pipeline. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2728">line 2728</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + <h5>Parameters:</h5> + + +<table class="params"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + <th>Attributes</th> + + + + <th>Default</th> + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>message</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + <td class="attributes"> + + + + + + </td> + + + + <td class="default"> + + </td> + + + <td class="description last"> + Debug error message to log + + </td> + </tr> + + + + <tr> + + <td class="name"><code>error</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Error</code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + + + </td> + + + + <td class="default"> + + null + + </td> + + + <td class="description last"> + Optional error object to log + + </td> + </tr> + + + </tbody> +</table> + + + + + + + + + + + + + + + + +</div> + + +<div class="section-method"> + + + + <h4 class="name" id="debugLog"><span class="type-signature"></span>debugLog<span class="signature">(message, data<span class="signature-attributes">opt</span>)</span><span class="type-signature"></span></h4> + + + + + +<div class="description"> + Logs debug messages to console when DEBUG environment variable is set. +Provides verbose output during development while remaining silent in production. + +Debug functions are gated by the DEBUG environment variable, allowing for +verbose output during development and silent operation in production. This +approach makes it easy to trace execution and diagnose issues without +cluttering normal output. + +This function is essential for debugging the combinator-based architecture, +allowing developers to trace how operators are translated to function calls +and how the interpreter executes these calls through the standard library. + +The function is designed to be lightweight and safe to call frequently, +making it suitable for tracing execution flow through nested +expressions and function applications. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2701">line 2701</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + <h5>Parameters:</h5> + + +<table class="params"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + <th>Attributes</th> + + + + <th>Default</th> + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>message</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + <td class="attributes"> + + + + + + </td> + + + + <td class="default"> + + </td> + + + <td class="description last"> + Debug message to log + + </td> + </tr> + + + + <tr> + + <td class="name"><code>data</code></td> + + + <td class="type"> + + +<span class="param-type"><code>*</code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + + + </td> + + + + <td class="default"> + + null + + </td> + + + <td class="description last"> + Optional data to log with the message + + </td> + </tr> + + + </tbody> +</table> + + + + + + + + + + + + + + + + +</div> + + +<div class="section-method"> + + + + <h4 class="name" id="executeFile"><span class="type-signature">(async) </span>executeFile<span class="signature">(filePath)</span><span class="type-signature"> → {Promise.<*>}</span></h4> + + + + + +<div class="description"> + Main entry point for file execution. Handles the complete language +pipeline: file reading, lexical analysis, parsing, and interpretation. + +This function orchestrates the entire language execution process: +1. Reads the source file using cross-platform I/O utilities +2. Tokenizes the source code using the lexer +3. Parses tokens into an AST using the combinator-based parser +4. Interprets the AST using the combinator-based interpreter + +The function provides comprehensive error handling and debug output at each +stage for transparency and troubleshooting. It also manages the call stack +tracker to provide execution statistics and detect potential issues. + +Supports both synchronous and asynchronous execution, with proper +error handling and process exit codes. This function demonstrates the +complete combinator-based architecture in action, showing how source code +is transformed through each stage of the language pipeline. + +The function enforces the .txt file extension requirement and provides +detailed error reporting with call stack statistics to help developers +understand execution behavior and diagnose issues. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2897">line 2897</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + <h5>Parameters:</h5> + + +<table class="params"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>filePath</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last"> + Path to the file to execute + + </td> + </tr> + + + </tbody> +</table> + + + + + + + + + + + + +<div class="section-throws"> +<h5>Throws:</h5> + + + +<dl> + <dt> + <div class="param-desc"> + For file reading, parsing, or execution errors + </div> + </dt> + <dd></dd> + <dt> + <dl> + <dt> + Type + </dt> + <dd> + +<span class="param-type"><code>Error</code></span> + + + </dd> + </dl> + </dt> + <dd></dd> +</dl> + + + +</div> + + + +<div class="section-returns"> +<h5>Returns:</h5> + + + +<dl class="param-type"> + <dt> + Type: + </dt> + <dd> + +<span class="param-type"><code>Promise.<*></code></span> + + + </dd> +</dl> + + +<div class="param-desc"> + The result of executing the file +</div> + + +</div> + + + +</div> + + +<div class="section-method"> + + + + <h4 class="name" id="initializeStandardLibrary"><span class="type-signature"></span>initializeStandardLibrary<span class="signature">(scope)</span><span class="type-signature"></span></h4> + + + + + +<div class="description"> + Injects higher-order functions and combinator functions into the interpreter's global scope. +These functions provide functional programming utilities and implement the combinator foundation +that reduces parsing ambiguity by translating all operations to function calls. + +The standard library includes: +- Higher-order functions (map, compose, pipe, apply, filter, reduce, fold, curry) +- Arithmetic combinators (add, subtract, multiply, divide, modulo, power, negate) +- Comparison combinators (equals, notEquals, lessThan, greaterThan, lessEqual, greaterEqual) +- Logical combinators (logicalAnd, logicalOr, logicalXor, logicalNot) +- Enhanced combinators (identity, constant, flip, on, both, either) + +This approach ensures that user code can access these functions as if they were built-in, +without special syntax or reserved keywords. The combinator foundation allows the parser +to translate all operators to function calls, eliminating ambiguity while preserving syntax. + +Functions are written to check argument types at runtime since the language is dynamically +typed and does not enforce arity or types at parse time. The combinator functions are +designed to work seamlessly with the parser's operator translation, providing a consistent +and extensible foundation for all language operations. + +The standard library is the foundation of the combinator-based architecture. Each function +is designed to support partial application, enabling currying patterns and function composition. +This design choice enables functional programming patterns while maintaining +simplicity and consistency across all operations. + +Error handling is implemented at the function level, with clear error messages that help +users understand what went wrong and how to fix it. This includes type checking for +function arguments and validation of input data. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line134">line 134</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + <h5>Parameters:</h5> + + +<table class="params"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>scope</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Object</code></span> + + + + </td> + + + + + + <td class="description last"> + The global scope object to inject functions into + + </td> + </tr> + + + </tbody> +</table> + + + + + + + + + + + + + + + + +</div> + + +<div class="section-method"> + + + + <h4 class="name" id="interpreter"><span class="type-signature"></span>interpreter<span class="signature">(ast, environment<span class="signature-attributes">opt</span>, initialState<span class="signature-attributes">opt</span>)</span><span class="type-signature"> → {*}</span></h4> + + + + + +<div class="description"> + Evaluates an AST by walking through each node and performing the +corresponding operations. Manages scope, handles function calls, and supports +both synchronous and asynchronous operations. + +The interpreter implements a combinator-based architecture where all operations +are executed through function calls to standard library combinators. This design +reduces parsing ambiguity while preserving intuitive syntax. The parser translates +all operators (+, -, *, /, etc.) into FunctionCall nodes that reference combinator +functions, ensuring consistent semantics across all operations. + +Key architectural features: +- Combinator Foundation: All operations are function calls to standard library combinators +- Scope Management: Prototypal inheritance for variable lookup and function definitions +- Forward Declaration: Recursive functions are supported through placeholder creation +- Error Handling: Comprehensive error detection and reporting with call stack tracking +- Debug Support: Optional debug mode for development and troubleshooting +- IO Operations: Support for input/output operations through environment interface + +The interpreter processes legacy operator expressions (PlusExpression, MinusExpression, etc.) +for backward compatibility, but the parser now generates FunctionCall nodes for all operators, +which are handled by the standard library combinator functions. This ensures that all +operations follow the same execution model and can be extended by adding new combinator +functions to the standard library. + +The interpreter uses a global scope for variable storage and function definitions. +Each function call creates a new scope (using prototypal inheritance) to implement +lexical scoping. Immutability is enforced by preventing reassignment in the +global scope. + +The interpreter is split into three functions: evalNode (global), +localEvalNodeWithScope (for function bodies), and localEvalNode (for internal +recursion). This separation allows for correct scope handling and easier debugging. + +Recursive function support is implemented using a forward declaration pattern: +a placeholder function is created in the global scope before evaluation, allowing +the function body to reference itself during evaluation. + +The combinator foundation ensures that all operations are executed through +function calls, providing a consistent and extensible execution model. This +approach enables abstractions and reduces the need for special +handling of different operator types in the interpreter. + +The interpreter supports both synchronous and asynchronous operations. IO operations +like input and output can return Promises, allowing for non-blocking execution +when interacting with external systems or user input. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line1370">line 1370</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + <h5>Parameters:</h5> + + +<table class="params"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + <th>Attributes</th> + + + + <th>Default</th> + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>ast</code></td> + + + <td class="type"> + + +<span class="param-type"><code><a href="global.html#ASTNode">ASTNode</a></code></span> + + + + </td> + + + <td class="attributes"> + + + + + + </td> + + + + <td class="default"> + + </td> + + + <td class="description last"> + Abstract Syntax Tree to evaluate + + </td> + </tr> + + + + <tr> + + <td class="name"><code>environment</code></td> + + + <td class="type"> + + +<span class="param-type"><code><a href="global.html#Environment">Environment</a></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + + + </td> + + + + <td class="default"> + + null + + </td> + + + <td class="description last"> + External environment for IO operations + + </td> + </tr> + + + + <tr> + + <td class="name"><code>initialState</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Object</code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + + + </td> + + + + <td class="default"> + + {} + + </td> + + + <td class="description last"> + Initial state for the interpreter + + </td> + </tr> + + + </tbody> +</table> + + + + + + + + + + + + +<div class="section-throws"> +<h5>Throws:</h5> + + + +<dl> + <dt> + <div class="param-desc"> + For evaluation errors like division by zero, undefined variables, etc. + </div> + </dt> + <dd></dd> + <dt> + <dl> + <dt> + Type + </dt> + <dd> + +<span class="param-type"><code>Error</code></span> + + + </dd> + </dl> + </dt> + <dd></dd> +</dl> + + + +</div> + + + +<div class="section-returns"> +<h5>Returns:</h5> + + + +<dl class="param-type"> + <dt> + Type: + </dt> + <dd> + +<span class="param-type"><code>*</code></span> + + + </dd> +</dl> + + +<div class="param-desc"> + The result of evaluating the AST, or a Promise for async operations +</div> + + +</div> + + + +</div> + + +<div class="section-method"> + + + + <h4 class="name" id="lexer"><span class="type-signature"></span>lexer<span class="signature">(input)</span><span class="type-signature"> → {Array.<<a href="global.html#Token">Token</a>>}</span></h4> + + + + + +<div class="description"> + The lexer performs lexical analysis by converting source code +into a stream of tokens. Each token represents a meaningful unit of the +language syntax, such as identifiers, literals, operators, and keywords. + +The lexer implements a character-by-character scanning approach with +lookahead for multi-character tokens. It maintains line and column +information for accurate error reporting and debugging. + +Key features: +- Handles whitespace and comments (single-line and multi-line) +- Recognizes all language constructs including operators, keywords, and literals +- Supports string literals with escape sequences +- Provides detailed position information for error reporting +- Cross-platform compatibility (Node.js, Bun, browser) +- Supports function composition with 'via' keyword +- Handles function references with '@' operator + +The lexer is designed to be robust and provide clear error messages +for malformed input, making it easier to debug syntax errors in user code. +It supports the combinator-based architecture by recognizing all operators +and special tokens needed for function composition and application. + +The lexer is the first step in the language processing pipeline and must +correctly identify all tokens that the parser will translate into function +calls. This includes operators that will become combinator function calls, +function references that enable higher-order programming, and special +keywords that support the functional programming paradigm. + +The lexer uses a state machine approach where each character type triggers +different parsing strategies. This design enables efficient tokenization +while maintaining clear separation of concerns for different token types. +The character-by-character approach allows for precise error reporting and +supports multi-character tokens like operators and string literals +with escape sequences. + +Error handling is designed to provide meaningful feedback by including +line and column information in error messages. This enables users to +quickly locate and fix syntax errors in their code. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lexer.js.html">lexer.js</a>, <a href="lexer.js.html#line180">line 180</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + <h5>Parameters:</h5> + + +<table class="params"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>input</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last"> + The source code to tokenize + + </td> + </tr> + + + </tbody> +</table> + + + + + + + + + + + + +<div class="section-throws"> +<h5>Throws:</h5> + + + +<dl> + <dt> + <div class="param-desc"> + For unexpected characters or malformed tokens + </div> + </dt> + <dd></dd> + <dt> + <dl> + <dt> + Type + </dt> + <dd> + +<span class="param-type"><code>Error</code></span> + + + </dd> + </dl> + </dt> + <dd></dd> +</dl> + + + +</div> + + + +<div class="section-returns"> +<h5>Returns:</h5> + + + +<dl class="param-type"> + <dt> + Type: + </dt> + <dd> + +<span class="param-type"><code>Array.<<a href="global.html#Token">Token</a>></code></span> + + + </dd> +</dl> + + +<div class="param-desc"> + Array of token objects with type, value, line, and column +</div> + + +</div> + + + +</div> + + +<div class="section-method"> + + + + <h4 class="name" id="main"><span class="type-signature">(async) </span>main<span class="signature">()</span><span class="type-signature"></span></h4> + + + + + +<div class="description"> + Processes command line arguments and executes the specified file. +Provides helpful error messages for incorrect usage. + +The language is designed for file execution only (no REPL), so the CLI +enforces this usage and provides helpful error messages for incorrect invocation. +The function validates that exactly one file path is provided and that the +file has the correct .txt extension. + +Exits with appropriate error codes for different failure scenarios. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2979">line 2979</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + + + + + + + + + + + + + + +</div> + + +<div class="section-method"> + + + + <h4 class="name" id="parser"><span class="type-signature"></span>parser<span class="signature">(tokens)</span><span class="type-signature"> → {<a href="global.html#ASTNode">ASTNode</a>}</span></h4> + + + + + +<div class="description"> + The parser implements a combinator-based architecture where all +operators are translated to function calls to standard library combinators. +This reduces parsing ambiguity while preserving the original syntax. + +The parser uses a recursive descent approach with proper operator precedence +handling. Each operator expression (e.g., x + y) is translated to a FunctionCall +node (e.g., add(x, y)) that will be executed by the interpreter using the +corresponding combinator function. + +Key architectural decisions: +- All operators become FunctionCall nodes to eliminate ambiguity +- Operator precedence is handled through recursive parsing functions +- Function calls are detected by looking for identifiers followed by expressions +- When expressions and case patterns are parsed with special handling +- Table literals and access are parsed as structured data +- Function composition uses 'via' keyword with right-associative precedence +- Function application uses juxtaposition with left-associative precedence + +The parser maintains a current token index and advances through the token +stream, building the AST bottom-up from primary expressions to logical +expressions. This approach ensures that all operations are consistently +represented as function calls, enabling the interpreter to use the combinator +foundation for execution. + +This design choice reduces the need for special operator handling in the +interpreter and enables abstractions through the combinator foundation. +All operations become function calls, providing a consistent and extensible +execution model that can be enhanced by adding new combinator functions. + +The parser implements a top-down recursive descent strategy where each +parsing function handles a specific precedence level. This approach ensures +that operator precedence is correctly enforced while maintaining clear +separation of concerns for different language constructs. + +Error handling is designed to provide meaningful feedback by including +context about what was expected and what was found. This enables users +to quickly identify and fix parsing errors in their code. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="parser.js.html">parser.js</a>, <a href="parser.js.html#line83">line 83</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + <h5>Parameters:</h5> + + +<table class="params"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>tokens</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Array.<<a href="global.html#Token">Token</a>></code></span> + + + + </td> + + + + + + <td class="description last"> + Array of tokens from the lexer + + </td> + </tr> + + + </tbody> +</table> + + + + + + + + + + + + +<div class="section-throws"> +<h5>Throws:</h5> + + + +<dl> + <dt> + <div class="param-desc"> + For parsing errors like unexpected tokens or missing delimiters + </div> + </dt> + <dd></dd> + <dt> + <dl> + <dt> + Type + </dt> + <dd> + +<span class="param-type"><code>Error</code></span> + + + </dd> + </dl> + </dt> + <dd></dd> +</dl> + + + +</div> + + + +<div class="section-returns"> +<h5>Returns:</h5> + + + +<dl class="param-type"> + <dt> + Type: + </dt> + <dd> + +<span class="param-type"><code><a href="global.html#ASTNode">ASTNode</a></code></span> + + + </dd> +</dl> + + +<div class="param-desc"> + Abstract Syntax Tree with program body +</div> + + +</div> + + + +</div> + + +<div class="section-method"> + + + + <h4 class="name" id="readFile"><span class="type-signature">(async) </span>readFile<span class="signature">(filePath)</span><span class="type-signature"> → {Promise.<string>}</span></h4> + + + + + +<div class="description"> + Handles file reading across different platforms (Node.js, Bun, browser) +with appropriate fallbacks for each environment. This function is essential for +the language's file execution model where scripts are loaded from .txt files. + +The function prioritizes ES modules compatibility by using dynamic import, +but falls back to require for older Node.js versions. Browser environments +are not supported for file I/O operations. + +This cross-platform approach ensures the language can run in various JavaScript +environments while maintaining consistent behavior. The file reading capability +enables the language to execute scripts from files, supporting the development +workflow where tests and examples are stored as .txt files. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2853">line 2853</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + <h5>Parameters:</h5> + + +<table class="params"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>filePath</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last"> + Path to the file to read + + </td> + </tr> + + + </tbody> +</table> + + + + + + + + + + + + +<div class="section-throws"> +<h5>Throws:</h5> + + + +<dl> + <dt> + <div class="param-desc"> + For file reading errors + </div> + </dt> + <dd></dd> + <dt> + <dl> + <dt> + Type + </dt> + <dd> + +<span class="param-type"><code>Error</code></span> + + + </dd> + </dl> + </dt> + <dd></dd> +</dl> + + + +</div> + + + +<div class="section-returns"> +<h5>Returns:</h5> + + + +<dl class="param-type"> + <dt> + Type: + </dt> + <dd> + +<span class="param-type"><code>Promise.<string></code></span> + + + </dd> +</dl> + + +<div class="param-desc"> + File contents as a string +</div> + + +</div> + + + +</div> + + +<div class="section-method"> + + + + <h4 class="name" id="run"><span class="type-signature"></span>run<span class="signature">(scriptContent, initialState<span class="signature-attributes">opt</span>, environment<span class="signature-attributes">opt</span>)</span><span class="type-signature"> → {*}</span></h4> + + + + + +<div class="description"> + Parses and executes a script using the combinator-based language. +This function orchestrates the entire execution pipeline from source code +to final result. + +The function performs the following steps: +1. Tokenize the source code using the lexer +2. Parse the tokens into an AST using the parser +3. Evaluate the AST using the interpreter +4. Return the final result + +This is the primary interface for executing scripts in the language. +It handles the parsing and evaluation pipeline, +providing a simple interface for users to run their code. + +The function supports both synchronous and asynchronous execution. When +the script contains IO operations that return Promises, the function +will return a Promise that resolves to the final result. This enables +non-blocking execution for interactive programs. + +Error handling is comprehensive, with errors from any stage of the +pipeline (lexing, parsing, or evaluation) being caught and re-thrown +with appropriate context. This ensures that users get meaningful +error messages that help them identify and fix issues in their code. + +The function is designed to be stateless, with each call creating +a fresh interpreter instance. This ensures that scripts don't interfere +with each other and enables safe concurrent execution of multiple scripts. +</div> + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2667">line 2667</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + <h5>Parameters:</h5> + + +<table class="params"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + <th>Attributes</th> + + + + <th>Default</th> + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>scriptContent</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + <td class="attributes"> + + + + + + </td> + + + + <td class="default"> + + </td> + + + <td class="description last"> + The script content to execute + + </td> + </tr> + + + + <tr> + + <td class="name"><code>initialState</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Object</code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + + + </td> + + + + <td class="default"> + + {} + + </td> + + + <td class="description last"> + Initial state for the interpreter + + </td> + </tr> + + + + <tr> + + <td class="name"><code>environment</code></td> + + + <td class="type"> + + +<span class="param-type"><code><a href="global.html#Environment">Environment</a></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + + + </td> + + + + <td class="default"> + + null + + </td> + + + <td class="description last"> + Environment for IO operations + + </td> + </tr> + + + </tbody> +</table> + + + + + + + + + + + + +<div class="section-throws"> +<h5>Throws:</h5> + + + +<dl> + <dt> + <div class="param-desc"> + For parsing or evaluation errors + </div> + </dt> + <dd></dd> + <dt> + <dl> + <dt> + Type + </dt> + <dd> + +<span class="param-type"><code>Error</code></span> + + + </dd> + </dl> + </dt> + <dd></dd> +</dl> + + + +</div> + + + +<div class="section-returns"> +<h5>Returns:</h5> + + + +<dl class="param-type"> + <dt> + Type: + </dt> + <dd> + +<span class="param-type"><code>*</code></span> + + + </dd> +</dl> + + +<div class="param-desc"> + The result of executing the script +</div> + + +</div> + + + +</div> + + + + + <h3 class="subsection-title">Type Definitions</h3> + + + +<div class="section-members"> +<h4 class="name" id="ASTNode">ASTNode</h4> + + + + +<div class="description"> + AST node types for the language +</div> + + + + + + <h5 class="subsection-title">Properties:</h5> + + + +<table class="props"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + <th>Attributes</th> + + + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>type</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + <td class="attributes"> + + + + </td> + + + + + <td class="description last">The node type identifier</td> + </tr> + + + + + + <tr> + + <td class="name"><code>value</code></td> + + + <td class="type"> + + +<span class="param-type"><code>*</code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Node value (for literals)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>name</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Identifier name (for identifiers)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>body</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Array.<<a href="global.html#ASTNode">ASTNode</a>></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Program or function body</td> + </tr> + + + + + + <tr> + + <td class="name"><code>args</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Array.<<a href="global.html#ASTNode">ASTNode</a>></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Function call arguments</td> + </tr> + + + + + + <tr> + + <td class="name"><code>params</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Array.<string></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Function parameters</td> + </tr> + + + + + + <tr> + + <td class="name"><code>parameters</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Array.<string></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Function parameters (alternative)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>left</code></td> + + + <td class="type"> + + +<span class="param-type"><code><a href="global.html#ASTNode">ASTNode</a></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Left operand (for binary expressions)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>right</code></td> + + + <td class="type"> + + +<span class="param-type"><code><a href="global.html#ASTNode">ASTNode</a></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Right operand (for binary expressions)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>operand</code></td> + + + <td class="type"> + + +<span class="param-type"><code><a href="global.html#ASTNode">ASTNode</a></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Operand (for unary expressions)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>table</code></td> + + + <td class="type"> + + +<span class="param-type"><code><a href="global.html#ASTNode">ASTNode</a></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Table expression (for table access)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>key</code></td> + + + <td class="type"> + + +<span class="param-type"><code><a href="global.html#ASTNode">ASTNode</a></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Key expression (for table access)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>entries</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Array.<Object></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Table entries (for table literals)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>cases</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Array.<<a href="global.html#ASTNode">ASTNode</a>></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">When expression cases</td> + </tr> + + + + + + <tr> + + <td class="name"><code>pattern</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Array.<<a href="global.html#ASTNode">ASTNode</a>></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Pattern matching patterns</td> + </tr> + + + + + + <tr> + + <td class="name"><code>result</code></td> + + + <td class="type"> + + +<span class="param-type"><code>Array.<<a href="global.html#ASTNode">ASTNode</a>></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Pattern matching results</td> + </tr> + + + + + + <tr> + + <td class="name"><code>value</code></td> + + + <td class="type"> + + +<span class="param-type"><code><a href="global.html#ASTNode">ASTNode</a></code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">When expression value</td> + </tr> + + + + + </tbody> +</table> + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="parser.js.html">parser.js</a>, <a href="parser.js.html#line15">line 15</a> + </li></ul></dd> + + + + + + + +</dl> + + + + <h5>Type:</h5> + <ul> + <li> + +<span class="param-type"><code>Object</code></span> + + + </li> + </ul> + + + + + +</div> + + + +<div class="section-members"> +<h4 class="name" id="Environment">Environment</h4> + + + + +<div class="description"> + Environment interface for external system integration +</div> + + + + + + <h5 class="subsection-title">Properties:</h5> + + + +<table class="props"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>getCurrentState</code></td> + + + <td class="type"> + + +<span class="param-type"><code>function</code></span> + + + + </td> + + + + + + <td class="description last">Returns the current state from external system</td> + </tr> + + + + + + <tr> + + <td class="name"><code>emitValue</code></td> + + + <td class="type"> + + +<span class="param-type"><code>function</code></span> + + + + </td> + + + + + + <td class="description last">Sends a value to the external system</td> + </tr> + + + + + </tbody> +</table> + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line93">line 93</a> + </li></ul></dd> + + + + + + + +</dl> + + + + <h5>Type:</h5> + <ul> + <li> + +<span class="param-type"><code>Object</code></span> + + + </li> + </ul> + + + + + +</div> + + + +<div class="section-members"> +<h4 class="name" id="Token">Token</h4> + + + + +<div class="description"> + Token object structure +</div> + + + + + + <h5 class="subsection-title">Properties:</h5> + + + +<table class="props"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + <th>Attributes</th> + + + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>type</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + <td class="attributes"> + + + + </td> + + + + + <td class="description last">The token type from TokenType enum</td> + </tr> + + + + + + <tr> + + <td class="name"><code>value</code></td> + + + <td class="type"> + + +<span class="param-type"><code>*</code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">The token's value (for literals and identifiers)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>name</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + <td class="attributes"> + + <optional><br> + + + + </td> + + + + + <td class="description last">Function name (for FUNCTION_REF tokens)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>line</code></td> + + + <td class="type"> + + +<span class="param-type"><code>number</code></span> + + + + </td> + + + <td class="attributes"> + + + + </td> + + + + + <td class="description last">Line number where token appears (1-indexed)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>column</code></td> + + + <td class="type"> + + +<span class="param-type"><code>number</code></span> + + + + </td> + + + <td class="attributes"> + + + + </td> + + + + + <td class="description last">Column number where token appears (1-indexed)</td> + </tr> + + + + + </tbody> +</table> + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lexer.js.html">lexer.js</a>, <a href="lexer.js.html#line123">line 123</a> + </li></ul></dd> + + + + + + + +</dl> + + + + <h5>Type:</h5> + <ul> + <li> + +<span class="param-type"><code>Object</code></span> + + + </li> + </ul> + + + + + +</div> + + + +<div class="section-members"> +<h4 class="name" id="TokenType">TokenType</h4> + + + + +<div class="description"> + Defines all token types used by the lexer and parser. +Each token type represents a distinct syntactic element in the language. + +The token types are organized into categories: +- Literals: NUMBER, STRING, TRUE, FALSE +- Operators: PLUS, MINUS, MULTIPLY, DIVIDE, MODULO, POWER, etc. +- Keywords: WHEN, IS, THEN, FUNCTION, etc. +- Punctuation: LEFT_PAREN, RIGHT_PAREN, SEMICOLON, COMMA, etc. +- Special: IO_IN, IO_OUT, IO_ASSERT, IO_LISTEN, IO_EMIT, FUNCTION_REF, FUNCTION_ARG + +This enumeration provides a centralized definition of all possible +token types, ensuring consistency between lexer and parser. The token +types are designed to support the combinator-based architecture where +all operations are translated to function calls. +</div> + + + + + + <h5 class="subsection-title">Properties:</h5> + + + +<table class="props"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>NUMBER</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Numeric literals (integers and floats)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>PLUS</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Addition operator (+)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>MINUS</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Subtraction operator (-)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>MULTIPLY</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Multiplication operator (*)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>DIVIDE</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Division operator (/)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>IDENTIFIER</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Variable names and function names</td> + </tr> + + + + + + <tr> + + <td class="name"><code>ASSIGNMENT</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Assignment operator (:)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>ARROW</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Function arrow (->)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>CASE</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Case keyword</td> + </tr> + + + + + + <tr> + + <td class="name"><code>OF</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Of keyword</td> + </tr> + + + + + + <tr> + + <td class="name"><code>WHEN</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">When keyword for pattern matching</td> + </tr> + + + + + + <tr> + + <td class="name"><code>IS</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Is keyword for pattern matching</td> + </tr> + + + + + + <tr> + + <td class="name"><code>THEN</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Then keyword for pattern matching</td> + </tr> + + + + + + <tr> + + <td class="name"><code>WILDCARD</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Wildcard pattern (_)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>FUNCTION</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Function keyword</td> + </tr> + + + + + + <tr> + + <td class="name"><code>LEFT_PAREN</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Left parenthesis (()</td> + </tr> + + + + + + <tr> + + <td class="name"><code>RIGHT_PAREN</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Right parenthesis ())</td> + </tr> + + + + + + <tr> + + <td class="name"><code>LEFT_BRACE</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Left brace ({)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>RIGHT_BRACE</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Right brace (})</td> + </tr> + + + + + + <tr> + + <td class="name"><code>LEFT_BRACKET</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Left bracket ([)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>RIGHT_BRACKET</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Right bracket (])</td> + </tr> + + + + + + <tr> + + <td class="name"><code>SEMICOLON</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Semicolon (;)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>COMMA</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Comma (,)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>DOT</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Dot (.)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>STRING</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">String literals</td> + </tr> + + + + + + <tr> + + <td class="name"><code>TRUE</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Boolean true literal</td> + </tr> + + + + + + <tr> + + <td class="name"><code>FALSE</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Boolean false literal</td> + </tr> + + + + + + <tr> + + <td class="name"><code>AND</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Logical AND operator</td> + </tr> + + + + + + <tr> + + <td class="name"><code>OR</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Logical OR operator</td> + </tr> + + + + + + <tr> + + <td class="name"><code>XOR</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Logical XOR operator</td> + </tr> + + + + + + <tr> + + <td class="name"><code>NOT</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Logical NOT operator</td> + </tr> + + + + + + <tr> + + <td class="name"><code>EQUALS</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Equality operator (==)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>LESS_THAN</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Less than operator (<)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>GREATER_THAN</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Greater than operator (>)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>LESS_EQUAL</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Less than or equal operator (<=)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>GREATER_EQUAL</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Greater than or equal operator (>=)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>NOT_EQUAL</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Not equal operator (!=)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>MODULO</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Modulo operator (%)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>POWER</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Power operator (^)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>IO_IN</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Input operation (..in)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>IO_OUT</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Output operation (..out)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>IO_ASSERT</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Assertion operation (..assert)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>IO_LISTEN</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Listen operation (..listen)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>IO_EMIT</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Emit operation (..emit)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>FUNCTION_REF</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Function reference (@function)</td> + </tr> + + + + + + <tr> + + <td class="name"><code>FUNCTION_ARG</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Function argument (@(expression))</td> + </tr> + + + + + + <tr> + + <td class="name"><code>COMPOSE</code></td> + + + <td class="type"> + + +<span class="param-type"><code>string</code></span> + + + + </td> + + + + + + <td class="description last">Function composition (via)</td> + </tr> + + + + + </tbody> +</table> + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="lexer.js.html">lexer.js</a>, <a href="lexer.js.html#line4">line 4</a> + </li></ul></dd> + + + + + + + +</dl> + + + + <h5>Type:</h5> + <ul> + <li> + +<span class="param-type"><code>Object</code></span> + + + </li> + </ul> + + + + + +</div> + + + + + +</article> + +</section> + + + + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/index.html b/js/scripting-lang/docs/baba-yaga/0.0.1/index.html new file mode 100644 index 0000000..365268c --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/index.html @@ -0,0 +1,224 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>Home - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + + + + + + + + + + + + + + + + + + + <section class="readme"> + <article><h1>Baba Yaga</h1> +<h2>A Scripting Language</h2> +<p>Baba Yaga is a combinator-based scripting language that aims to be dangerously functional-brained, has minimal syntax, an intuitive approach to pattern matching, and hopefully enough of a standard library to be useful...but not too much of a standard library to be difficult to recall.</p> +<p>This whole thing started as an aesthetic curiosity, and continued on from there. I wanted to be able to do pattern matching like this:</p> +<pre class="prettyprint source lang-plaintext"><code>factorial : n -> + when n is + 0 then 1 + _ then n * (factorial (n - 1)); +</code></pre> +<p>I've implemented a whole bunch of <a href="https://git.sr.ht/~eli_oat/chupacabra">forths</a>, and a couple schemes, but never have I ever implemented something like a "regular" programming language. And, while, an <a href="https://en.wikipedia.org/wiki/Standard_ML">ML-flavored</a> programming language isn't exactly regular, this has grown from an aesthetic curiosity to a full-blown aesthetic indulgence.</p> +<p>Baba Yaga supports...</p> +<ul> +<li><strong>Function definitions</strong> using arrow syntax with lexical scoping</li> +<li><strong>Pattern matching</strong> with a single <code>when ... is ... then</code> expression that handles wildcards and arbitrarily nested features</li> +<li><strong>Tables</strong> inspired by Lua's tables, with array-like and key-value entries, including boolean keys</li> +<li><strong>Function references</strong> using an <code>@</code> operator for higher-order programming</li> +<li><strong>IO Operations</strong> including input, output, and assertions, plus an <code>..emit</code> and <code>..listen</code> pattern for interfacing a functional core with the outside world. This contains side effects to a very limited surface area</li> +<li><strong>Standard Library</strong> with a complete set of arithmetic, comparison, logical, and higher-order combinators...I think (let me know if I'm missing anything)</li> +<li><strong>APL-style operations</strong> with element-wise and immutable table operations so that you can use broadcasting instead of looping</li> +<li><strong>Function composition</strong> with <code>compose</code>, <code>pipe</code>, and <code>via</code> operators, supporting a bunch of different ways to chain functions together</li> +<li><strong>Currying by default</strong> - all functions are automatically curried</li> +<li><strong>Combinator-based architecture</strong> everything is "just" a function call or reference under the hood...because this supposedly made parsing easier...but I'm not yet totally sold on that reasoning</li> +</ul> +<h2>Example Script</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Basic arithmetic */ +result : 5 + 3 * 2; +..out result; + +/* Function definition */ +factorial : n -> + when n is + 0 then 1 + _ then n * (factorial (n - 1)); + +/* Function composition */ +double : x -> x * 2; +increment : x -> x + 1; +composed : compose @double @increment 5; +..out composed; + +/* Pattern matching */ +classify : x y -> + when x y is + 0 0 then "both zero" + 0 _ then "x is zero" + _ 0 then "y is zero" + _ _ then "neither zero"; + +/* Tables */ +person : {name: "Baba Yaga", age: 99, active: true}; +..out person.name; +..out person["age"]; + +numbers : {1, 2, 3, 4, 5}; +doubled : map @double numbers; +..out doubled[1]; + +/* APL-style element-wise operations over tables */ +table1 : {a: 1, b: 2, c: 3}; +table2 : {a: 10, b: 20, c: 30}; +sum : each @add table1 table2; +..out sum.a; +</code></pre> +<p>Baba Yaga files should use either the <code>.txt</code> file extension, or the <code>.baba</code> extension.</p> +<h2>Key Features</h2> +<h3>Function Application</h3> +<p>Functions are applied using juxtaposition (space-separated), and you can use parentheses to help disambiguate precedence:</p> +<pre class="prettyprint source lang-plaintext"><code>f x /* Apply function f to argument x */ +f x y /* Apply f to x, then apply result to y */ +f (g x) /* Apply g to x, then apply f to result */ +</code></pre> +<h3>Pattern Matching</h3> +<p>Use <code>when</code> expressions for pattern matching:</p> +<pre class="prettyprint source lang-plaintext"><code>result : when value is + 0 then "zero" + 1 then "one" + _ then "other"; +</code></pre> +<h3>Tables</h3> +<p>Create and access data structures:</p> +<pre class="prettyprint source lang-plaintext"><code>/* Array-like */ +numbers : {1, 2, 3, 4, 5}; + +/* Key-value pairs */ +person : {name: "Beatrice", age: 26}; + +/* Boolean keys */ +flags : {true: "enabled", false: "disabled"}; +</code></pre> +<h3>Function References</h3> +<p>Use the <code>@</code> to make reference to functions as arguments for other functions:</p> +<pre class="prettyprint source lang-plaintext"><code>numbers : {1, 2, 3, 4, 5}; +doubled : map @double numbers; +</code></pre> +<h2>Combinators and Higher-Order Functions</h2> +<p>Baba Yaga tries to provide a comprehensive set of combinators for functional programming:</p> +<h3>Core Combinators</h3> +<ul> +<li><code>map f x</code> - Transform elements in collections</li> +<li><code>filter p x</code> - Select elements based on predicates</li> +<li><code>reduce f init x</code> - Accumulate values into a single result</li> +<li><code>each f x</code> - Multi-argument element-wise operations</li> +</ul> +<h3>Function Composition</h3> +<ul> +<li><code>compose f g</code> - Right-to-left composition (mathematical style)</li> +<li><code>pipe f g</code> - Left-to-right composition (pipeline style)</li> +<li><code>via</code> - Kinda like <code>.</code> composition syntax: <code>f via g via h</code></li> +</ul> +<h3>Table Operations</h3> +<p>All table operations are immutable so they return new tables.</p> +<ul> +<li><code>t.map</code>, <code>t.filter</code>, <code>t.set</code>, <code>t.delete</code>, <code>t.merge</code>, <code>t.get</code>, <code>t.has</code>, <code>t.length</code></li> +</ul> +<h3>When to Use Which Combinator</h3> +<ul> +<li>Use <code>map</code> for general collections, <code>t.map</code> to emphasize table operations</li> +<li>Use <code>map</code> for single-table transformations, <code>each</code> for combining multiple collections.</li> +</ul> +<h3>Standard Library</h3> +<p>The language includes a comprehensive standard library:</p> +<p><strong>Arithmetic</strong>: <code>add</code>, <code>subtract</code>, <code>multiply</code>, <code>divide</code>, <code>modulo</code>, <code>power</code>, <code>negate</code><br> +<strong>Comparison</strong>: <code>equals</code>, <code>notEquals</code>, <code>lessThan</code>, <code>greaterThan</code>, <code>lessEqual</code>, <code>greaterEqual</code><br> +<strong>Logical</strong>: <code>logicalAnd</code>, <code>logicalOr</code>, <code>logicalXor</code>, <code>logicalNot</code><br> +<strong>Higher-Order</strong>: <code>map</code>, <code>compose</code>, <code>pipe</code>, <code>apply</code>, <code>filter</code>, <code>reduce</code>, <code>fold</code>, <code>curry</code>, <code>each</code><br> +<strong>Enhanced</strong>: <code>identity</code>, <code>constant</code>, <code>flip</code>, <code>on</code>, <code>both</code>, <code>either</code><br> +<strong>Table Operations</strong>: <code>t.map</code>, <code>t.filter</code>, <code>t.set</code>, <code>t.delete</code>, <code>t.merge</code>, <code>t.get</code>, <code>t.has</code>, <code>t.length</code></p> +<h2>Architecture</h2> +<p>Baba Yaga uses a combinator-based architecture where all operations are translated to function calls:</p> +<ol> +<li><strong>Lexer</strong>: Converts source code into tokens</li> +<li><strong>Parser</strong>: Translates tokens into AST, converting operators to combinator calls</li> +<li><strong>Interpreter</strong>: Executes combinator functions from the standard library</li> +</ol> +<p>The idea behind this approach is that it should eliminate parsing ambiguity while preserving syntax and enabling functional programming patterns like currying and composition, but the implementation is likely a little bit janky.</p> +<h2>Testing</h2> +<p>Run the complete test suite!</p> +<pre class="prettyprint source lang-bash"><code>./run_tests.sh +</code></pre> +<p>This assumes you are using bun, but I've also tested extensively with both node and the browser, too. I haven't validated it, yet, but I think Baba Yaga should work with quickjs, too.</p> +<h3>Debug Mode</h3> +<p>Enable debug output for development using the flag <code>DEBUG=1</code> or <code>DEBUG=2</code>:</p> +<pre class="prettyprint source lang-bash"><code>DEBUG=1 node lang.js your-script.txt +</code></pre> +<p>This'll output a lot of debug info, including the AST (as JSON).</p> +<h3>Adding Features</h3> +<p>If you wanna add language features, the easiest way to do it is to see if you can implement them in Baba Yaga script, if you need to get into the guts of the thing, though, you wanna follow this pattern,</p> +<ol> +<li>Add tests in <code>tests/</code></li> +<li>Add tokens in <code>lexer.js</code></li> +<li>Add parsing logic in <code>parser.js</code></li> +<li>Add evaluation logic in <code>lang.js</code></li> +<li>Validate against the tests you added earlier</li> +<li>Update documentation</li> +</ol></article> + </section> + + + + + + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/lang.js.html b/js/scripting-lang/docs/baba-yaga/0.0.1/lang.js.html index de40195..27fe6d6 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/lang.js.html +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/lang.js.html @@ -2,22 +2,35 @@ <html lang="en"> <head> <meta charset="utf-8"> - <title>JSDoc: Source: lang.js</title> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>lang.js - Documentation</title> - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> - <body> -<div id="main"> +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> - <h1 class="page-title">Source: lang.js</h1> +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">lang.js</h1> + @@ -26,19 +39,113 @@ <section> <article> - <pre class="prettyprint source linenums"><code>// Cross-platform scripting language implementation + <pre class="prettyprint source linenums"><code>// Baba Yaga +// Cross-platform scripting language implementation // Supports Node.js, Bun, and browser environments import { lexer, TokenType } from './lexer.js'; import { parser } from './parser.js'; +// Cross-platform environment detection +const isNode = typeof process !== 'undefined' && process.versions && process.versions.node; +const isBun = typeof process !== 'undefined' && process.versions && process.versions.bun; +const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; + +// Cross-platform debug flag +const DEBUG = (isNode && process.env.DEBUG) || (isBrowser && window.DEBUG) || false; + +// Cross-platform IO operations +const createReadline = () => { + if (isNode || isBun) { + const readline = require('readline'); + return readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + } else if (isBrowser) { + // Browser fallback - use prompt() for now + return { + question: (prompt, callback) => { + const result = window.prompt(prompt); + callback(result); + }, + close: () => {} + }; + } else { + // Fallback for other environments + return { + question: (prompt, callback) => { + callback("fallback input"); + }, + close: () => {} + }; + } +}; + +const createFileSystem = () => { + if (isNode || isBun) { + return require('fs'); + } else if (isBrowser) { + // Browser fallback - return a mock filesystem + return { + readFile: (path, encoding, callback) => { + callback(new Error('File system not available in browser')); + }, + writeFile: (path, data, callback) => { + callback(new Error('File system not available in browser')); + } + }; + } else { + // Fallback for other environments + return { + readFile: (path, encoding, callback) => { + callback(new Error('File system not available in this environment')); + }, + writeFile: (path, data, callback) => { + callback(new Error('File system not available in this environment')); + } + }; + } +}; + +// Cross-platform console output +const safeConsoleLog = (message) => { + if (typeof console !== 'undefined') { + console.log(message); + } +}; + +const safeConsoleError = (message) => { + if (typeof console !== 'undefined') { + console.error(message); + } +}; + +// Cross-platform process exit +const safeExit = (code) => { + if (isNode || isBun) { + process.exit(code); + } else if (isBrowser) { + // In browser, we can't exit, but we can throw an error or redirect + throw new Error(`Process would exit with code ${code}`); + } +}; + +/** + * Environment interface for external system integration + * + * @typedef {Object} Environment + * @property {Function} getCurrentState - Returns the current state from external system + * @property {Function} emitValue - Sends a value to the external system + */ + /** * Initializes the standard library in the provided scope. * * @param {Object} scope - The global scope object to inject functions into * @description Injects higher-order functions and combinator functions into the interpreter's global scope. * These functions provide functional programming utilities and implement the combinator foundation - * that eliminates parsing ambiguity by translating all operations to function calls. + * that reduces parsing ambiguity by translating all operations to function calls. * * The standard library includes: * - Higher-order functions (map, compose, pipe, apply, filter, reduce, fold, curry) @@ -55,8 +162,18 @@ import { parser } from './parser.js'; * typed and does not enforce arity or types at parse time. The combinator functions are * designed to work seamlessly with the parser's operator translation, providing a consistent * and extensible foundation for all language operations. + * + * The standard library is the foundation of the combinator-based architecture. Each function + * is designed to support partial application, enabling currying patterns and function composition. + * This design choice enables functional programming patterns while maintaining + * simplicity and consistency across all operations. + * + * Error handling is implemented at the function level, with clear error messages that help + * users understand what went wrong and how to fix it. This includes type checking for + * function arguments and validation of input data. */ function initializeStandardLibrary(scope) { + /** * Map: Apply a function to a value or collection * @param {Function} f - Function to apply @@ -70,7 +187,7 @@ function initializeStandardLibrary(scope) { * * The function implements APL-inspired element-wise operations for tables: * when x is a table, map applies the function to each value while preserving - * the table structure and keys. This eliminates the need for explicit loops + * the table structure and keys. This reduces the need for explicit loops * and enables declarative data transformation patterns. * * The function supports partial application: when called with only the function, @@ -79,10 +196,14 @@ function initializeStandardLibrary(scope) { * combinator-based architecture where all operations are function calls. * * This design choice aligns with the language's functional foundation and - * enables powerful abstractions like `map @double numbers` to transform + * enables abstractions like `map @double numbers` to transform * every element in a collection without explicit iteration. + * + * The function is designed to be polymorphic, working with different data + * types including scalars, tables, and arrays. This flexibility enables + * consistent data transformation patterns across different data structures. */ - scope.map = function(f, x) { + scope.map = function(f, x) { if (typeof f !== 'function') { throw new Error('map: first argument must be a function'); } @@ -138,7 +259,7 @@ function initializeStandardLibrary(scope) { * * Partial application support enables currying patterns where functions can * be built incrementally. This is essential for the combinator-based architecture - * where complex operations are built from simple, composable functions. + * where operations are built from simple, composable functions. * * Examples: * - compose(double, increment)(5) → double(increment(5)) → double(6) → 12 @@ -233,7 +354,7 @@ function initializeStandardLibrary(scope) { * * This function is the core mechanism that enables the parser's juxtaposition * detection. When the parser encounters `f x`, it generates `apply(f, x)`, - * which this function handles. This design eliminates the need for special + * which this function handles. This design reduces the need for special * syntax for function calls while maintaining clear precedence rules. * * The function supports partial application: when called with only the function, @@ -280,8 +401,8 @@ function initializeStandardLibrary(scope) { * who think in terms of data flow from left to right. * * Like compose, it supports partial application for currying patterns. - * This enables building complex transformation pipelines incrementally, - * which is essential for the combinator-based architecture where complex + * This enables building transformation pipelines incrementally, + * which is essential for the combinator-based architecture where * operations are built from simple, composable functions. * * The left-associative design choice makes pipe ideal for data processing @@ -328,7 +449,7 @@ function initializeStandardLibrary(scope) { * The function implements APL-inspired element-wise filtering for tables: * when x is a table, filter applies the predicate to each value and returns * a new table containing only the key-value pairs where the predicate returns true. - * This eliminates the need for explicit loops and enables declarative data + * This reduces the need for explicit loops and enables declarative data * selection patterns. * * The function supports partial application: when called with only the predicate, @@ -337,7 +458,7 @@ function initializeStandardLibrary(scope) { * combinator-based architecture where all operations are function calls. * * This design choice aligns with the language's functional foundation and - * enables powerful abstractions like `filter @isEven numbers` to select + * enables abstractions like `filter @isEven numbers` to select * elements from a collection without explicit iteration. */ scope.filter = function(p, x) { @@ -391,10 +512,10 @@ function initializeStandardLibrary(scope) { * application. */ scope.reduce = function(f, init, x) { - if (process.env.DEBUG) { - console.log(`[DEBUG] reduce: f =`, typeof f, f); - console.log(`[DEBUG] reduce: init =`, init); - console.log(`[DEBUG] reduce: x =`, x); + if (DEBUG) { + safeConsoleLog(`[DEBUG] reduce: f =`, typeof f, f); + safeConsoleLog(`[DEBUG] reduce: init =`, init); + safeConsoleLog(`[DEBUG] reduce: x =`, x); } if (typeof f !== 'function') { @@ -404,10 +525,10 @@ function initializeStandardLibrary(scope) { if (init === undefined) { // Partial application: return a function that waits for the remaining arguments return function(init, x) { - if (process.env.DEBUG) { - console.log(`[DEBUG] reduce returned function: f =`, typeof f, f); - console.log(`[DEBUG] reduce returned function: init =`, init); - console.log(`[DEBUG] reduce returned function: x =`, x); + if (DEBUG) { + safeConsoleLog(`[DEBUG] reduce returned function: f =`, typeof f, f); + safeConsoleLog(`[DEBUG] reduce returned function: init =`, init); + safeConsoleLog(`[DEBUG] reduce returned function: x =`, x); } if (x === undefined) { // Still partial application @@ -502,6 +623,12 @@ function initializeStandardLibrary(scope) { * operations through the combinator foundation. */ scope.add = function(x, y) { + if (y === undefined) { + // Partial application: return a function that waits for the second argument + return function(y) { + return x + y; + }; + } return x + y; }; @@ -512,6 +639,12 @@ function initializeStandardLibrary(scope) { * @returns {number} Difference of x and y */ scope.subtract = function(x, y) { + if (y === undefined) { + // Partial application: return a function that waits for the second argument + return function(y) { + return x - y; + }; + } return x - y; }; @@ -534,6 +667,12 @@ function initializeStandardLibrary(scope) { * operations through the combinator foundation. */ scope.multiply = function(x, y) { + if (y === undefined) { + // Partial application: return a function that waits for the second argument + return function(y) { + return x * y; + }; + } return x * y; }; @@ -545,6 +684,15 @@ function initializeStandardLibrary(scope) { * @throws {Error} When second argument is zero */ scope.divide = function(x, y) { + if (y === undefined) { + // Partial application: return a function that waits for the second argument + return function(y) { + if (y === 0) { + throw new Error('Division by zero'); + } + return x / y; + }; + } if (y === 0) { throw new Error('Division by zero'); } @@ -558,6 +706,12 @@ function initializeStandardLibrary(scope) { * @returns {number} Remainder of x divided by y */ scope.modulo = function(x, y) { + if (y === undefined) { + // Partial application: return a function that waits for the second argument + return function(y) { + return x % y; + }; + } return x % y; }; @@ -568,6 +722,12 @@ function initializeStandardLibrary(scope) { * @returns {number} x raised to the power of y */ scope.power = function(x, y) { + if (y === undefined) { + // Partial application: return a function that waits for the second argument + return function(y) { + return Math.pow(x, y); + }; + } return Math.pow(x, y); }; @@ -797,16 +957,16 @@ function initializeStandardLibrary(scope) { * - Scalar + Table: Uses map to apply f with the scalar as first argument to each table element * - Scalar + Scalar: Falls back to normal function application for backward compatibility * - * This design choice enables powerful multi-argument element-wise operations like + * This design choice enables multi-argument element-wise operations like * `each @add table1 table2` for element-wise addition, while maintaining compatibility * with the parser's two-argument apply model. The function is specifically designed * for multi-argument operations, distinguishing it from map which is for single-table * transformations. */ scope.each = function(f, x) { - if (process.env.DEBUG) { - console.log(`[DEBUG] each called with: f=${typeof f}, x=${typeof x}`); - console.log(`[DEBUG] x value:`, x); + if (DEBUG) { + safeConsoleLog(`[DEBUG] each called with: f=${typeof f}, x=${typeof x}`); + safeConsoleLog(`[DEBUG] x value:`, x); } if (typeof f !== 'function') { @@ -875,11 +1035,11 @@ function initializeStandardLibrary(scope) { * All operations in this namespace are designed to work with the language's * immutable data philosophy, where data transformations create new structures * rather than modifying existing ones. This enables functional programming - * patterns and eliminates side effects from table operations. + * patterns and reduces side effects from table operations. * * The namespace provides both basic table operations (get, set, delete, merge) * and higher-order operations (map, filter, reduce) that work element-wise - * on table values. This design choice enables powerful data transformation + * on table values. This design choice enables data transformation * patterns while maintaining the functional programming principles of the language. * * Key design principles: @@ -1196,7 +1356,9 @@ function initializeStandardLibrary(scope) { /** * Interpreter: Walks the AST and evaluates each node using the combinator foundation. * - * @param {Object} ast - Abstract Syntax Tree to evaluate + * @param {ASTNode} ast - Abstract Syntax Tree to evaluate + * @param {Environment} [environment=null] - External environment for IO operations + * @param {Object} [initialState={}] - Initial state for the interpreter * @returns {*} The result of evaluating the AST, or a Promise for async operations * @throws {Error} For evaluation errors like division by zero, undefined variables, etc. * @@ -1206,7 +1368,7 @@ function initializeStandardLibrary(scope) { * * The interpreter implements a combinator-based architecture where all operations * are executed through function calls to standard library combinators. This design - * eliminates parsing ambiguity while preserving intuitive syntax. The parser translates + * reduces parsing ambiguity while preserving intuitive syntax. The parser translates * all operators (+, -, *, /, etc.) into FunctionCall nodes that reference combinator * functions, ensuring consistent semantics across all operations. * @@ -1216,16 +1378,13 @@ function initializeStandardLibrary(scope) { * - Forward Declaration: Recursive functions are supported through placeholder creation * - Error Handling: Comprehensive error detection and reporting with call stack tracking * - Debug Support: Optional debug mode for development and troubleshooting + * - IO Operations: Support for input/output operations through environment interface * * The interpreter processes legacy operator expressions (PlusExpression, MinusExpression, etc.) * for backward compatibility, but the parser now generates FunctionCall nodes for all operators, * which are handled by the standard library combinator functions. This ensures that all * operations follow the same execution model and can be extended by adding new combinator * functions to the standard library. - * are translated to function calls to standard library combinators. This eliminates - * parsing ambiguity while preserving the original syntax. The parser generates - * FunctionCall nodes for operators (e.g., x + y becomes add(x, y)), and the - * interpreter executes these calls using the combinator functions in the global scope. * * The interpreter uses a global scope for variable storage and function definitions. * Each function call creates a new scope (using prototypal inheritance) to implement @@ -1242,18 +1401,25 @@ function initializeStandardLibrary(scope) { * * The combinator foundation ensures that all operations are executed through * function calls, providing a consistent and extensible execution model. This - * approach enables powerful abstractions and eliminates the need for special + * approach enables abstractions and reduces the need for special * handling of different operator types in the interpreter. + * + * The interpreter supports both synchronous and asynchronous operations. IO operations + * like input and output can return Promises, allowing for non-blocking execution + * when interacting with external systems or user input. */ -function interpreter(ast) { - const globalScope = {}; +function interpreter(ast, environment = null, initialState = {}) { + const globalScope = { ...initialState }; initializeStandardLibrary(globalScope); + // Track whether any IO operations have been performed + let ioOperationsPerformed = false; + // Debug: Check if combinators are available - if (process.env.DEBUG) { - console.log('[DEBUG] Available functions in global scope:', Object.keys(globalScope)); - console.log('[DEBUG] add function exists:', typeof globalScope.add === 'function'); - console.log('[DEBUG] subtract function exists:', typeof globalScope.subtract === 'function'); + if (DEBUG) { + safeConsoleLog('[DEBUG] Available functions in global scope:', Object.keys(globalScope)); + safeConsoleLog('[DEBUG] add function exists:', typeof globalScope.add === 'function'); + safeConsoleLog('[DEBUG] subtract function exists:', typeof globalScope.subtract === 'function'); } // Reset call stack tracker at the start of interpretation @@ -1262,7 +1428,7 @@ function interpreter(ast) { /** * Evaluates AST nodes in the global scope using the combinator foundation. * - * @param {Object} node - AST node to evaluate + * @param {ASTNode} node - AST node to evaluate * @returns {*} The result of evaluating the node * @throws {Error} For evaluation errors * @@ -1295,6 +1461,16 @@ function interpreter(ast) { * - WhenExpression: Pattern matching with wildcard support * - TableLiteral: Creates immutable table structures * - TableAccess: Safe property access with error handling + * - IO Operations: Handles input/output through environment interface + * + * The function maintains call stack tracking for debugging and error reporting. + * This enables detailed error messages that include the call chain leading to + * the error, making it easier to debug programs. + * + * Error handling is comprehensive, with specific error messages for common + * issues like undefined variables, type mismatches, and division by zero. + * Each error includes context about where the error occurred and what was + * expected, helping users quickly identify and fix issues. */ function evalNode(node) { callStackTracker.push('evalNode', node?.type || 'unknown'); @@ -1370,8 +1546,8 @@ function interpreter(ast) { key = evalNode(entry.key); } // Special handling for FunctionDeclaration nodes - if (process.env.DEBUG) { - console.log(`[DEBUG] TableLiteral: entry.value.type = ${entry.value.type}`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] TableLiteral: entry.value.type = ${entry.value.type}`); } if (entry.value.type === 'FunctionDeclaration') { // Don't evaluate the function body, just create the function @@ -1567,27 +1743,27 @@ function interpreter(ast) { if (typeof node.name === 'string') { // Regular function call with string name funcToCall = globalScope[node.name]; - if (process.env.DEBUG) { - console.log(`[DEBUG] FunctionCall: looking up function '${node.name}' in globalScope, found:`, typeof funcToCall); + if (DEBUG) { + safeConsoleLog(`[DEBUG] FunctionCall: looking up function '${node.name}' in globalScope, found:`, typeof funcToCall); } } else if (node.name.type === 'Identifier') { // Function call with identifier funcToCall = globalScope[node.name.value]; - if (process.env.DEBUG) { - console.log(`[DEBUG] FunctionCall: looking up function '${node.name.value}' in globalScope, found:`, typeof funcToCall); + if (DEBUG) { + safeConsoleLog(`[DEBUG] FunctionCall: looking up function '${node.name.value}' in globalScope, found:`, typeof funcToCall); } } else { // Function call from expression (e.g., parenthesized function, higher-order) funcToCall = evalNode(node.name); - if (process.env.DEBUG) { - console.log(`[DEBUG] FunctionCall: evaluated function expression, found:`, typeof funcToCall); + if (DEBUG) { + safeConsoleLog(`[DEBUG] FunctionCall: evaluated function expression, found:`, typeof funcToCall); } } - if (funcToCall instanceof Function) { + if (typeof funcToCall === 'function') { let args = node.args.map(evalNode); - if (process.env.DEBUG) { - console.log(`[DEBUG] FunctionCall: calling function with args:`, args); + if (DEBUG) { + safeConsoleLog(`[DEBUG] FunctionCall: calling function with args:`, args); } return funcToCall(...args); } @@ -1598,16 +1774,16 @@ function interpreter(ast) { ? node.value.map(evalNode) : [evalNode(node.value)]; - if (process.env.DEBUG) { - console.log(`[DEBUG] WhenExpression: whenValues =`, whenValues); + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: whenValues =`, whenValues); } for (const caseItem of node.cases) { // Handle both single patterns and arrays of patterns const patterns = caseItem.pattern.map(evalNode); - if (process.env.DEBUG) { - console.log(`[DEBUG] WhenExpression: patterns =`, patterns); + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: patterns =`, patterns); } // Check if patterns match the values @@ -1619,14 +1795,14 @@ function interpreter(ast) { const value = whenValues[i]; const pattern = patterns[i]; - if (process.env.DEBUG) { - console.log(`[DEBUG] WhenExpression: comparing value ${value} with pattern ${pattern}`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: comparing value ${value} with pattern ${pattern}`); } if (pattern === true) { // Wildcard pattern // Wildcard always matches - if (process.env.DEBUG) { - console.log(`[DEBUG] WhenExpression: wildcard matches`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: wildcard matches`); } continue; } else if (typeof pattern === 'object' && pattern.type === 'FunctionCall') { @@ -1642,36 +1818,56 @@ function interpreter(ast) { }; } const patternResult = evalNode(patternToEvaluate); - if (process.env.DEBUG) { - console.log(`[DEBUG] WhenExpression: boolean pattern result = ${patternResult}`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: boolean pattern result = ${patternResult}`); } if (!patternResult) { matches = false; - if (process.env.DEBUG) { - console.log(`[DEBUG] WhenExpression: boolean pattern does not match`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: boolean pattern does not match`); } break; - } else { - if (process.env.DEBUG) { - console.log(`[DEBUG] WhenExpression: boolean pattern matches`); + } else { + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: boolean pattern matches`); + } + } + } else if (typeof pattern === 'object' && pattern !== null && typeof value === 'object' && value !== null) { + // Table pattern matching - check if all pattern properties exist in value + let tableMatches = true; + for (const key in pattern) { + if (pattern.hasOwnProperty(key) && (!value.hasOwnProperty(key) || value[key] !== pattern[key])) { + tableMatches = false; + break; } } + if (!tableMatches) { + matches = false; + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: table pattern does not match`); + } + break; + } else { + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: table pattern matches`); + } + } } else if (value !== pattern) { matches = false; - if (process.env.DEBUG) { - console.log(`[DEBUG] WhenExpression: pattern does not match`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: pattern does not match`); } break; } else { - if (process.env.DEBUG) { - console.log(`[DEBUG] WhenExpression: pattern matches`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: pattern matches`); } } } } - if (process.env.DEBUG) { - console.log(`[DEBUG] WhenExpression: case matches = ${matches}`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] WhenExpression: case matches = ${matches}`); } if (matches) { @@ -1686,11 +1882,7 @@ function interpreter(ast) { case 'WildcardPattern': return true; case 'IOInExpression': - const readline = require('readline'); - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout - }); + const rl = createReadline(); return new Promise((resolve) => { rl.question('', (input) => { @@ -1701,7 +1893,8 @@ function interpreter(ast) { }); case 'IOOutExpression': const outputValue = evalNode(node.value); - console.log(outputValue); + safeConsoleLog(outputValue); + ioOperationsPerformed = true; return outputValue; case 'IOAssertExpression': const assertionValue = evalNode(node.value); @@ -1709,10 +1902,36 @@ function interpreter(ast) { throw new Error('Assertion failed'); } return assertionValue; + case 'IOListenExpression': + // Return current state from environment if available, otherwise placeholder + if (environment && typeof environment.getCurrentState === 'function') { + if (DEBUG) { + safeConsoleLog('[DEBUG] ..listen called - returning state from environment'); + } + return environment.getCurrentState(); + } else { + if (DEBUG) { + safeConsoleLog('[DEBUG] ..listen called - returning placeholder state'); + } + return { status: 'placeholder', message: 'State not available in standalone mode' }; + } + case 'IOEmitExpression': + const emitValue = evalNode(node.value); + // Send value to environment if available, otherwise log to console + if (environment && typeof environment.emitValue === 'function') { + if (DEBUG) { + safeConsoleLog('[DEBUG] ..emit called - sending to environment'); + } + environment.emitValue(emitValue); + } else { + safeConsoleLog('[EMIT]', emitValue); + } + ioOperationsPerformed = true; + return emitValue; case 'FunctionReference': const functionValue = globalScope[node.name]; - if (process.env.DEBUG) { - console.log(`[DEBUG] FunctionReference: looking up '${node.name}' in globalScope, found:`, typeof functionValue); + if (DEBUG) { + safeConsoleLog(`[DEBUG] FunctionReference: looking up '${node.name}' in globalScope, found:`, typeof functionValue); } if (functionValue === undefined) { throw new Error(`Function ${node.name} is not defined`); @@ -1735,7 +1954,7 @@ function interpreter(ast) { /** * Evaluates AST nodes in a local scope with access to parent scope. * - * @param {Object} node - AST node to evaluate + * @param {ASTNode} node - AST node to evaluate * @param {Object} scope - Local scope object (prototypally inherits from global) * @returns {*} The result of evaluating the node * @throws {Error} For evaluation errors @@ -1756,6 +1975,16 @@ function interpreter(ast) { * The function prioritizes local scope lookups over global scope lookups, ensuring * that function parameters shadow global variables with the same names. This * implements proper lexical scoping semantics. + * + * The function maintains the same call stack tracking as evalNode, enabling + * consistent debugging and error reporting across both global and local evaluation. + * This ensures that errors in function bodies can be traced back to their source + * with the same level of detail as global errors. + * + * Scope management is implemented using JavaScript's prototypal inheritance, + * where each local scope is created as an object that inherits from the global + * scope. This approach provides efficient variable lookup while maintaining + * proper scoping semantics and enabling access to global functions and variables. */ const localEvalNodeWithScope = (node, scope) => { callStackTracker.push('localEvalNodeWithScope', node?.type || 'unknown'); @@ -1949,16 +2178,16 @@ function interpreter(ast) { ? node.value.map(val => localEvalNodeWithScope(val, scope)) : [localEvalNodeWithScope(node.value, scope)]; - if (process.env.DEBUG) { - console.log(`[DEBUG] localEvalNodeWithScope WhenExpression: whenValues =`, whenValues); + if (DEBUG) { + safeConsoleLog(`[DEBUG] localEvalNodeWithScope WhenExpression: whenValues =`, whenValues); } for (const caseItem of node.cases) { // Handle both single patterns and arrays of patterns const patterns = caseItem.pattern.map(pat => localEvalNodeWithScope(pat, scope)); - if (process.env.DEBUG) { - console.log(`[DEBUG] localEvalNodeWithScope WhenExpression: patterns =`, patterns); + if (DEBUG) { + safeConsoleLog(`[DEBUG] localEvalNodeWithScope WhenExpression: patterns =`, patterns); } // Check if patterns match the values @@ -1970,32 +2199,52 @@ function interpreter(ast) { const value = whenValues[i]; const pattern = patterns[i]; - if (process.env.DEBUG) { - console.log(`[DEBUG] localEvalNodeWithScope WhenExpression: comparing value ${value} with pattern ${pattern}`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] localEvalNodeWithScope WhenExpression: comparing value ${value} with pattern ${pattern}`); } if (pattern === true) { // Wildcard pattern // Wildcard always matches - if (process.env.DEBUG) { - console.log(`[DEBUG] localEvalNodeWithScope WhenExpression: wildcard matches`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] localEvalNodeWithScope WhenExpression: wildcard matches`); } continue; + } else if (typeof pattern === 'object' && pattern !== null && typeof value === 'object' && value !== null) { + // Table pattern matching - check if all pattern properties exist in value + let tableMatches = true; + for (const key in pattern) { + if (pattern.hasOwnProperty(key) && (!value.hasOwnProperty(key) || value[key] !== pattern[key])) { + tableMatches = false; + break; + } + } + if (!tableMatches) { + matches = false; + if (DEBUG) { + safeConsoleLog(`[DEBUG] localEvalNodeWithScope WhenExpression: table pattern does not match`); + } + break; + } else { + if (DEBUG) { + safeConsoleLog(`[DEBUG] localEvalNodeWithScope WhenExpression: table pattern matches`); + } + } } else if (value !== pattern) { matches = false; - if (process.env.DEBUG) { - console.log(`[DEBUG] localEvalNodeWithScope WhenExpression: pattern does not match`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] localEvalNodeWithScope WhenExpression: pattern does not match`); } break; } else { - if (process.env.DEBUG) { - console.log(`[DEBUG] localEvalNodeWithScope WhenExpression: pattern matches`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] localEvalNodeWithScope WhenExpression: pattern matches`); } } } } - if (process.env.DEBUG) { - console.log(`[DEBUG] localEvalNodeWithScope WhenExpression: case matches = ${matches}`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] localEvalNodeWithScope WhenExpression: case matches = ${matches}`); } if (matches) { @@ -2010,22 +2259,19 @@ function interpreter(ast) { case 'WildcardPattern': return true; case 'IOInExpression': - const readline = require('readline'); - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout - }); + const rl2 = createReadline(); return new Promise((resolve) => { - rl.question('', (input) => { - rl.close(); + rl2.question('', (input) => { + rl2.close(); const num = parseInt(input); resolve(isNaN(num) ? input : num); }); }); case 'IOOutExpression': const localOutputValue = localEvalNodeWithScope(node.value, scope); - console.log(localOutputValue); + safeConsoleLog(localOutputValue); + ioOperationsPerformed = true; return localOutputValue; case 'IOAssertExpression': const localAssertionValue = localEvalNodeWithScope(node.value, scope); @@ -2033,6 +2279,32 @@ function interpreter(ast) { throw new Error('Assertion failed'); } return localAssertionValue; + case 'IOListenExpression': + // Return current state from environment if available, otherwise placeholder + if (environment && typeof environment.getCurrentState === 'function') { + if (DEBUG) { + safeConsoleLog('[DEBUG] ..listen called - returning state from environment'); + } + return environment.getCurrentState(); + } else { + if (DEBUG) { + safeConsoleLog('[DEBUG] ..listen called - returning placeholder state'); + } + return { status: 'placeholder', message: 'State not available in standalone mode' }; + } + case 'IOEmitExpression': + const localEmitValue = localEvalNodeWithScope(node.value, scope); + // Send value to environment if available, otherwise log to console + if (environment && typeof environment.emitValue === 'function') { + if (DEBUG) { + safeConsoleLog('[DEBUG] ..emit called - sending to environment'); + } + environment.emitValue(localEmitValue); + } else { + safeConsoleLog('[EMIT]', localEmitValue); + } + ioOperationsPerformed = true; + return localEmitValue; case 'FunctionReference': const localFunctionValue = globalScope[node.name]; if (localFunctionValue === undefined) { @@ -2282,6 +2554,19 @@ function interpreter(ast) { if (pattern === true) { // Wildcard pattern // Wildcard always matches continue; + } else if (typeof pattern === 'object' && pattern !== null && typeof value === 'object' && value !== null) { + // Table pattern matching - check if all pattern properties exist in value + let tableMatches = true; + for (const key in pattern) { + if (pattern.hasOwnProperty(key) && (!value.hasOwnProperty(key) || value[key] !== pattern[key])) { + tableMatches = false; + break; + } + } + if (!tableMatches) { + matches = false; + break; + } } else if (value !== pattern) { matches = false; break; @@ -2301,22 +2586,19 @@ function interpreter(ast) { case 'WildcardPattern': return true; case 'IOInExpression': - const readline = require('readline'); - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout - }); + const rl3 = createReadline(); return new Promise((resolve) => { - rl.question('', (input) => { - rl.close(); + rl3.question('', (input) => { + rl3.close(); const num = parseInt(input); resolve(isNaN(num) ? input : num); }); }); case 'IOOutExpression': const localOutputValue = localEvalNode(node.value); - console.log(localOutputValue); + safeConsoleLog(localOutputValue); + ioOperationsPerformed = true; return localOutputValue; case 'IOAssertExpression': const localAssertionValue = localEvalNode(node.value); @@ -2324,6 +2606,32 @@ function interpreter(ast) { throw new Error('Assertion failed'); } return localAssertionValue; + case 'IOListenExpression': + // Return current state from environment if available, otherwise placeholder + if (environment && typeof environment.getCurrentState === 'function') { + if (DEBUG) { + safeConsoleLog('[DEBUG] ..listen called - returning state from environment'); + } + return environment.getCurrentState(); + } else { + if (DEBUG) { + safeConsoleLog('[DEBUG] ..listen called - returning placeholder state'); + } + return { status: 'placeholder', message: 'State not available in standalone mode' }; + } + case 'IOEmitExpression': + const localEmitValue = localEvalNode(node.value); + // Send value to environment if available, otherwise log to console + if (environment && typeof environment.emitValue === 'function') { + if (DEBUG) { + safeConsoleLog('[DEBUG] ..emit called - sending to environment'); + } + environment.emitValue(localEmitValue); + } else { + safeConsoleLog('[EMIT]', localEmitValue); + } + ioOperationsPerformed = true; + return localEmitValue; case 'FunctionReference': const localFunctionValue = globalScope[node.name]; if (localFunctionValue === undefined) { @@ -2353,11 +2661,60 @@ function interpreter(ast) { if (lastResult instanceof Promise) { return lastResult.then(result => { - return result; + return { result: globalScope, ioOperationsPerformed }; }); } - return lastResult; + return { result: globalScope, ioOperationsPerformed }; +} + +/** + * Run script with environment support for harness integration + * + * @param {string} scriptContent - The script content to execute + * @param {Object} [initialState={}] - Initial state for the interpreter + * @param {Environment} [environment=null] - Environment for IO operations + * @returns {*} The result of executing the script + * @throws {Error} For parsing or evaluation errors + * + * @description Parses and executes a script using the combinator-based language. + * This function orchestrates the entire execution pipeline from source code + * to final result. + * + * The function performs the following steps: + * 1. Tokenize the source code using the lexer + * 2. Parse the tokens into an AST using the parser + * 3. Evaluate the AST using the interpreter + * 4. Return the final result + * + * This is the primary interface for executing scripts in the language. + * It handles the parsing and evaluation pipeline, + * providing a simple interface for users to run their code. + * + * The function supports both synchronous and asynchronous execution. When + * the script contains IO operations that return Promises, the function + * will return a Promise that resolves to the final result. This enables + * non-blocking execution for interactive programs. + * + * Error handling is comprehensive, with errors from any stage of the + * pipeline (lexing, parsing, or evaluation) being caught and re-thrown + * with appropriate context. This ensures that users get meaningful + * error messages that help them identify and fix issues in their code. + * + * The function is designed to be stateless, with each call creating + * a fresh interpreter instance. This ensures that scripts don't interfere + * with each other and enables safe concurrent execution of multiple scripts. + */ +function run(scriptContent, initialState = {}, environment = null) { + // Parse the script + const tokens = lexer(scriptContent); + const ast = parser(tokens); + + // Run the interpreter with environment and initial state + const result = interpreter(ast, environment, initialState); + + // Return the result + return result.result; } /** @@ -2379,14 +2736,14 @@ function interpreter(ast) { * and how the interpreter executes these calls through the standard library. * * The function is designed to be lightweight and safe to call frequently, - * making it suitable for tracing execution flow through complex nested + * making it suitable for tracing execution flow through nested * expressions and function applications. */ function debugLog(message, data = null) { - if (process.env.DEBUG) { - console.log(`[DEBUG] ${message}`); + if (DEBUG) { + safeConsoleLog(`[DEBUG] ${message}`); if (data) { - console.log(data); + safeConsoleLog(data); } } } @@ -2410,10 +2767,10 @@ function debugLog(message, data = null) { * execution pipeline. */ function debugError(message, error = null) { - if (process.env.DEBUG) { - console.error(`[DEBUG ERROR] ${message}`); + if (DEBUG) { + safeConsoleError(`[DEBUG ERROR] ${message}`); if (error) { - console.error(error); + safeConsoleError(error); } } } @@ -2430,7 +2787,7 @@ function debugError(message, error = null) { * potential infinite recursion by monitoring stack depth. * * This tool is particularly important for the combinator-based architecture - * where function calls are the primary execution mechanism, and complex + * where function calls are the primary execution mechanism, and * nested expressions can lead to deep call stacks. The tracker helps identify * when the combinator translation creates unexpectedly deep call chains, * enabling optimization of the function composition and application patterns. @@ -2474,8 +2831,8 @@ const callStackTracker = { throw new Error(`Potential infinite recursion detected. Call stack depth: ${this.stack.length}`); } - if (process.env.DEBUG && this.stack.length % 100 === 0) { - console.log(`[DEBUG] Call stack depth: ${this.stack.length}, Max: ${this.maxDepth}`); + if (DEBUG && this.stack.length % 100 === 0) { + safeConsoleLog(`[DEBUG] Call stack depth: ${this.stack.length}, Max: ${this.maxDepth}`); } }, @@ -2535,22 +2892,18 @@ const callStackTracker = { * workflow where tests and examples are stored as .txt files. */ async function readFile(filePath) { - // Check if we're in a browser environment - if (typeof window !== 'undefined') { - // Browser environment - would need to implement file input or fetch - throw new Error('File I/O not supported in browser environment'); - } + // Use cross-platform filesystem + const fs = createFileSystem(); - // Node.js or Bun environment - try { - // Try dynamic import for ES modules compatibility - const fs = await import('fs'); - return fs.readFileSync(filePath, 'utf8'); - } catch (error) { - // Fallback to require for older Node.js versions - const fs = require('fs'); - return fs.readFileSync(filePath, 'utf8'); - } + return new Promise((resolve, reject) => { + fs.readFile(filePath, 'utf8', (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + }); } /** @@ -2585,8 +2938,8 @@ async function readFile(filePath) { async function executeFile(filePath) { try { // Validate file extension - if (!filePath.endsWith('.txt')) { - throw new Error('Only .txt files are supported'); + if (!filePath.endsWith('.txt') && !filePath.endsWith('.baba')) { + throw new Error('Only .txt and .baba files are supported'); } const input = await readFile(filePath); @@ -2603,41 +2956,51 @@ async function executeFile(filePath) { if (result instanceof Promise) { result.then(finalResult => { - if (finalResult !== undefined) { - console.log(finalResult); + // Only output result if debug mode is enabled (no automatic final result output) + if (finalResult.result !== undefined && DEBUG) { + safeConsoleLog(finalResult.result); + } + // Print call stack statistics only in debug mode + if (DEBUG) { + const stats = callStackTracker.getStats(); + safeConsoleLog('\n=== CALL STACK STATISTICS ==='); + safeConsoleLog('Maximum call stack depth:', stats.maxDepth); + safeConsoleLog('Function call counts:', JSON.stringify(stats.callCounts, null, 2)); } - // Print call stack statistics after execution - const stats = callStackTracker.getStats(); - console.log('\n=== CALL STACK STATISTICS ==='); - console.log('Maximum call stack depth:', stats.maxDepth); - console.log('Function call counts:', JSON.stringify(stats.callCounts, null, 2)); }).catch(error => { - console.error(`Error executing file: ${error.message}`); - // Print call stack statistics on error - const stats = callStackTracker.getStats(); - console.error('\n=== CALL STACK STATISTICS ON ERROR ==='); - console.error('Maximum call stack depth:', stats.maxDepth); - console.error('Function call counts:', JSON.stringify(stats.callCounts, null, 2)); - process.exit(1); + safeConsoleError(`Error executing file: ${error.message}`); + // Print call stack statistics on error only in debug mode + if (DEBUG) { + const stats = callStackTracker.getStats(); + safeConsoleError('\n=== CALL STACK STATISTICS ON ERROR ==='); + safeConsoleError('Maximum call stack depth:', stats.maxDepth); + safeConsoleError('Function call counts:', JSON.stringify(stats.callCounts, null, 2)); + } + safeExit(1); }); } else { - if (result !== undefined) { - console.log(result); + // Only output result if debug mode is enabled (no automatic final result output) + if (result.result !== undefined && DEBUG) { + safeConsoleLog(result.result); + } + // Print call stack statistics only in debug mode + if (DEBUG) { + const stats = callStackTracker.getStats(); + safeConsoleLog('\n=== CALL STACK STATISTICS ==='); + safeConsoleLog('Maximum call stack depth:', stats.maxDepth); + safeConsoleLog('Function call counts:', JSON.stringify(stats.callCounts, null, 2)); } - // Print call stack statistics after execution - const stats = callStackTracker.getStats(); - console.log('\n=== CALL STACK STATISTICS ==='); - console.log('Maximum call stack depth:', stats.maxDepth); - console.log('Function call counts:', JSON.stringify(stats.callCounts, null, 2)); } } catch (error) { - console.error(`Error executing file: ${error.message}`); - // Print call stack statistics on error - const stats = callStackTracker.getStats(); - console.error('\n=== CALL STACK STATISTICS ON ERROR ==='); - console.error('Maximum call stack depth:', stats.maxDepth); - console.error('Function call counts:', JSON.stringify(stats.callCounts, null, 2)); - process.exit(1); + safeConsoleError(`Error executing file: ${error.message}`); + // Print call stack statistics on error only in debug mode + if (DEBUG) { + const stats = callStackTracker.getStats(); + safeConsoleError('\n=== CALL STACK STATISTICS ON ERROR ==='); + safeConsoleError('Maximum call stack depth:', stats.maxDepth); + safeConsoleError('Function call counts:', JSON.stringify(stats.callCounts, null, 2)); + } + safeExit(1); } } @@ -2655,29 +3018,39 @@ async function executeFile(filePath) { * Exits with appropriate error codes for different failure scenarios. */ async function main() { + // Only run main function in Node.js/Bun environments + if (!isNode && !isBun) { + return; // Skip in browser environment + } + const args = process.argv.slice(2); if (args.length === 0) { - console.error('Usage: node lang.js <file>'); - console.error(' Provide a file path to execute'); - process.exit(1); + safeConsoleError('Usage: node lang.js <file>'); + safeConsoleError(' Provide a file path to execute'); + safeExit(1); } else if (args.length === 1) { // Execute the file const filePath = args[0]; await executeFile(filePath); } else { // Too many arguments - console.error('Usage: node lang.js <file>'); - console.error(' Provide exactly one file path to execute'); - process.exit(1); + safeConsoleError('Usage: node lang.js <file>'); + safeConsoleError(' Provide exactly one file path to execute'); + safeExit(1); } } -// Start the program -main().catch(error => { - console.error('Fatal error:', error.message); - process.exit(1); -}); +// Start the program only if this file is run directly in Node.js/Bun +if ((isNode || isBun) && process.argv[1] && process.argv[1].endsWith('lang.js')) { + main().catch(error => { + safeConsoleError('Fatal error:', error.message); + safeExit(1); + }); +} + +// Export functions for harness integration +export { run, interpreter, lexer, parser }; </code></pre> @@ -2689,17 +3062,13 @@ main().catch(error => { </div> -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. </footer> -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> </body> </html> diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/lexer.js.html b/js/scripting-lang/docs/baba-yaga/0.0.1/lexer.js.html index 550c63b..1ebd7a1 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/lexer.js.html +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/lexer.js.html @@ -2,22 +2,35 @@ <html lang="en"> <head> <meta charset="utf-8"> - <title>JSDoc: Source: lexer.js</title> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>lexer.js - Documentation</title> - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> - <body> -<div id="main"> +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> - <h1 class="page-title">Source: lexer.js</h1> +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">lexer.js</h1> + @@ -40,17 +53,68 @@ * - Operators: PLUS, MINUS, MULTIPLY, DIVIDE, MODULO, POWER, etc. * - Keywords: WHEN, IS, THEN, FUNCTION, etc. * - Punctuation: LEFT_PAREN, RIGHT_PAREN, SEMICOLON, COMMA, etc. - * - Special: IO_IN, IO_OUT, IO_ASSERT, FUNCTION_REF, FUNCTION_ARG + * - Special: IO_IN, IO_OUT, IO_ASSERT, IO_LISTEN, IO_EMIT, FUNCTION_REF, FUNCTION_ARG * * This enumeration provides a centralized definition of all possible * token types, ensuring consistency between lexer and parser. The token * types are designed to support the combinator-based architecture where * all operations are translated to function calls. + * + * @typedef {Object} TokenType + * @property {string} NUMBER - Numeric literals (integers and floats) + * @property {string} PLUS - Addition operator (+) + * @property {string} MINUS - Subtraction operator (-) + * @property {string} MULTIPLY - Multiplication operator (*) + * @property {string} DIVIDE - Division operator (/) + * @property {string} IDENTIFIER - Variable names and function names + * @property {string} ASSIGNMENT - Assignment operator (:) + * @property {string} ARROW - Function arrow (->) + * @property {string} CASE - Case keyword + * @property {string} OF - Of keyword + * @property {string} WHEN - When keyword for pattern matching + * @property {string} IS - Is keyword for pattern matching + * @property {string} THEN - Then keyword for pattern matching + * @property {string} WILDCARD - Wildcard pattern (_) + * @property {string} FUNCTION - Function keyword + * @property {string} LEFT_PAREN - Left parenthesis (() + * @property {string} RIGHT_PAREN - Right parenthesis ()) + * @property {string} LEFT_BRACE - Left brace ({) + * @property {string} RIGHT_BRACE - Right brace (}) + * @property {string} LEFT_BRACKET - Left bracket ([) + * @property {string} RIGHT_BRACKET - Right bracket (]) + * @property {string} SEMICOLON - Semicolon (;) + * @property {string} COMMA - Comma (,) + * @property {string} DOT - Dot (.) + * @property {string} STRING - String literals + * @property {string} TRUE - Boolean true literal + * @property {string} FALSE - Boolean false literal + * @property {string} AND - Logical AND operator + * @property {string} OR - Logical OR operator + * @property {string} XOR - Logical XOR operator + * @property {string} NOT - Logical NOT operator + * @property {string} EQUALS - Equality operator (==) + * @property {string} LESS_THAN - Less than operator (<) + * @property {string} GREATER_THAN - Greater than operator (>) + * @property {string} LESS_EQUAL - Less than or equal operator (<=) + * @property {string} GREATER_EQUAL - Greater than or equal operator (>=) + * @property {string} NOT_EQUAL - Not equal operator (!=) + * @property {string} MODULO - Modulo operator (%) + * @property {string} POWER - Power operator (^) + * @property {string} IO_IN - Input operation (..in) + * @property {string} IO_OUT - Output operation (..out) + * @property {string} IO_ASSERT - Assertion operation (..assert) + * @property {string} IO_LISTEN - Listen operation (..listen) + * @property {string} IO_EMIT - Emit operation (..emit) + * @property {string} FUNCTION_REF - Function reference (@function) + * @property {string} FUNCTION_ARG - Function argument (@(expression)) + * @property {string} COMPOSE - Function composition (via) */ export const TokenType = { NUMBER: 'NUMBER', PLUS: 'PLUS', MINUS: 'MINUS', + UNARY_MINUS: 'UNARY_MINUS', + BINARY_MINUS: 'BINARY_MINUS', MULTIPLY: 'MULTIPLY', DIVIDE: 'DIVIDE', IDENTIFIER: 'IDENTIFIER', @@ -90,16 +154,29 @@ export const TokenType = { IO_IN: 'IO_IN', IO_OUT: 'IO_OUT', IO_ASSERT: 'IO_ASSERT', + IO_LISTEN: 'IO_LISTEN', + IO_EMIT: 'IO_EMIT', FUNCTION_REF: 'FUNCTION_REF', FUNCTION_ARG: 'FUNCTION_ARG', COMPOSE: 'COMPOSE' }; /** + * Token object structure + * + * @typedef {Object} Token + * @property {string} type - The token type from TokenType enum + * @property {*} [value] - The token's value (for literals and identifiers) + * @property {string} [name] - Function name (for FUNCTION_REF tokens) + * @property {number} line - Line number where token appears (1-indexed) + * @property {number} column - Column number where token appears (1-indexed) + */ + +/** * Converts source code into tokens for the combinator-based language * * @param {string} input - The source code to tokenize - * @returns {Array.<Object>} Array of token objects with type, value, line, and column + * @returns {Array.<Token>} Array of token objects with type, value, line, and column * @throws {Error} For unexpected characters or malformed tokens * * @description The lexer performs lexical analysis by converting source code @@ -129,6 +206,17 @@ export const TokenType = { * calls. This includes operators that will become combinator function calls, * function references that enable higher-order programming, and special * keywords that support the functional programming paradigm. + * + * The lexer uses a state machine approach where each character type triggers + * different parsing strategies. This design enables efficient tokenization + * while maintaining clear separation of concerns for different token types. + * The character-by-character approach allows for precise error reporting and + * supports multi-character tokens like operators and string literals + * with escape sequences. + * + * Error handling is designed to provide meaningful feedback by including + * line and column information in error messages. This enables users to + * quickly locate and fix syntax errors in their code. */ export function lexer(input) { const tokens = []; @@ -136,6 +224,19 @@ export function lexer(input) { let line = 1; let column = 1; + // Helper functions for spacing detection + function hasLeadingWhitespace() { + let pos = current - 1; + while (pos >= 0 && /\s/.test(input[pos])) pos--; + return pos >= 0 && input[pos] !== '\n' && input[pos] !== ';'; + } + + function hasLeadingAndTrailingSpaces() { + const hasLeading = current > 0 && /\s/.test(input[current - 1]); + const hasTrailing = current + 1 < input.length && /\s/.test(input[current + 1]); + return hasLeading && hasTrailing; + } + while (current < input.length) { let char = input[current]; @@ -204,6 +305,12 @@ export function lexer(input) { case 'assert': tokens.push({ type: TokenType.IO_ASSERT, line, column: column - operation.length - 2 }); break; + case 'listen': + tokens.push({ type: TokenType.IO_LISTEN, line, column: column - operation.length - 2 }); + break; + case 'emit': + tokens.push({ type: TokenType.IO_EMIT, line, column: column - operation.length - 2 }); + break; default: throw new Error(`Unknown IO operation: ..${operation} at line ${line}, column ${column - operation.length - 2}`); } @@ -354,7 +461,24 @@ export function lexer(input) { current++; column++; } else { - tokens.push({ type: TokenType.MINUS, line, column }); + // Check spacing to determine token type + const isUnary = !hasLeadingWhitespace(); + const isBinary = hasLeadingAndTrailingSpaces(); + const isFollowedByNumber = current + 1 < input.length && /[0-9]/.test(input[current + 1]); + + if (isUnary && isFollowedByNumber) { + // Unary minus at start of expression: -5 + tokens.push({ type: TokenType.UNARY_MINUS, line, column }); + } else if (isBinary) { + // Binary minus with spaces: 5 - 3 + tokens.push({ type: TokenType.BINARY_MINUS, line, column }); + } else if (isFollowedByNumber) { + // Minus followed by number but not at start: 5-3 (legacy) + tokens.push({ type: TokenType.MINUS, line, column }); + } else { + // Fallback to legacy MINUS token for edge cases + tokens.push({ type: TokenType.MINUS, line, column }); + } } break; case '*': @@ -455,17 +579,13 @@ export function lexer(input) { </div> -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. </footer> -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> </body> </html> diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/parser.js.html b/js/scripting-lang/docs/baba-yaga/0.0.1/parser.js.html index aad2a58..9858678 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/parser.js.html +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/parser.js.html @@ -2,22 +2,35 @@ <html lang="en"> <head> <meta charset="utf-8"> - <title>JSDoc: Source: parser.js</title> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>parser.js - Documentation</title> - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> - <body> -<div id="main"> +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> - <h1 class="page-title">Source: parser.js</h1> +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">parser.js</h1> + @@ -32,16 +45,47 @@ import { TokenType } from './lexer.js'; +// Cross-platform environment detection +const isNode = typeof process !== 'undefined' && process.versions && process.versions.node; +const isBun = typeof process !== 'undefined' && process.versions && process.versions.bun; +const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; + +// Cross-platform debug flag +const DEBUG = (isNode && process.env.DEBUG) || (isBrowser && window.DEBUG) || false; + +/** + * AST node types for the language + * + * @typedef {Object} ASTNode + * @property {string} type - The node type identifier + * @property {*} [value] - Node value (for literals) + * @property {string} [name] - Identifier name (for identifiers) + * @property {Array.<ASTNode>} [body] - Program or function body + * @property {Array.<ASTNode>} [args] - Function call arguments + * @property {Array.<string>} [params] - Function parameters + * @property {Array.<string>} [parameters] - Function parameters (alternative) + * @property {ASTNode} [left] - Left operand (for binary expressions) + * @property {ASTNode} [right] - Right operand (for binary expressions) + * @property {ASTNode} [operand] - Operand (for unary expressions) + * @property {ASTNode} [table] - Table expression (for table access) + * @property {ASTNode} [key] - Key expression (for table access) + * @property {Array.<Object>} [entries] - Table entries (for table literals) + * @property {Array.<ASTNode>} [cases] - When expression cases + * @property {Array.<ASTNode>} [pattern] - Pattern matching patterns + * @property {Array.<ASTNode>} [result] - Pattern matching results + * @property {ASTNode} [value] - When expression value + */ + /** * Parser: Converts tokens to an Abstract Syntax Tree (AST) using combinator-based architecture. * - * @param {Array.<Object>} tokens - Array of tokens from the lexer - * @returns {Object} Abstract Syntax Tree with program body + * @param {Array.<Token>} tokens - Array of tokens from the lexer + * @returns {ASTNode} Abstract Syntax Tree with program body * @throws {Error} For parsing errors like unexpected tokens or missing delimiters * * @description The parser implements a combinator-based architecture where all * operators are translated to function calls to standard library combinators. - * This eliminates parsing ambiguity while preserving the original syntax. + * This reduces parsing ambiguity while preserving the original syntax. * * The parser uses a recursive descent approach with proper operator precedence * handling. Each operator expression (e.g., x + y) is translated to a FunctionCall @@ -58,15 +102,24 @@ import { TokenType } from './lexer.js'; * - Function application uses juxtaposition with left-associative precedence * * The parser maintains a current token index and advances through the token - * stream, building the AST bottom-up from primary expressions to complex - * logical expressions. This approach ensures that all operations are consistently + * stream, building the AST bottom-up from primary expressions to logical + * expressions. This approach ensures that all operations are consistently * represented as function calls, enabling the interpreter to use the combinator * foundation for execution. * - * This design choice eliminates the need for special operator handling in the - * interpreter and enables powerful abstractions through the combinator foundation. + * This design choice reduces the need for special operator handling in the + * interpreter and enables abstractions through the combinator foundation. * All operations become function calls, providing a consistent and extensible * execution model that can be enhanced by adding new combinator functions. + * + * The parser implements a top-down recursive descent strategy where each + * parsing function handles a specific precedence level. This approach ensures + * that operator precedence is correctly enforced while maintaining clear + * separation of concerns for different language constructs. + * + * Error handling is designed to provide meaningful feedback by including + * context about what was expected and what was found. This enables users + * to quickly identify and fix parsing errors in their code. */ export function parser(tokens) { let current = 0; @@ -74,7 +127,7 @@ export function parser(tokens) { /** * Main parsing function that processes the entire token stream * - * @returns {Object} Complete AST with program body + * @returns {ASTNode} Complete AST with program body * @description Iterates through all tokens, parsing each statement or expression * and building the program body. Handles empty programs gracefully. * @@ -85,12 +138,17 @@ export function parser(tokens) { * * The function implements the top-level parsing strategy by processing each * statement or expression in sequence. This approach enables the parser to - * handle complex programs with multiple statements while maintaining the - * combinator-based architecture where all operations become function calls. - * - * Each call to walk() processes one complete statement or expression, ensuring - * that the parser can handle programs of any complexity while maintaining + * handle programs with multiple statements while maintaining the + * combinator-based architecture where all operations become function calls. + * + * Each call to walk() processes one complete statement or expression, ensuring + * that the parser can handle programs of various sizes while maintaining * clear separation between different language constructs. + * + * The function returns a Program node that contains all parsed statements + * and expressions in the order they appeared in the source code. This + * structure enables the interpreter to execute statements sequentially + * while maintaining proper scope and state management. */ function parse() { const body = []; @@ -108,7 +166,7 @@ export function parser(tokens) { /** * Main walk function that dispatches to appropriate parsing functions * - * @returns {Object|null} Parsed AST node or null for empty statements + * @returns {ASTNode|null} Parsed AST node or null for empty statements * @description Determines the type of construct at the current position * and delegates to the appropriate parsing function. The order of checks * determines parsing precedence for top-level constructs. @@ -123,15 +181,19 @@ export function parser(tokens) { * This function implements the top-level parsing strategy by checking for * specific token patterns that indicate different language constructs. * The order of checks is crucial for correct parsing precedence and - * ensures that complex expressions are properly decomposed into their - * constituent parts for combinator translation. - * - * The function uses a pattern-matching approach to identify language constructs - * based on token sequences. This design enables the parser to handle complex + * ensures that expressions are properly decomposed into their + * constituent parts for combinator translation. + * + * The function uses a pattern-matching approach to identify language constructs + * based on token sequences. This design enables the parser to handle various * syntax while maintaining clear separation between different constructs. * Each parsing function is responsible for handling its specific syntax * and translating it into appropriate AST nodes for the combinator-based * interpreter. + * + * The function returns null for empty statements or whitespace, allowing + * the parser to gracefully handle programs with empty lines or comments + * without affecting the AST structure. */ function walk() { const token = tokens[current]; @@ -148,6 +210,12 @@ export function parser(tokens) { if (token.type === TokenType.IO_ASSERT) { return parseIOAssert(); } + if (token.type === TokenType.IO_LISTEN) { + return parseIOListen(); + } + if (token.type === TokenType.IO_EMIT) { + return parseIOEmit(); + } // Handle assignments if (token.type === TokenType.IDENTIFIER && @@ -175,7 +243,7 @@ export function parser(tokens) { /** * Parse assignment statements: identifier : expression; * - * @returns {Object} Assignment AST node + * @returns {ASTNode} Assignment AST node * @throws {Error} For malformed assignments or missing semicolons * @description Parses variable assignments and function definitions. * Supports both simple assignments (x : 42) and arrow function definitions @@ -183,6 +251,20 @@ export function parser(tokens) { * * The function uses lookahead to distinguish between different assignment * types and parses the value according to the detected type. + * + * Assignment parsing is crucial for the language's variable binding system. + * The function supports multiple assignment patterns to provide flexibility + * while maintaining clear syntax. This includes traditional variable + * assignments, function definitions using arrow syntax, and when expressions + * that can be assigned to variables. + * + * The function implements forward declaration support for recursive functions + * by allowing function definitions to reference themselves during parsing. + * This enables natural recursive function definitions without requiring + * special syntax or pre-declaration. + * + * Error handling includes checks for missing semicolons and malformed + * assignment syntax, providing clear feedback to help users fix syntax errors. */ function parseAssignment() { const identifier = tokens[current].value; @@ -272,7 +354,7 @@ export function parser(tokens) { /** * Parse when expressions: when value is pattern then result pattern then result; * - * @returns {Object} WhenExpression AST node + * @returns {ASTNode} WhenExpression AST node * @throws {Error} For malformed when expressions * @description Parses pattern matching expressions with support for single * and multiple values/patterns. The when expression is the primary pattern @@ -286,9 +368,22 @@ export function parser(tokens) { * * The function parses values, patterns, and results, building a structured * AST that the interpreter can efficiently evaluate. + * + * When expression parsing is essential for pattern matching and conditional + * execution. It allows for flexible conditional logic where + * a single value or multiple values can be matched against a set of patterns, + * and the result of the match determines the next action. + * + * The function implements a recursive descent parser that handles nested + * patterns and results. It correctly identifies the 'when' keyword, + * parses the value(s), and then iterates through cases, parsing patterns + * and results. The 'then' keyword is used to separate patterns from results. + * + * Error handling includes checks for missing 'is' after value, malformed + * patterns, and unexpected tokens during pattern parsing. */ function parseWhenExpression() { - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseWhenExpression: starting, current token = ${tokens[current].type}`); } current++; // Skip 'when' @@ -296,16 +391,17 @@ export function parser(tokens) { // Parse the value(s) - can be single value or multiple values const values = []; while (current < tokens.length && tokens[current].type !== TokenType.IS) { - // For when expressions, we want to parse simple identifiers and expressions - // but not treat them as function calls + // Use parsePrimary to handle all types of expressions including table access and function calls let value; - if (tokens[current].type === TokenType.IDENTIFIER) { - // Single identifier value - value = { type: 'Identifier', value: tokens[current].value }; - current++; + if (tokens[current].type === TokenType.IO_LISTEN) { + // Handle IO listen in when expressions + value = parseIOListen(); + } else if (tokens[current].type === TokenType.IO_EMIT) { + // Handle IO emit in when expressions + value = parseIOEmit(); } else { - // For other types, use normal expression parsing - value = parseLogicalExpression(); + // For all other types, use parsePrimary to handle expressions + value = parsePrimary(); } values.push(value); } @@ -318,7 +414,7 @@ export function parser(tokens) { const cases = []; while (current < tokens.length) { - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseWhenExpression: starting new case, current token = ${tokens[current].type}, value = ${tokens[current].value || 'N/A'}`); } // Parse pattern(s) - can be single pattern or multiple patterns @@ -327,7 +423,7 @@ export function parser(tokens) { // Parse patterns until we hit THEN while (current < tokens.length && tokens[current].type !== TokenType.THEN) { let pattern; - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseWhenExpression: parsing pattern, current token = ${tokens[current].type}, value = ${tokens[current].value || 'N/A'}`); } @@ -343,8 +439,30 @@ export function parser(tokens) { // Parse as a comparison expression pattern = parseExpression(); } else if (tokens[current].type === TokenType.IDENTIFIER) { - pattern = { type: 'Identifier', value: tokens[current].value }; - current++; + // Check if this is a function call (identifier followed by arguments) + if (current + 1 < tokens.length && isValidArgumentStart(tokens[current + 1])) { + // Parse as a function call, but stop at THEN or semicolon + const functionName = tokens[current].value; + current++; // Skip function name + + // Parse arguments until we hit THEN, semicolon, or end of tokens + const args = []; + while (current < tokens.length && + tokens[current].type !== TokenType.THEN && + tokens[current].type !== TokenType.SEMICOLON) { + const arg = parseLogicalExpression(); + args.push(arg); + } + + pattern = { + type: 'FunctionCall', + name: functionName, + args + }; + } else { + pattern = { type: 'Identifier', value: tokens[current].value }; + current++; + } } else if (tokens[current].type === TokenType.NUMBER) { pattern = { type: 'NumberLiteral', value: tokens[current].value }; current++; @@ -363,6 +481,25 @@ export function parser(tokens) { } else if (tokens[current].type === TokenType.FALSE) { pattern = { type: 'BooleanLiteral', value: false }; current++; + } else if (tokens[current].type === TokenType.MINUS || tokens[current].type === TokenType.UNARY_MINUS) { + // Handle negative numbers in patterns + current++; // Skip minus token + if (current >= tokens.length || tokens[current].type !== TokenType.NUMBER) { + throw new Error('Expected number after minus in pattern'); + } + pattern = { type: 'NumberLiteral', value: -tokens[current].value }; + current++; + } else if (tokens[current].type === TokenType.LEFT_BRACE) { + // Handle table literals in patterns + pattern = parseTableLiteral(); + } else if (tokens[current].type === TokenType.LEFT_PAREN) { + // Handle parenthesized expressions in patterns + current++; // Skip '(' + pattern = parseLogicalExpression(); + if (current >= tokens.length || tokens[current].type !== TokenType.RIGHT_PAREN) { + throw new Error('Expected ")" after parenthesized expression in pattern'); + } + current++; // Skip ')' } else { throw new Error(`Expected pattern (identifier, number, string, wildcard, function reference, boolean, or comparison) in when expression, got ${tokens[current].type}`); } @@ -436,7 +573,7 @@ export function parser(tokens) { result: [result] }); - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseWhenExpression: finished case, current token = ${tokens[current].type}, value = ${tokens[current].value || 'N/A'}`); } @@ -444,13 +581,13 @@ export function parser(tokens) { if (current < tokens.length) { const nextToken = tokens[current]; - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseWhenExpression: checking termination, nextToken = ${nextToken.type}, value = ${nextToken.value || 'N/A'}`); } // Stop on semicolon if (nextToken.type === TokenType.SEMICOLON) { - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseWhenExpression: terminating on SEMICOLON`); } current++; @@ -459,7 +596,7 @@ export function parser(tokens) { // Stop on assignment (for consecutive assignments) if (nextToken.type === TokenType.ASSIGNMENT) { - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseWhenExpression: terminating on ASSIGNMENT`); } break; @@ -478,7 +615,7 @@ export function parser(tokens) { if (lookAhead < tokens.length && tokens[lookAhead].type === TokenType.ASSIGNMENT) { // This is the start of a new assignment, terminate the when expression - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseWhenExpression: terminating on new assignment starting with ${nextToken.value}`); } break; @@ -487,7 +624,7 @@ export function parser(tokens) { // Stop on right brace (for when expressions inside table literals) if (nextToken.type === TokenType.RIGHT_BRACE) { - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseWhenExpression: terminating on RIGHT_BRACE`); } break; @@ -495,7 +632,7 @@ export function parser(tokens) { // Stop on comma (for when expressions inside table literals) if (nextToken.type === TokenType.COMMA) { - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseWhenExpression: terminating on COMMA`); } break; @@ -515,7 +652,7 @@ export function parser(tokens) { /** * Parse function definitions: function (params) : body * - * @returns {Object} FunctionDefinition AST node + * @returns {ASTNode} FunctionDefinition AST node * @throws {Error} For malformed function definitions * @description Parses explicit function declarations with parameter lists * and function bodies. This is the traditional function definition syntax @@ -526,6 +663,18 @@ export function parser(tokens) { * - Parenthesized parameter list * - Assignment token (:) * - Function body expression + * + * Function definition parsing is fundamental to the language's ability to + * define reusable functions. It supports traditional function declarations + * with explicit parameter lists and function bodies. + * + * The function implements a recursive descent parser that handles the + * 'function' keyword, parameter parsing, and the assignment token. + * It then recursively parses the function body, which can be any valid + * expression. + * + * Error handling includes checks for missing '(' after function keyword, + * missing ')' after function parameters, and missing ':' after parameters. */ function parseFunctionDefinition() { current++; // Skip 'function' @@ -571,10 +720,19 @@ export function parser(tokens) { /** * Parse IO input operations: ..in * - * @returns {Object} IOInExpression AST node + * @returns {ASTNode} IOInExpression AST node * @description Parses input operations that read from standard input. * The operation is represented as a simple AST node that the interpreter * will handle by prompting for user input. + * + * IO input parsing is crucial for interactive programs that require + * user interaction. It allows for simple and direct input operations + * that read values from the standard input stream. + * + * The function implements a recursive descent parser that handles the + * '..in' keyword and expects a semicolon after the operation. + * + * Error handling includes checks for missing semicolon after input operation. */ function parseIOIn() { current++; // Skip IO_IN token @@ -584,11 +742,20 @@ export function parser(tokens) { /** * Parse IO output operations: ..out expression * - * @returns {Object} IOOutExpression AST node + * @returns {ASTNode} IOOutExpression AST node * @throws {Error} For malformed output expressions * @description Parses output operations that write to standard output. * The expression to output is parsed as a logical expression and will * be evaluated by the interpreter before being printed. + * + * IO output parsing is essential for programs that need to display + * information to the user. It allows for expressions to be evaluated + * and their results to be printed to the standard output stream. + * + * The function implements a recursive descent parser that handles the + * '..out' keyword and expects a semicolon after the expression. + * + * Error handling includes checks for missing semicolon after output expression. */ function parseIOOut() { current++; // Skip IO_OUT token @@ -608,11 +775,21 @@ export function parser(tokens) { /** * Parse IO assert operations: ..assert expression * - * @returns {Object} IOAssertExpression AST node + * @returns {ASTNode} IOAssertExpression AST node * @throws {Error} For malformed assert expressions * @description Parses assertion operations that verify conditions. * The expression is parsed as a logical expression and will be evaluated * by the interpreter. If the result is falsy, an assertion error is thrown. + * + * IO assert parsing is important for programs that need to perform + * runtime checks or assertions. It allows for expressions to be evaluated + * and their boolean results to be used for conditional execution or + * error reporting. + * + * The function implements a recursive descent parser that handles the + * '..assert' keyword and expects a semicolon after the expression. + * + * Error handling includes checks for missing semicolon after assert expression. */ function parseIOAssert() { current++; // Skip IO_ASSERT token @@ -628,23 +805,86 @@ export function parser(tokens) { value }; } + + /** + * Parse IO listen operations: ..listen + * + * @returns {ASTNode} IOListenExpression AST node + * @description Parses listen operations that retrieve current state. + * Returns the current state from the external system without any parameters. + * + * IO listen parsing is useful for programs that need to query the + * current state of an external system or environment. It allows for + * simple retrieval of state without requiring any input parameters. + * + * The function implements a recursive descent parser that handles the + * '..listen' keyword and expects a semicolon after the operation. + * + * Error handling includes checks for missing semicolon after listen operation. + */ + function parseIOListen() { + current++; // Skip IO_LISTEN token + + // Expect semicolon + if (current < tokens.length && tokens[current].type === TokenType.SEMICOLON) { + current++; + } + + return { + type: 'IOListenExpression' + }; + } + + /** + * Parse IO emit operations: ..emit expression + * + * @returns {ASTNode} IOEmitExpression AST node + * @throws {Error} For malformed emit expressions + * @description Parses emit operations that send values to external system. + * The expression is parsed as a logical expression and will be evaluated + * by the interpreter before being sent to the external system. + * + * IO emit parsing is essential for programs that need to interact with + * external systems or environments. It allows for expressions to be + * evaluated and their results to be sent to the external system. + * + * The function implements a recursive descent parser that handles the + * '..emit' keyword and expects a semicolon after the expression. + * + * Error handling includes checks for missing semicolon after emit expression. + */ + function parseIOEmit() { + current++; // Skip IO_EMIT token + const value = parseLogicalExpression(); + + // Expect semicolon + if (current < tokens.length && tokens[current].type === TokenType.SEMICOLON) { + current++; + } + + return { + type: 'IOEmitExpression', + value + }; + } /** * Parse logical expressions with proper precedence * - * @returns {Object} AST node representing the logical expression + * @returns {ASTNode} AST node representing the logical expression * @description Parses logical expressions (and, or, xor) with the lowest * precedence. All logical operators are translated to FunctionCall nodes * using the corresponding combinator functions. * - * Operator precedence (lowest to highest): - * 1. Logical operators (and, or, xor) - * 2. Comparison operators (=, !=, <, >, <=, >=) - * 3. Additive operators (+, -) - * 4. Multiplicative operators (*, /, %) - * 5. Power operator (^) - * 6. Unary operators (not, -) - * 7. Primary expressions (literals, identifiers, function calls, parentheses) + * Logical expression parsing is the foundation for conditional logic + * in the language. It handles the lowest precedence operators (and, or, xor) + * and translates them to combinator function calls. + * + * The function implements a recursive descent parser that handles + * operator precedence by repeatedly calling itself with the right operand + * until no more operators of the same precedence are found. + * + * Error handling includes checks for missing operators or operands. */ function parseLogicalExpression() { let left = parseExpression(); @@ -674,7 +914,7 @@ export function parser(tokens) { /** * Parse comparison expressions * - * @returns {Object} AST node representing the comparison expression + * @returns {ASTNode} AST node representing the comparison expression * @description Parses comparison expressions (=, !=, <, >, <=, >=) and * additive expressions (+, -). All operators are translated to FunctionCall * nodes using the corresponding combinator functions. @@ -682,36 +922,58 @@ export function parser(tokens) { * This function implements the core of the combinator-based architecture * by translating operator expressions to function calls that will be * executed by the interpreter using standard library combinators. + * + * Comparison expression parsing is crucial for conditional logic + * and arithmetic operations. It handles equality, inequality, + * comparison operators, and additive operators. + * + * The function implements a recursive descent parser that handles + * operator precedence by repeatedly calling itself with the right operand + * until no more operators of the same precedence are found. + * + * Error handling includes checks for missing operators or operands. */ function parseExpression() { - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseExpression: starting, current token = ${tokens[current].type}`); } + // Handle IO operations in expressions + if (current < tokens.length) { + const token = tokens[current]; + if (token.type === TokenType.IO_LISTEN) { + return parseIOListen(); + } + if (token.type === TokenType.IO_EMIT) { + return parseIOEmit(); + } + } + // Handle unary minus at the beginning of expressions - if (current < tokens.length && tokens[current].type === TokenType.MINUS) { - if (process.env.DEBUG) { + let left; + if (current < tokens.length && (tokens[current].type === TokenType.MINUS || tokens[current].type === TokenType.UNARY_MINUS)) { + if (DEBUG) { console.log(`[DEBUG] parseExpression: handling unary minus`); } current++; const operand = parseTerm(); - return { + left = { type: 'FunctionCall', name: 'negate', args: [operand] }; + } else { + left = parseTerm(); } - let left = parseTerm(); - - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseExpression: after parseTerm, current token = ${tokens[current].type}`); } while (current < tokens.length) { const token = tokens[current]; - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseExpression: while loop, current token = ${token.type}, value = ${token.value || 'N/A'}`); } @@ -723,7 +985,7 @@ export function parser(tokens) { name: 'add', args: [left, right] }; - } else if (token.type === TokenType.MINUS) { + } else if (token.type === TokenType.MINUS || token.type === TokenType.BINARY_MINUS) { current++; const right = parseTerm(); left = { @@ -759,13 +1021,23 @@ export function parser(tokens) { /** * Parse multiplication and division expressions * - * @returns {Object} AST node representing the multiplicative expression + * @returns {ASTNode} AST node representing the multiplicative expression * @description Parses multiplicative expressions (*, /, %) with higher * precedence than additive expressions. All operators are translated to * FunctionCall nodes using the corresponding combinator functions. + * + * Multiplicative expression parsing is crucial for arithmetic operations + * and mathematical calculations. It handles multiplication, division, + * and modulo operations. + * + * The function implements a recursive descent parser that handles + * operator precedence by repeatedly calling itself with the right operand + * until no more operators of the same precedence are found. + * + * Error handling includes checks for missing operators or operands. */ function parseTerm() { - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseTerm: starting, current token = ${tokens[current].type}`); } let left = parseApplication(); @@ -784,6 +1056,14 @@ export function parser(tokens) { token.type === TokenType.DIVIDE ? 'divide' : 'modulo', args: [left, right] }; + } else if (token.type === TokenType.MINUS) { + current++; + const right = parseFactor(); + left = { + type: 'FunctionCall', + name: 'subtract', + args: [left, right] + }; } else { break; } @@ -795,13 +1075,22 @@ export function parser(tokens) { /** * Parse power expressions and unary operators * - * @returns {Object} AST node representing the factor expression + * @returns {ASTNode} AST node representing the factor expression * @description Parses power expressions (^) and unary operators (not, -) * with the highest precedence among operators. All operators are translated * to FunctionCall nodes using the corresponding combinator functions. + * + * Factor expression parsing is crucial for exponentiation and unary + * operators. It handles power expressions and unary operators (not, -). + * + * The function implements a recursive descent parser that handles + * operator precedence by repeatedly calling itself with the right operand + * until no more operators of the same precedence are found. + * + * Error handling includes checks for missing operators or operands. */ function parseFactor() { - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parseFactor: starting, current token = ${tokens[current].type}`); } let left = parsePrimary(); @@ -829,7 +1118,7 @@ export function parser(tokens) { /** * Parse function composition expressions using the 'via' keyword * - * @returns {Object} AST node representing the composition expression + * @returns {ASTNode} AST node representing the composition expression * @throws {Error} For malformed composition expressions * @description Parses function composition using the 'via' keyword * with right-associative precedence: f via g via h = compose(f, compose(g, h)) @@ -853,8 +1142,18 @@ export function parser(tokens) { * Function composition is a fundamental feature that allows functions to be * combined naturally. The right-associative precedence means that composition * chains are built from right to left, which matches mathematical function - * composition notation. This enables powerful functional programming patterns - * where complex transformations can be built from simple, composable functions. + * composition notation. This enables functional programming patterns + * where transformations can be built from simple, composable functions. + * + * Composition parsing is essential for functional programming patterns + * where functions are composed together. It handles the 'via' keyword + * and recursively composes functions from right to left. + * + * The function implements a recursive descent parser that handles the + * 'via' keyword and recursively composes functions. + * + * Error handling includes checks for missing 'via' keyword or malformed + * composition chains. */ function parseComposition() { let left = parseFactor(); @@ -877,15 +1176,24 @@ export function parser(tokens) { /** * Parse function application (juxtaposition) * - * @returns {Object} AST node representing the function application + * @returns {ASTNode} AST node representing the function application * @description Parses function application using juxtaposition (f x) * with left-associative precedence: f g x = apply(apply(f, g), x) * * Function application using juxtaposition is the primary mechanism for * calling functions in the language. The left-associative precedence means * that application chains are built from left to right, which is intuitive - * for most programmers. This approach eliminates the need for parentheses + * for most programmers. This approach reduces the need for parentheses * in many cases while maintaining clear precedence rules. + * + * Function application parsing is essential for calling functions in + * the language. It handles juxtaposition of function and argument expressions. + * + * The function implements a recursive descent parser that handles + * left-associative function application. It repeatedly calls itself + * with the right operand until no more function applications are found. + * + * Error handling includes checks for missing function or argument expressions. */ function parseApplication() { let left = parseComposition(); @@ -906,7 +1214,7 @@ export function parser(tokens) { /** * Check if a token is a valid start of a function argument * - * @param {Object} token - Token to check + * @param {Token} token - Token to check * @returns {boolean} True if the token can start a function argument * @description Determines if a token can be the start of a function argument. * This is used to detect function application (juxtaposition) where function @@ -928,13 +1236,14 @@ export function parser(tokens) { token.type === TokenType.FALSE || token.type === TokenType.FUNCTION_REF || token.type === TokenType.FUNCTION_ARG || - token.type === TokenType.NOT; + token.type === TokenType.NOT || + token.type === TokenType.UNARY_MINUS; } /** * Parse table literals: {key: value, key2: value2} or {value1, value2, value3} * - * @returns {Object} TableLiteral AST node + * @returns {ASTNode} TableLiteral AST node * @throws {Error} For malformed table literals * @description Parses table literals with support for both key-value pairs * and array-like entries. Tables are the primary data structure in the language. @@ -945,6 +1254,16 @@ export function parser(tokens) { * - Mixed entries: {1, 2, name: "Alice", 3} * * Array-like entries are automatically assigned numeric keys starting from 1. + * + * Table literal parsing is essential for defining and accessing + * key-value or array-like data structures. It handles curly braces, + * keys, and values. + * + * The function implements a recursive descent parser that handles + * nested structures and supports both key-value and array-like entries. + * + * Error handling includes checks for missing braces, malformed keys, + * and unexpected tokens. */ function parseTableLiteral() { current++; // Skip '{' @@ -1135,7 +1454,7 @@ export function parser(tokens) { /** * Parse function calls: functionName arg1 arg2 ... * - * @returns {Object} FunctionCall AST node + * @returns {ASTNode} FunctionCall AST node * @description Parses function calls with multiple arguments. This function * is used by parsePrimary to detect when an identifier is followed by * expressions that should be treated as function arguments. @@ -1143,6 +1462,14 @@ export function parser(tokens) { * Function calls are detected by the presence of an identifier followed * by expressions that are not operators. The parser uses lookahead to * determine if an identifier should be treated as a function call. + * + * Function call parsing is essential for calling functions in the language. + * It handles the juxtaposition of function names and their arguments. + * + * The function implements a recursive descent parser that handles + * the function name, followed by a parenthesized list of arguments. + * + * Error handling includes checks for missing function name or arguments. */ function parseFunctionCall() { const functionName = tokens[current].value; @@ -1165,13 +1492,13 @@ export function parser(tokens) { /** * Parse primary expressions (literals, identifiers, parenthesized expressions) * - * @returns {Object} AST node representing the primary expression + * @returns {ASTNode} AST node representing the primary expression * @throws {Error} For unexpected tokens or malformed expressions * @description Parses the highest precedence expressions including literals, * identifiers, function calls, table access, and parenthesized expressions. * This is the foundation of the expression parsing hierarchy. * - * The function implements sophisticated function call detection by looking + * The function implements function call detection by looking * for identifiers followed by expressions that could be arguments. This * approach allows the language to support both traditional function calls * and the ML-style function application syntax. @@ -1184,6 +1511,16 @@ export function parser(tokens) { * - Parenthesized expressions: (x + y) * - Unary operators: not x, -x * - Function references: @functionName + * + * Primary expression parsing is the foundation of all other expression + * parsing. It handles literals, identifiers, function calls, table access, + * parenthesized expressions, and unary operators. + * + * The function implements a recursive descent parser that handles + * each specific type of primary expression. + * + * Error handling includes checks for missing literals, malformed + * identifiers, and unexpected tokens. */ function parsePrimary() { const token = tokens[current]; @@ -1192,7 +1529,7 @@ export function parser(tokens) { throw new Error('Unexpected end of input'); } - if (process.env.DEBUG) { + if (DEBUG) { console.log(`[DEBUG] parsePrimary: current token = ${token.type}, value = ${token.value || 'N/A'}`); } @@ -1338,9 +1675,9 @@ export function parser(tokens) { case TokenType.LEFT_PAREN: current++; - if (process.env.DEBUG) { - console.log(`[DEBUG] parsePrimary: parsing LEFT_PAREN, current token = ${tokens[current].type}`); - } + if (DEBUG) { + console.log(`[DEBUG] parsePrimary: parsing LEFT_PAREN, current token = ${tokens[current].type}`); + } const expression = parseLogicalExpression(); if (current >= tokens.length || tokens[current].type !== TokenType.RIGHT_PAREN) { throw new Error('Expected ")" after expression'); @@ -1377,6 +1714,7 @@ export function parser(tokens) { }; case TokenType.MINUS: + case TokenType.UNARY_MINUS: // Delegate unary minus to parseExpression for proper precedence return parseExpression(); @@ -1419,17 +1757,13 @@ export function parser(tokens) { </div> -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. </footer> -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> </body> </html> diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/scripts/linenumber.js b/js/scripting-lang/docs/baba-yaga/0.0.1/scripts/linenumber.js index 4354785..8d52f7e 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/scripts/linenumber.js +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/scripts/linenumber.js @@ -1,12 +1,12 @@ /*global document */ -(() => { - const source = document.getElementsByClassName('prettyprint source linenums'); - let i = 0; - let lineNumber = 0; - let lineId; - let lines; - let totalLines; - let anchorHash; +(function() { + var source = document.getElementsByClassName('prettyprint source linenums'); + var i = 0; + var lineNumber = 0; + var lineId; + var lines; + var totalLines; + var anchorHash; if (source && source[0]) { anchorHash = document.location.hash.substring(1); @@ -15,7 +15,7 @@ for (; i < totalLines; i++) { lineNumber++; - lineId = `line${lineNumber}`; + lineId = 'line' + lineNumber; lines[i].id = lineId; if (lineId === anchorHash) { lines[i].className += ' selected'; diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/scripts/prettify/Apache-License-2.0.txt b/js/scripting-lang/docs/baba-yaga/0.0.1/scripts/prettify/Apache-License-2.0.txt index d645695..d645695 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/scripts/prettify/Apache-License-2.0.txt +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/scripts/prettify/Apache-License-2.0.txt diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/scripts/prettify/lang-css.js b/js/scripting-lang/docs/baba-yaga/0.0.1/scripts/prettify/lang-css.js index 041e1f5..041e1f5 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/scripts/prettify/lang-css.js +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/scripts/prettify/lang-css.js diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/scripts/prettify/prettify.js b/js/scripting-lang/docs/baba-yaga/0.0.1/scripts/prettify/prettify.js index eef5ad7..eef5ad7 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/scripts/prettify/prettify.js +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/scripts/prettify/prettify.js diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/styles/jsdoc-default.css b/js/scripting-lang/docs/baba-yaga/0.0.1/styles/jsdoc-default.css new file mode 100644 index 0000000..c14e3b9 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/styles/jsdoc-default.css @@ -0,0 +1,692 @@ +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,500i,500,600,600i|Roboto); + +* { + box-sizing: border-box +} + +html, body { + height: 100%; + width: 100%; +} + +body { + color: #4d4e53; + background-color: white; + margin: 0 auto; + padding: 0; + font-family: 'Source Sans Pro', Helvetica, sans-serif; + font-size: 16px; + line-height: 160%; +} + +a, +a:active { + color: #0095dd; + text-decoration: none; +} + +a:hover { + text-decoration: underline +} + +p, ul, ol, blockquote { + margin-bottom: 1em; +} + +h1, h2, h3, h4, h5, h6 { + font-family: 'Roboto', sans-serif; +} + +h1, h2, h3, h4, h5, h6 { + color: #000; + font-weight: 400; + margin: 0; +} + +h1 { + font-weight: 300; + font-size: 48px; + margin: 1em 0 .5em; +} + +h1.page-title {margin-bottom: 10px;font-size: 34px;font-weight: 300;border-bottom: solid 2px #ddd;padding: .5em 0 .5em;margin-top: 0;} + +h2 { + font-size: 32px; + margin: 1.2em 0 .8em; + font-weight: bold; +} + +h3 { + /* margin-top: 1em; */ + /* margin-bottom: 16px; */ + /* font-weight: bold; */ + padding: 0; + margin: 1em 0 .6em; + font-size: 28px; + /* border-bottom: 1px solid #eee; */ + /* padding-bottom: 15px; */ +} + +h4 { + font-size: 18px; + margin: 1em 0 .2em; + color: #4d4e53; + /* border-bottom: 1px solid #eee; */ + padding-bottom: 8px; +} + +h5, .container-overview .subsection-title { + font-size: 120%; + /* letter-spacing: -0.01em; */ + margin: 20px 0 5px; +} + +h6 { + font-size: 100%; + letter-spacing: -0.01em; + margin: 6px 0 3px 0; + font-style: italic; +} + +tt, code, kbd, samp { + font-family: Consolas, Monaco, 'Andale Mono', monospace; + background: #f4f4f4; + padding: 1px 5px; + border-radius: 5px; + font-size: 14px; +} + +blockquote { + display: block; + border-left: 4px solid #eee; + margin: 0; + padding-left: 1em; + color: #888; +} + +.class-description { + font-size: 130%; + line-height: 140%; + margin-bottom: 1em; + margin-top: 1em; +} + +.class-description:empty { + margin: 0 +} + +/** Container **/ +#main { + float: right; + min-width: 360px; + width: calc(100% - 250px); + padding: 0 30px 20px 30px; +} + +header { + display: block +} + +section { + display: block; + background-color: #fff; + padding: 0; +} + +.variation { + display: none +} + +.signature-attributes { + font-size: 60%; + color: #aaa; + font-style: italic; + font-weight: lighter; +} + +/** Readme **/ + +.readme { + font-size: 16px; +} + +.readme h1, +.readme h2, +.readme h3, +.readme h4, +.readme h5 { + margin-top: 1em; + margin-bottom: 16px; + font-weight: bold; + padding: 0; +} + +.readme h1 { + font-size: 2em; + padding-bottom: 0.3em; +} + +.readme h2 { + font-size: 1.75em; + padding-bottom: 0.3em; +} + +.readme h3 { + font-size: 1.5em; + background-color: transparent; +} + +.readme h4 { + font-size: 1.25em; +} + +.readme h5 { + font-size: 1em; +} + +.readme img { + max-width: 100%; +} + +.readme ul, .readme ol { + padding-left: 2em; +} + +.readme pre > code { + font-size: 0.85em; +} + +.readme table { + margin-bottom: 1em; + border-collapse: collapse; + border-spacing: 0; +} + +.readme table tr { + background-color: #fff; + border-top: 1px solid #ccc; +} + +.readme table th, +.readme table td { + padding: 6px 13px; + border: 1px solid #ddd; +} + +.readme table tr:nth-child(2n) { + background-color: #f8f8f8; +} + +/** Nav **/ +nav { + float: left; + display: block; + width: 250px; + background: #fff; + overflow: auto; + position: fixed; + height: 100%; + padding: 10px; + border-right: 1px solid #eee; + /* box-shadow: 0 0 3px rgba(0,0,0,0.1); */ +} + +nav li { + list-style: none; + padding: 0; + margin: 0; +} + +.nav-heading { + margin-top: 10px; + font-weight: bold; +} + +.nav-heading a { + color: #888; + font-size: 14px; + display: inline-block; +} + +.nav-item-type { + /* margin-left: 5px; */ + width: 18px; + height: 18px; + display: inline-block; + text-align: center; + border-radius: 0.2em; + margin-right: 5px; + font-weight: bold; + line-height: 20px; + font-size: 13px; +} + +.type-function { + background: #B3E5FC; + color: #0288D1; +} + +.type-class { + background: #D1C4E9; + color: #4527A0; +} + +.type-member { + background: #C8E6C9; + color: #388E3C; +} + +.type-module { + background: #E1BEE7; + color: #7B1FA2; +} + + +/** Footer **/ +footer { + color: hsl(0, 0%, 28%); + margin-left: 250px; + display: block; + padding: 30px; + font-style: italic; + font-size: 90%; + border-top: 1px solid #eee; +} + +.ancestors { + color: #999 +} + +.ancestors a { + color: #999 !important; + text-decoration: none; +} + +.clear { + clear: both +} + +.important { + font-weight: bold; + color: #950B02; +} + +.yes-def { + text-indent: -1000px +} + +.type-signature { + color: #aaa +} + +.name, .signature { + font-family: Consolas, Monaco, 'Andale Mono', monospace +} + +.details { + margin-top: 14px; + border-left: 2px solid #DDD; + line-height: 30px; +} + +.details dt { + width: 120px; + float: left; + padding-left: 10px; +} + +.details dd { + margin-left: 70px +} + +.details ul { + margin: 0 +} + +.details ul { + list-style-type: none +} + +.details li { + margin-left: 30px +} + +.details pre.prettyprint { + margin: 0 +} + +.details .object-value { + padding-top: 0 +} + +.description { + margin-bottom: 1em; + margin-top: 1em; +} + +.code-caption { + font-style: italic; + font-size: 107%; + margin: 0; +} + +.prettyprint { + font-size: 13px; + border: 1px solid #ddd; + border-radius: 3px; + box-shadow: 0 1px 3px hsla(0, 0%, 0%, 0.05); + overflow: auto; +} + +.prettyprint.source { + width: inherit +} + +.prettyprint code { + font-size: 12px; + line-height: 18px; + display: block; + background-color: #fff; + color: #4D4E53; +} + +.prettyprint code:empty:before { + content: ''; +} + +.prettyprint > code { + padding: 15px +} + +.prettyprint .linenums code { + padding: 0 15px +} + +.prettyprint .linenums li:first-of-type code { + padding-top: 15px +} + +.prettyprint code span.line { + display: inline-block +} + +.prettyprint.linenums { + padding-left: 70px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.prettyprint.linenums ol { + padding-left: 0 +} + +.prettyprint.linenums li { + border-left: 3px #ddd solid +} + +.prettyprint.linenums li.selected, .prettyprint.linenums li.selected * { + background-color: lightyellow +} + +.prettyprint.linenums li * { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.params, .props { + border-spacing: 0; + border: 1px solid #ddd; + border-collapse: collapse; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0,0,0,0.1); + width: 100%; + font-size: 14px; + /* margin-left: 15px; */ +} + +.params .name, .props .name, .name code { + color: #4D4E53; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 100%; +} + +.params td, .params th, .props td, .props th { + margin: 0px; + text-align: left; + vertical-align: top; + padding: 10px; + display: table-cell; +} + +.params td { + border-top: 1px solid #eee +} + +.params thead tr, .props thead tr { + background-color: #fff; + font-weight: bold; +} + +.params .params thead tr, .props .props thead tr { + background-color: #fff; + font-weight: bold; +} + +.params td.description > p:first-child, .props td.description > p:first-child { + margin-top: 0; + padding-top: 0; +} + +.params td.description > p:last-child, .props td.description > p:last-child { + margin-bottom: 0; + padding-bottom: 0; +} + +dl.param-type { + /* border-bottom: 1px solid hsl(0, 0%, 87%); */ + margin: 0; + padding: 0; + font-size: 16px; +} + +.param-type dt, .param-type dd { + display: inline-block +} + +.param-type dd { + font-family: Consolas, Monaco, 'Andale Mono', monospace; + display: inline-block; + padding: 0; + margin: 0; + font-size: 14px; +} + +.disabled { + color: #454545 +} + +/* navicon button */ +.navicon-button { + display: none; + position: relative; + padding: 2.0625rem 1.5rem; + transition: 0.25s; + cursor: pointer; + user-select: none; + opacity: .8; +} +.navicon-button .navicon:before, .navicon-button .navicon:after { + transition: 0.25s; +} +.navicon-button:hover { + transition: 0.5s; + opacity: 1; +} +.navicon-button:hover .navicon:before, .navicon-button:hover .navicon:after { + transition: 0.25s; +} +.navicon-button:hover .navicon:before { + top: .825rem; +} +.navicon-button:hover .navicon:after { + top: -.825rem; +} + +/* navicon */ +.navicon { + position: relative; + width: 2.5em; + height: .3125rem; + background: #000; + transition: 0.3s; + border-radius: 2.5rem; +} +.navicon:before, .navicon:after { + display: block; + content: ""; + height: .3125rem; + width: 2.5rem; + background: #000; + position: absolute; + z-index: -1; + transition: 0.3s 0.25s; + border-radius: 1rem; +} +.navicon:before { + top: .625rem; +} +.navicon:after { + top: -.625rem; +} + +/* open */ +.nav-trigger:checked + label:not(.steps) .navicon:before, +.nav-trigger:checked + label:not(.steps) .navicon:after { + top: 0 !important; +} + +.nav-trigger:checked + label .navicon:before, +.nav-trigger:checked + label .navicon:after { + transition: 0.5s; +} + +/* Minus */ +.nav-trigger:checked + label { + transform: scale(0.75); +} + +/* Ã and + */ +.nav-trigger:checked + label.plus .navicon, +.nav-trigger:checked + label.x .navicon { + background: transparent; +} + +.nav-trigger:checked + label.plus .navicon:before, +.nav-trigger:checked + label.x .navicon:before { + transform: rotate(-45deg); + background: #FFF; +} + +.nav-trigger:checked + label.plus .navicon:after, +.nav-trigger:checked + label.x .navicon:after { + transform: rotate(45deg); + background: #FFF; +} + +.nav-trigger:checked + label.plus { + transform: scale(0.75) rotate(45deg); +} + +.nav-trigger:checked ~ nav { + left: 0 !important; +} + +.nav-trigger:checked ~ .overlay { + display: block; +} + +.nav-trigger { + position: fixed; + top: 0; + clip: rect(0, 0, 0, 0); +} + +.overlay { + display: none; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: 100%; + height: 100%; + background: hsla(0, 0%, 0%, 0.5); + z-index: 1; +} + +.section-method { + margin-bottom: 30px; + padding-bottom: 30px; + border-bottom: 1px solid #eee; +} + +@media only screen and (min-width: 320px) and (max-width: 680px) { + body { + overflow-x: hidden; + } + + nav { + background: #FFF; + width: 250px; + height: 100%; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: -250px; + z-index: 3; + padding: 0 10px; + transition: left 0.2s; + } + + .navicon-button { + display: inline-block; + position: fixed; + top: 1.5em; + right: 0; + z-index: 2; + } + + #main { + width: 100%; + min-width: 360px; + } + + #main h1.page-title { + margin: 1em 0; + } + + #main section { + padding: 0; + } + + footer { + margin-left: 0; + } +} + +@media only print { + nav { + display: none; + } + + #main { + float: none; + width: 100%; + } +} diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/styles/prettify-jsdoc.css b/js/scripting-lang/docs/baba-yaga/0.0.1/styles/prettify-jsdoc.css index 5a2526e..834a866 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/styles/prettify-jsdoc.css +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/styles/prettify-jsdoc.css @@ -9,7 +9,7 @@ /* string content */ .str { - color: #006400; + color: hsl(104, 100%, 24%); font-weight: normal; font-style: normal; } diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/styles/prettify-tomorrow.css b/js/scripting-lang/docs/baba-yaga/0.0.1/styles/prettify-tomorrow.css index b6f92a7..81e74d1 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/styles/prettify-tomorrow.css +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/styles/prettify-tomorrow.css @@ -9,35 +9,35 @@ @media screen { /* string content */ .str { - color: #718c00; } + color: hsl(104, 100%, 24%); } /* a keyword */ .kwd { - color: #8959a8; } + color: hsl(240, 100%, 50%); } /* a comment */ .com { - color: #8e908c; } + color: hsl(0, 0%, 60%); } /* a type name */ .typ { - color: #4271ae; } + color: hsl(240, 100%, 32%); } /* a literal value */ .lit { - color: #f5871f; } + color: hsl(240, 100%, 40%); } /* punctuation */ .pun { - color: #4d4d4c; } + color: #000000; } /* lisp open bracket */ .opn { - color: #4d4d4c; } + color: #000000; } /* lisp close bracket */ .clo { - color: #4d4d4c; } + color: #000000; } /* a markup tag name */ .tag { diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-Introduction.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-00_Introduction.html index 30bf5ab..a0dcea1 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-Introduction.html +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-00_Introduction.html @@ -2,29 +2,40 @@ <html lang="en"> <head> <meta charset="utf-8"> - <title>JSDoc: Tutorial: Introduction</title> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>00_Introduction - Documentation</title> - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> - <body> -<div id="main"> +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> - <h1 class="page-title">Tutorial: Introduction</h1> +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">00_Introduction</h1> + <section> <header> - - <h2>Introduction</h2> </header> <article> @@ -90,7 +101,7 @@ increment : x -> x + 1; result : increment (double 5); ..out result; /* Output: 11 */ </code></pre> -<p><strong>Key Point</strong>: Parentheses are needed for negative numbers: <code>f (-5)</code> not <code>f -5</code>.</p> +<p><strong>Key Point</strong>: Unary minus works without parentheses: <code>f -5</code> applies <code>f</code> to <code>negate(5)</code>. Use spaces around binary operators for clarity: <code>5 - 3</code> for subtraction. See the <a href="01_Juxtaposition_Function_Application.md#negative-numbers-and-spacing">Juxtaposition tutorial</a> for detailed information about operator spacing.</p> <h2>Pattern Matching with <code>when</code></h2> <p>Instead of if/else statements, we use pattern matching:</p> <pre class="prettyprint source lang-plaintext"><code>/* Basic pattern matching */ @@ -364,17 +375,13 @@ updated : t.set person "age" 31; </div> -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. </footer> -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> </body> </html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-01_Function_Calls.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-01_Function_Calls.html new file mode 100644 index 0000000..7614571 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-01_Function_Calls.html @@ -0,0 +1,203 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>01_Function_Calls - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">01_Function_Calls</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>Function Calls</h1> +<h2>What is Juxtaposition?</h2> +<p>In Baba Yaga you call functions by putting them next to each other.</p> +<pre class="prettyprint source lang-plaintext"><code>/* + JavaScript: f(x, y) + Baba Yaga: f x y +*/ +</code></pre> +<h2>Basic Examples</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Simple function calls */ +add 5 3; /* Instead of add(5, 3) */ +multiply 4 7; /* Instead of multiply(4, 7) */ +subtract 10 3; /* Instead of subtract(10, 3) */ + +/* Function calls with tables */ +/* ...we'll talk more about @ in a bit */ +map @double {1, 2, 3, 4, 5}; +filter @is_even {1, 2, 3, 4, 5, 6}; +reduce @add 0 {1, 2, 3, 4, 5}; +</code></pre> +<h2>How It Works</h2> +<p>The parser automatically translates juxtaposition into nested calls to <code>apply</code>, so that</p> +<pre class="prettyprint source lang-plaintext"><code>/* f x y becomes: apply(apply(f, x), y) */ +/* map double {1, 2, 3} becomes: apply(apply(map, double), {1, 2, 3}) */ +</code></pre> +<h2>Precedence Rules</h2> +<p>Juxtaposition has lower precedence than operators,</p> +<pre class="prettyprint source lang-plaintext"><code>result : add 5 multiply 3 4; +/* Parsed as: add 5 (multiply 3 4) */ +/* Result: 5 + (3 * 4) = 17 */ +/* Not as: (add 5 multiply) 3 4 */ +</code></pre> +<p>With Baba Yaga you'll use juxtaposition when you</p> +<ul> +<li>call functions with arguments</li> +<li>build function composition chains</li> +<li>work with combinators like <code>map</code>, <code>filter</code>, <code>reduce</code></li> +</ul> +<p>You won't use it, exactly, when you are</p> +<ul> +<li>defining functions (use <code>:</code> and <code>-></code>)</li> +<li>assigning values (use <code>:</code>)</li> +<li>using operators (use <code>+</code>, <code>-</code>, <code>*</code>, etc.)</li> +</ul> +<h2>Common Patterns</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Data processing pipeline */ +data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; +is_even : x -> x % 2 = 0; +double : x -> x * 2; +sum : x -> reduce add 0 x; + +/* Pipeline using juxtaposition */ +result : sum map double filter is_even data; +/* Reads: sum (map double (filter is_even data)) */ +/* Result: 60 */ +</code></pre> +<h2>Using Parentheses for Control</h2> +<p>Juxtaposition eliminates the need for parentheses in most cases, parentheses are available for when you need explicit control over precedence or grouping.</p> +<pre class="prettyprint source lang-plaintext"><code>/* Without parentheses - left-associative */ +result1 : add 5 multiply 3 4; +/* Parsed as: add 5 (multiply 3 4) */ +/* Result: 5 + (3 * 4) = 17 */ + +/* With parentheses - explicit grouping */ +result2 : add (add 1 2) (multiply 3 4); +/* Explicitly: (1 + 2) + (3 * 4) = 3 + 12 = 15 */ + +/* Complex nested operations */ +result3 : map double (filter is_even (map increment {1, 2, 3, 4, 5})); +/* Step by step: + 1. map increment {1, 2, 3, 4, 5} → {2, 3, 4, 5, 6} + 2. filter is_even {2, 3, 4, 5, 6} → {2, 4, 6} + 3. map double {2, 4, 6} → {4, 8, 12} +*/ + +/* Hard to read without parentheses */ +complex : map double filter is_even map increment {1, 2, 3, 4, 5}; + +/* Much clearer with parentheses */ +complex : map double (filter is_even (map increment {1, 2, 3, 4, 5})); + +/* Or break it into steps for maximum clarity */ +step1 : map increment {1, 2, 3, 4, 5}; +step2 : filter is_even step1; +step3 : map double step2; +</code></pre> +<p>Parentheses are also helpful for debugging because they let you isolate specific pieces of a program or chain.</p> +<pre class="prettyprint source lang-plaintext"><code>data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + +/* Test each step separately */ +filtered : filter @is_even data; +doubled : map @double filtered; +final : reduce @add 0 doubled; + +/* Or use parentheses to test intermediate results */ +test1 : filter is_even data; /* {2, 4, 6, 8, 10} */ +test2 : map double (filter is_even data); /* {4, 8, 12, 16, 20} */ +</code></pre> +<h2>Spacing Rules</h2> +<p>Baba Yaga uses spacing to distinguish between unary and binary operators...mostly just minus.</p> +<ul> +<li><strong>Unary minus</strong>: <code>-5</code> (no leading space) → <code>negate(5)</code></li> +<li><strong>Binary minus</strong>: <code>5 - 3</code> (spaces required) → <code>subtract(5, 3)</code></li> +<li><strong>Legacy fallback</strong>: <code>5-3</code> → <code>subtract(5, 3)</code> (but spaces are recommended)</li> +</ul> +<p>The parser distinguishes between these scenarios based off of spaces, and kinda best guess heuristics. It <em>should</em> work as expected in most cases.</p> +<ul> +<li><strong>Unary minus</strong> (negative numbers): <code>-5</code> → <code>negate(5)</code></li> +<li><strong>Binary minus</strong> (subtraction): <code>5 - 3</code> → <code>subtract(5, 3)</code></li> +</ul> +<p>Spacing makes expressions less ambiguous.</p> +<h3>Common Patterns</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Function calls with negative numbers */ +double : x -> x * 2; +result : double -5; /* unary minus */ +result2 : double (-5); /* explicit grouping */ + +/* Comparisons with negative numbers */ +is_negative : x -> x < 0; +test1 : is_negative -5; /* unary minus */ + +/* Complex expressions with negative numbers */ +validate_age : age -> (age >= 0) and (age <= 120); +test2 : validate_age -5; /* unary minus */ + +/* Arithmetic with proper spacing */ +result3 : -5 + 3; /* unary minus + binary plus */ +result4 : 5 - 3; /* binary minus with spaces */ +result5 : (-5) + 3; /* explicit grouping */ +</code></pre> +<h4>Best Practices</h4> +<ul> +<li><strong>Use spaces around binary operators</strong>: <code>5 - 3</code>, <code>5 + 3</code>, <code>5 * 3</code></li> +<li><strong>Unary minus works without parentheses</strong>: <code>-5</code>, <code>f -5</code></li> +<li><strong>Legacy syntax still works</strong>: <code>(-5)</code>, <code>5-3</code> (but spaces are recommended)</li> +<li><strong>When in doubt, use spaces</strong>: It makes code more readable and follows conventions</li> +</ul> +<h4>When You Might Encounter This</h4> +<ul> +<li><strong>Arithmetic operations</strong>: <code>-5 + 3</code>, <code>5 - 3</code>, <code>(-5) + 3</code></li> +<li><strong>Comparisons</strong>: <code>-5 >= 0</code>, <code>5 - 3 >= 0</code></li> +<li><strong>Function calls</strong>: <code>f -5</code>, <code>f (-5)</code>, <code>map double -3</code></li> +<li><strong>Logical expressions</strong>: <code>(-5 >= 0) and (-5 <= 120)</code></li> +<li><strong>Pattern matching</strong>: <code>when x is -5 then "negative five"</code></li> +</ul> +<p>To make everyone's life easier, use spaces around binary operators.</p> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-02_Function_Composition.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-02_Function_Composition.html new file mode 100644 index 0000000..314ce86 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-02_Function_Composition.html @@ -0,0 +1,167 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>02_Function_Composition - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">02_Function_Composition</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>Function Composition</h1> +<h2>What is the <code>via</code> Operator?</h2> +<p>The <code>via</code> operator is a function composition operator that combines functions from right to left.</p> +<pre class="prettyprint source lang-plaintext"><code>/* f via g = compose(f, g) */ +/* f via g via h = compose(f, compose(g, h)) */ +</code></pre> +<p>The <code>via</code> operator is right-associative and matches mathematical notation where <code>(f ∘ g ∘ h)(x) = f(g(h(x)))</code>.</p> +<pre class="prettyprint source lang-plaintext"><code>/* Define simple functions */ +double : x -> x * 2; +increment : x -> x + 1; +square : x -> x * x; + +/* Using via composition */ +result1 : double via increment 5; +/* Result: 12 (5+1=6, 6*2=12) */ + +/* Chained via composition */ +result2 : double via increment via square 3; +/* Result: 20 (3^2=9, 9+1=10, 10*2=20) */ +</code></pre> +<p>The key insight is that <code>via</code> groups from right to left.</p> +<pre class="prettyprint source lang-plaintext"><code>/* This expression: */ +double via increment via square 3 + +/* Groups as: */ +double via (increment via square) 3 + +/* Which translates to: */ +compose(double, compose(increment, square))(3) + +/* With the execution order of: */ +/* 1. square(3) = 9 */ +/* 2. increment(9) = 10 */ +/* 3. double(10) = 20 */ +</code></pre> +<h2>Precedence rules and <code>via</code></h2> +<p>The <code>via</code> operator has higher precedence than function application:</p> +<pre class="prettyprint source lang-plaintext"><code>/* via binds tighter than juxtaposition */ +double via increment 5 + +/* This is parsed as: */ +(double via increment) 5 +</code></pre> +<h2>More examples</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Data processing pipeline */ +data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; +is_even : x -> x % 2 = 0; +double : x -> x * 2; +sum : x -> reduce add 0 x; + +/* Pipeline using via */ +process_pipeline : sum via map double via filter is_even; +result : process_pipeline data; +/* Reads: sum via (map double via filter is_even) */ +/* Result: 60 */ +</code></pre> +<p>You'll note that we don't need to use <code>@</code> here -- <code>via</code> is kinda special-cased because it is an ergonomic feature. It can work with function names directly because it's specifically for function composition. Higher-order functions like <code>map</code>, <code>filter</code>, and <code>reduce</code> require explicit function references using <code>@</code> because they need a way to distinguish between calling a function immediately vs passing it as an argument while <code>via</code> only ever takes in functions.</p> +<p>A goal with the <code>via</code> operator is to align with mathematical function composition:</p> +<pre class="prettyprint source lang-plaintext"><code>/* Mathematical: (f ∘ g ∘ h)(x) = f(g(h(x))) */ +/* Baba Yaga: f via g via h x = f(g(h(x))) */ +</code></pre> +<h2>When to Use <code>via</code></h2> +<p><strong>Use <code>via</code> when you want:</strong></p> +<ul> +<li>Natural reading: <code>f via g via h</code> reads as "f then g then h"</li> +<li>Mathematical notation: Matches <code>(f ∘ g ∘ h)</code> notation</li> +<li>Concise syntax: Shorter than nested <code>compose</code> calls</li> +<li>Right-to-left flow: When you think of data flowing right to left</li> +</ul> +<p><strong>Don't use <code>via</code> when:</strong></p> +<ul> +<li>You need left-to-right composition (use <code>pipe</code>)</li> +<li>You want explicit mathematical style (use <code>compose</code>)</li> +<li>You're working with simple function calls (use juxtaposition)</li> +<li>If you don't wanna</li> +</ul> +<h2>Common Patterns</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Data transformation pipeline */ +data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; +is_even : x -> x % 2 = 0; +double : x -> x * 2; +sum : x -> reduce add 0 x; + +/* Pipeline: filter → map → reduce */ +process_pipeline : sum via map double via filter is_even; +result : process_pipeline data; +/* Result: 60 (filter evens: {2,4,6,8,10}, double: {4,8,12,16,20}, sum: 60) */ + +/* Validation chain */ +validate_positive : x -> x > 0; +validate_even : x -> x % 2 = 0; +validate_small : x -> x < 10; + +/* Chain validations */ +all_validations : validate_small via validate_even via validate_positive; +result : all_validations 6; /* 6 > 0, 6 % 2 = 0, 6 < 10 */ +/* Result: true */ +</code></pre> +<h2>Debugging <code>via</code> Chains</h2> +<p>To understand execution order, break down the chain:</p> +<pre class="prettyprint source lang-plaintext"><code>/* Complex chain: */ +result : square via double via increment via square 2; + +/* Break it down: */ +/* 1. square(2) = 4 */ +/* 2. increment(4) = 5 */ +/* 3. double(5) = 10 */ +/* 4. square(10) = 100 */ +/* Result: 100 */ +</code></pre> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-03_Table_Operations.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-03_Table_Operations.html new file mode 100644 index 0000000..e6d372e --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-03_Table_Operations.html @@ -0,0 +1,166 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>03_Table_Operations - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">03_Table_Operations</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>Table Operations</h1> +<h2>What are Element-Wise Operations?</h2> +<p>Element-wise operations automatically apply functions to every element in a table without explicit loops or iteration syntax like <code>forEach</code>.</p> +<pre class="prettyprint source lang-plaintext"><code>/* Instead of for each element in table, apply function */ +/* You write function table */ +numbers : {1, 2, 3, 4, 5}; +doubled : map @double numbers; /* {2, 4, 6, 8, 10} */ +</code></pre> +<p>Most main-stream programming languages require explicit loops or iteration. Baba Yaga takes a clue from array languages like APL, BQN, uiua, K, etc., and automatically handles element-wise operations.</p> +<h2>Basic Examples</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Define a simple function */ +double : x -> x * 2; + +/* Apply to table elements automatically */ +numbers : {1, 2, 3, 4, 5}; +result : map @double numbers; +/* Result: {2, 4, 6, 8, 10} */ + +/* Filter elements automatically */ +is_even : x -> x % 2 = 0; +evens : filter @is_even numbers; +/* Result: {2, 4} */ + +/* Reduce all elements automatically */ +sum : reduce @add 0 numbers; +/* Result: 15 (1+2+3+4+5) */ +</code></pre> +<h2>Table-Specific Operations</h2> +<p>The <code>t.</code> namespace provides additional element-wise operations especially meant for tables.</p> +<pre class="prettyprint source lang-plaintext"><code>/* Table-specific operations */ +data : {a: 1, b: 2, c: 3}; + +/* Get all keys */ +keys : t.keys data; /* {"a", "b", "c"} */ + +/* Get all values */ +values : t.values data; /* {1, 2, 3} */ + +/* Get key-value pairs */ +pairs : t.pairs data; /* {{key: "a", value: 1}, {key: "b", value: 2}, {key: "c", value: 3}} */ + +/* Check if key exists */ +has_a : t.has data "a"; /* true */ +has_d : t.has data "d"; /* false */ + +/* Get value by key */ +value_a : t.get data "a"; /* 1 */ +</code></pre> +<h2>Complex Examples</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Data processing pipeline */ +data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + +/* Define helper functions */ +is_even : x -> x % 2 = 0; +double : x -> x * 2; +sum : x -> reduce @add 0 x; + +/* Complete pipeline: filter → map → reduce */ +result : sum map double filter is_even data; +/* Step 1: filter @is_even data → {2, 4, 6, 8, 10} */ +/* Step 2: map @double {2, 4, 6, 8, 10} → {4, 8, 12, 16, 20} */ +/* Step 3: sum {4, 8, 12, 16, 20} → 60 */ +/* Result: 60 */ +</code></pre> +<h2>Nested Tables</h2> +<p>Element-wise operations work with nested table structures, too</p> +<pre class="prettyprint source lang-plaintext"><code>/* Nested table */ +people : { + alice: {name: "Alice", age: 30, scores: {85, 90, 88}}, + bob: {name: "Bob", age: 25, scores: {92, 87, 95}}, + charlie: {name: "Charlie", age: 35, scores: {78, 85, 82}} +}; + +/* Extract ages */ +ages : map (x -> x.age) people; +/* Result: {alice: 30, bob: 25, charlie: 35} */ + +/* Calculate average scores for each person */ +get_average : person -> reduce add 0 person.scores / 3; +averages : map get_average people; +/* Result: {alice: 87.67, bob: 91.33, charlie: 81.67} */ +</code></pre> +<h2>The <code>each</code> Combinator</h2> +<p>The <code>each</code> combinator provides multi-argument element-wise operations:</p> +<pre class="prettyprint source lang-plaintext"><code>/* each for multi-argument operations */ +numbers : {1, 2, 3, 4, 5}; +multipliers : {10, 20, 30, 40, 50}; + +/* Multiply corresponding elements */ +result : each @multiply numbers multipliers; +/* Result: {10, 40, 90, 160, 250} */ + +/* Compare corresponding elements */ +is_greater : each @greaterThan numbers {3, 3, 3, 3, 3}; +/* Result: {false, false, false, true, true} */ +</code></pre> +<h2>Immutability</h2> +<p>All element-wise operations return new tables. In Baba Yaga all values, including tables are immutable.</p> +<pre class="prettyprint source lang-plaintext"><code>/* Original table */ +original : {a: 1, b: 2, c: 3}; + +/* Operations return new tables */ +doubled : map @double original; /* {a: 2, b: 4, c: 6} */ +greater_then : x -> x > 1; +filtered : filter @greater_then original; /* {b: 2, c: 3} */ + +/* Original is unchanged */ +/* original is still {a: 1, b: 2, c: 3} */ +</code></pre> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-04_Currying.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-04_Currying.html new file mode 100644 index 0000000..8583d14 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-04_Currying.html @@ -0,0 +1,192 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>04_Currying - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">04_Currying</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>Currying</h1> +<h2>What is Partial Application?</h2> +<p>Partial application means that functions automatically return new functions when called with fewer arguments than they expect. This is also called currying.</p> +<pre class="prettyprint source lang-plaintext"><code>/* Functions automatically return new functions when partially applied */ +add : x y -> x + y; +add_five : add 5; /* Returns a function that adds 5 */ +result : add_five 3; /* 8 */ +</code></pre> +<p>Most programming languages require explicit syntax for partial application or currying. When using Baba Yagay, every function is automatically curried.</p> +<h2>Basic Examples</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Define a two-argument function */ +add : x y -> x + y; + +/* Call with both arguments */ +result1 : add 5 3; /* 8 */ + +/* Call with one argument - returns a new function */ +add_five : add 5; /* Returns: y -> 5 + y */ + +/* Call the returned function */ +result2 : add_five 3; /* 8 */ + +/* Chain partial applications */ +add_ten : add 10; /* y -> 10 + y */ +add_ten_five : add_ten 5; /* 15 */ +</code></pre> +<h2>How It Works</h2> +<p>Partial application happens automatically with nested function returns.</p> +<pre class="prettyprint source lang-plaintext"><code>/* When you define: add : x y -> x + y; */ +/* Baba Yaga creates: add = x -> (y -> x + y) */ + +/* When you call: add 5 */ +/* It returns: y -> 5 + y */ + +/* When you call: add 5 3 */ +/* It calls: (y -> 5 + y)(3) = 5 + 3 = 8 */ +</code></pre> +<p>Partial application works with any number of arguments.</p> +<pre class="prettyprint source lang-plaintext"><code>/* Three-argument function */ +multiply_add : x y z -> x * y + z; + +/* Partial application examples */ +multiply_by_two : multiply_add 2; /* y z -> 2 * y + z */ +multiply_by_two_add_ten : multiply_add 2 5; /* z -> 2 * 5 + z */ + +/* Full application */ +result1 : multiply_add 2 5 3; /* 2 * 5 + 3 = 13 */ +result2 : multiply_by_two 5 3; /* 2 * 5 + 3 = 13 */ +result3 : multiply_by_two_add_ten 3; /* 2 * 5 + 3 = 13 */ +</code></pre> +<p>All standard library functions support partial application, too!</p> +<pre class="prettyprint source lang-plaintext"><code>/* Arithmetic functions */ +double : multiply 2; /* x -> 2 * x */ +increment : add 1; /* x -> x + 1 */ +decrement : subtract 1; /* x -> x - 1 */ + +/* Comparison functions */ +is_positive : greaterThan 0; /* x -> x > 0 */ +is_even : equals 0; /* This won't work as expected - see below */ + +/* Logical functions */ +always_true : logicalOr true; /* x -> true || x */ +always_false : logicalAnd false; /* x -> false && x */ +</code></pre> +<h2>Common Patterns</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Pattern 1: Creating specialized functions */ +numbers : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + +/* Create specialized filters */ +is_even : x -> x % 2 = 0; +is_odd : x -> x % 2 = 1; +is_greater_than_five : x -> x > 5; + +/* Use with map and filter - note the @ operator for higher-order functions */ +evens : filter @is_even numbers; /* {2, 4, 6, 8, 10} */ +odds : filter @is_odd numbers; /* {1, 3, 5, 7, 9} */ +large_numbers : filter @is_greater_than_five numbers; /* {6, 7, 8, 9, 10} */ + +/* Pattern 2: Creating transformation functions */ +double : multiply 2; +triple : multiply 3; +add_ten : add 10; + +/* Apply transformations - @ operator required for map */ +doubled : map @double numbers; /* {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} */ +tripled : map @triple numbers; /* {3, 6, 9, 12, 15, 18, 21, 24, 27, 30} */ +plus_ten : map @add_ten numbers; /* {11, 12, 13, 14, 15, 16, 17, 18, 19, 20} */ +</code></pre> +<p>You can use partial application with function composition.</p> +<pre class="prettyprint source lang-plaintext"><code>/* Create specialized functions */ +double : multiply 2; +increment : add 1; +square : x -> x * x; + +/* Compose partially applied functions - @ operator required for compose */ +double_then_increment : compose @increment @double; +increment_then_square : compose @square @increment; + +/* Use in pipelines */ +result1 : double_then_increment 5; /* double(5)=10, increment(10)=11 */ +result2 : increment_then_square 5; /* increment(5)=6, square(6)=36 */ +</code></pre> +<h2>Table Operations with Partial Application</h2> +<p>The <code>t.</code> namespace functions also support partial application:</p> +<pre class="prettyprint source lang-plaintext"><code>/* Create specialized table operations */ +get_name : t.get "name"; +get_age : t.get "age"; +has_admin : t.has "admin"; + +/* Use with map - @ operator required for higher-order functions */ +people : { + alice: {name: "Alice", age: 30, admin: true}, + bob: {name: "Bob", age: 25, admin: false}, + charlie: {name: "Charlie", age: 35, admin: true} +}; + +names : map @get_name people; /* {alice: "Alice", bob: "Bob", charlie: "Charlie"} */ +ages : map @get_age people; /* {alice: 30, bob: 25, charlie: 35} */ +admins : map @has_admin people; /* {alice: true, bob: false, charlie: true} */ +</code></pre> +<h2>The <code>each</code> Combinator with Partial Application</h2> +<p>The <code>each</code> combinator works well with partial application:</p> +<pre class="prettyprint source lang-plaintext"><code>/* Create specialized comparison functions */ +is_greater_than_three : x -> x > 3; +is_less_than_seven : x -> x < 7; + +/* Use with each for element-wise comparison - @ operator required for each */ +numbers : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + +greater_than_three : each @is_greater_than_three numbers; +/* Result: {false, false, false, true, true, true, true, true, true, true} */ + +less_than_seven : each @is_less_than_seven numbers; +/* Result: {true, true, true, true, true, true, false, false, false, false} */ +</code></pre> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-05_Pattern_Matching.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-05_Pattern_Matching.html new file mode 100644 index 0000000..2752548 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-05_Pattern_Matching.html @@ -0,0 +1,260 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>05_Pattern_Matching - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">05_Pattern_Matching</h1> + + + <section> + +<header> + +</header> + +<article> + <h1><code>when</code> Expressions (Pattern Matching)</h1> +<h2>What are <code>when</code> Expressions?</h2> +<p>This is kinda where the whole idea for Baba Yaga started. Pattern matching is an approach to flow control. We do this in Baba Yaga using the <code>when</code> expression. It provides pattern matching functionality, allowing you to match values against patterns and execute different code based on the match.</p> +<pre class="prettyprint source lang-plaintext"><code>/* Pattern matching with when expressions */ +result : when x is + 0 then "zero" + 1 then "one" + _ then "other"; +</code></pre> +<p>Baba Yaga's pattern matching syntax has a lot of insporations, but especially <code>cond</code> patterns, Gleam's pattern matching, and Roc's, too.</p> +<h2>Basic Examples</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Simple pattern matching */ +x : 5; +result : when x is + 0 then "zero" + 1 then "one" + 2 then "two" + _ then "other"; +/* Result: "other" */ + +/* Pattern matching with numbers */ +grade : 85; +letter_grade : when grade is + 90 then "A" + 80 then "B" + 70 then "C" + 60 then "D" + _ then "F"; +/* Result: "B" */ +</code></pre> +<h2>Pattern Types</h2> +<h3>Literal Patterns</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Match exact values */ +result : when value is + true then "yes" + false then "no" + _ then "maybe"; +</code></pre> +<h3>Wildcard Pattern</h3> +<pre class="prettyprint source lang-plaintext"><code>/* _ matches anything */ +result : when x is + 0 then "zero" + _ then "not zero"; +</code></pre> +<h3>Function Reference Patterns</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Match function references using @ operator */ +double : x -> x * 2; +square : x -> x * x; + +which : x -> when x is + @double then "doubling function" + @square then "squaring function" + _ then "other function"; + +test1 : which double; +test2 : which square; +</code></pre> +<p>As is called out elsewhere, too, the <code>@</code> operator is required when matching function references in patterns. This distinguishes between calling a function and matching against the function itself.</p> +<h3>Boolean Patterns</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Match boolean values */ +result : when condition is + true then "condition is true" + false then "condition is false"; +</code></pre> +<h2>Complex Examples</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Grade classification with ranges */ +score : 85; +grade : when score is + when score >= 90 then "A" + when score >= 80 then "B" + when score >= 70 then "C" + when score >= 60 then "D" + _ then "F"; +/* Result: "B" */ + +/* Multiple conditions */ +x : 5; +y : 10; +result : when x is + when x = y then "equal" + when x > y then "x is greater" + when x < y then "x is less" + _ then "impossible"; +/* Result: "x is less" */ +</code></pre> +<h2>Advanced Pattern Matching</h2> +<p>You can match multiple values with complex expressions:</p> +<pre class="prettyprint source lang-plaintext"><code>/* FizzBuzz implementation using multi-value patterns */ +fizzbuzz : n -> + when (n % 3) (n % 5) is + 0 0 then "FizzBuzz" + 0 _ then "Fizz" + _ 0 then "Buzz" + _ _ then n; + +/* Test the FizzBuzz function */ +result1 : fizzbuzz 15; /* "FizzBuzz" */ +result2 : fizzbuzz 3; /* "Fizz" */ +result3 : fizzbuzz 5; /* "Buzz" */ +result4 : fizzbuzz 7; /* 7 */ +</code></pre> +<p>You can access table properties directly in patterns:</p> +<pre class="prettyprint source lang-plaintext"><code>/* User role checking */ +user : {role: "admin", level: 5}; + +access_level : when user.role is + "admin" then "full access" + "user" then "limited access" + _ then "no access"; +/* Result: "full access" */ +</code></pre> +<p>You can use function calls in patterns. Be warned, though -- they require parentheses to help disambiguate them from other references, though.</p> +<pre class="prettyprint source lang-plaintext"><code>/* Even/odd classification */ +is_even : n -> n % 2 = 0; + +classify : n -> + when (is_even n) is + true then "even number" + false then "odd number"; + +/* Test the classification */ +result1 : classify 4; /* "even number" */ +result2 : classify 7; /* "odd number" */ +</code></pre> +<p>Function calls in patterns must be wrapped in parentheses!</p> +<p>This'll work:</p> +<pre class="prettyprint source lang-plaintext"><code>when (is_even n) is true then "even" +when (complex_func x y) is result then "matched" +</code></pre> +<p>This won't work:</p> +<pre class="prettyprint source lang-plaintext"><code>when is_even n is true then "even" /* Ambiguous parsing */ +</code></pre> +<p>You can nest <code>when</code> expressions for complex logic:</p> +<pre class="prettyprint source lang-plaintext"><code>/* Nested pattern matching */ +x : 5; +y : 10; +result : when x is + 0 then when y is + 0 then "both zero" + _ then "x is zero" + 1 then when y is + 1 then "both one" + _ then "x is one" + _ then when y is + 0 then "y is zero" + 1 then "y is one" + _ then "neither special"; +/* Result: "neither special" */ +</code></pre> +<h2>Using <code>when</code> with Functions</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Function that uses pattern matching */ +classify_number : x -> when x is + 0 then "zero" + (x % 2 = 0) then "even" + (x % 2 = 1) then "odd" + _ then "unknown"; + +/* Use the function */ +result1 : classify_number 0; /* "zero" */ +result2 : classify_number 4; /* "even" */ +result3 : classify_number 7; /* "odd" */ +</code></pre> +<h2>Common Patterns</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Value classification */ +classify_age : age -> when age is + (age < 13) then "child" + (age < 20) then "teenager" + (age < 65) then "adult" + _ then "senior"; + +/* Error handling */ +safe_divide : x y -> when y is + 0 then "error: division by zero" + _ then x / y; + +/* Status mapping */ +status_code : 404; +status_message : x -> + when x is + 200 then "OK" + 404 then "Not Found" + 500 then "Internal Server Error" + _ then "Unknown Error"; +</code></pre> +<h2>When to Use <code>when</code> pattern matching</h2> +<p><strong>Use <code>when</code> expressions when:</strong></p> +<ul> +<li>You need to match values against multiple patterns</li> +<li>You want to replace complex if/else chains</li> +<li>You're working with enumerated values</li> +<li>You need to handle different cases based on value types</li> +<li>You want to make conditional logic more readable</li> +<li><strong>You need to match multiple values simultaneously</strong> (multi-value patterns)</li> +<li><strong>You want to access table properties in patterns</strong> (table access)</li> +<li><strong>You need to use function results in patterns</strong> (function calls with parentheses)</li> +<li><strong>You're implementing complex validation logic</strong> (multi-field validation)</li> +<li><strong>You need to match function references</strong> (using <code>@</code> operator)</li> +</ul> +<p><strong>Don't use <code>when</code> expressions when:</strong></p> +<ul> +<li>You only have a simple true/false condition (use logical operators)</li> +<li>You're working with complex nested conditions (consider breaking into functions)</li> +</ul> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-06_Immutable_Tables_with_Functional_Operations.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-06_Immutable_Tables.html index 5901725..3829487 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-06_Immutable_Tables_with_Functional_Operations.html +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-06_Immutable_Tables.html @@ -2,29 +2,40 @@ <html lang="en"> <head> <meta charset="utf-8"> - <title>JSDoc: Tutorial: 06_Immutable_Tables_with_Functional_Operations</title> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>06_Immutable_Tables - Documentation</title> - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> - <body> -<div id="main"> +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> - <h1 class="page-title">Tutorial: 06_Immutable_Tables_with_Functional_Operations</h1> +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">06_Immutable_Tables</h1> + <section> <header> - - <h2>06_Immutable_Tables_with_Functional_Operations</h2> </header> <article> @@ -90,13 +101,15 @@ has_job : t.has data "job"; /* false */ </code></pre> <h2>Element-Wise Operations</h2> <p>All element-wise operations return new tables:</p> -<pre class="prettyprint source lang-plaintext"><code>/* map returns new table */ +<pre class="prettyprint source lang-plaintext"><code>/* map returns new table - @ operator required for higher-order functions */ numbers : {a: 1, b: 2, c: 3}; -doubled : map double numbers; /* {a: 2, b: 4, c: 6} */ +double : x -> x * 2; +doubled : map @double numbers; /* {a: 2, b: 4, c: 6} */ /* numbers unchanged: {a: 1, b: 2, c: 3} */ -/* filter returns new table */ -filtered : filter (x -> x > 1) numbers; /* {b: 2, c: 3} */ +/* filter returns new table - @ operator required for higher-order functions */ +is_greater_than_one : x -> x > 1; +filtered : filter @is_greater_than_one numbers; /* {b: 2, c: 3} */ /* numbers unchanged: {a: 1, b: 2, c: 3} */ </code></pre> <h2>Complex Examples</h2> @@ -182,8 +195,11 @@ prod_config : t.merge base_config { user_data : {name: "Alice", age: 30, scores: {85, 90, 88}}; /* Transform user data */ -with_average : t.set user_data "average_score" (reduce add 0 user_data.scores / 3); -with_grade : t.set with_average "grade" (when with_average.average_score >= 90 then "A" when with_average.average_score >= 80 then "B" _ then "C"); +with_average : t.set user_data "average_score" (reduce @add 0 user_data.scores / 3); +with_grade : t.set with_average "grade" (when with_average.average_score is + when with_average.average_score >= 90 then "A" + when with_average.average_score >= 80 then "B" + _ then "C"); /* Pattern 3: State management */ initial_state : {count: 0, items: {}}; @@ -220,6 +236,7 @@ batch_update : table -> t.merge table { <li><strong>Original unchanged</strong> - source tables are never modified</li> <li><strong>Functional patterns</strong> - enables pure functional programming</li> <li><strong>Composable operations</strong> - operations can be chained safely</li> +<li><strong>@ operator required</strong> - for higher-order functions like <code>map</code>, <code>filter</code>, <code>reduce</code></li> </ol> <h2>Why This Matters</h2> <p>Immutable tables make the language safer and more functional:</p> @@ -237,17 +254,13 @@ batch_update : table -> t.merge table { </div> -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. </footer> -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> </body> </html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-07_Function_References_with_At_Symbol.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-07_Function_References.html index 2a61c18..88951fe 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-07_Function_References_with_At_Symbol.html +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-07_Function_References.html @@ -2,29 +2,40 @@ <html lang="en"> <head> <meta charset="utf-8"> - <title>JSDoc: Tutorial: 07_Function_References_with_At_Symbol</title> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>07_Function_References - Documentation</title> - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> - <body> -<div id="main"> +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> - <h1 class="page-title">Tutorial: 07_Function_References_with_At_Symbol</h1> +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">07_Function_References</h1> + <section> <header> - - <h2>07_Function_References_with_At_Symbol</h2> </header> <article> @@ -216,17 +227,13 @@ result : map function_to_use {1, 2, 3, 4, 5}; </div> -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. </footer> -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> </body> </html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-08_Combinator_Based_Architecture.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-08_Combinators.html index 2818c45..f5684e0 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-08_Combinator_Based_Architecture.html +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-08_Combinators.html @@ -2,29 +2,40 @@ <html lang="en"> <head> <meta charset="utf-8"> - <title>JSDoc: Tutorial: 08_Combinator_Based_Architecture</title> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>08_Combinators - Documentation</title> - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> - <body> -<div id="main"> +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> - <h1 class="page-title">Tutorial: 08_Combinator_Based_Architecture</h1> +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">08_Combinators</h1> + <section> <header> - - <h2>08_Combinator_Based_Architecture</h2> </header> <article> @@ -253,17 +264,13 @@ build_config : base_config overrides -> </div> -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. </footer> -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> </body> </html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-09_No_Explicit_Return_Statements.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-09_Expression_Based.html index 9da0510..0495cb0 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-09_No_Explicit_Return_Statements.html +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-09_Expression_Based.html @@ -2,29 +2,40 @@ <html lang="en"> <head> <meta charset="utf-8"> - <title>JSDoc: Tutorial: 09_No_Explicit_Return_Statements</title> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>09_Expression_Based - Documentation</title> - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> - <body> -<div id="main"> +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> - <h1 class="page-title">Tutorial: 09_No_Explicit_Return_Statements</h1> +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">09_Expression_Based</h1> + <section> <header> - - <h2>09_No_Explicit_Return_Statements</h2> </header> <article> @@ -198,17 +209,13 @@ result : build_config base "development"; </div> -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. </footer> -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> </body> </html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-10_Table_Literals_as_Primary_Data_Structure.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-10_Tables_Deep_Dive.html index e3af544..93ed0f4 100644 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-10_Table_Literals_as_Primary_Data_Structure.html +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-10_Tables_Deep_Dive.html @@ -2,29 +2,40 @@ <html lang="en"> <head> <meta charset="utf-8"> - <title>JSDoc: Tutorial: 10_Table_Literals_as_Primary_Data_Structure</title> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>10_Tables_Deep_Dive - Documentation</title> - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> - <body> -<div id="main"> +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> - <h1 class="page-title">Tutorial: 10_Table_Literals_as_Primary_Data_Structure</h1> +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">10_Tables_Deep_Dive</h1> + <section> <header> - - <h2>10_Table_Literals_as_Primary_Data_Structure</h2> </header> <article> @@ -148,15 +159,17 @@ length : t.length data; /* 3 */ </code></pre> <h2>Element-Wise Operations</h2> <p>Tables work seamlessly with element-wise operations:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Map over table values */ +<pre class="prettyprint source lang-plaintext"><code>/* Map over table values - @ operator required for higher-order functions */ numbers : {a: 1, b: 2, c: 3, d: 4, e: 5}; -doubled : map double numbers; /* {a: 2, b: 4, c: 6, d: 8, e: 10} */ +double : x -> x * 2; +doubled : map @double numbers; /* {a: 2, b: 4, c: 6, d: 8, e: 10} */ -/* Filter table values */ -evens : filter is_even numbers; /* {b: 2, d: 4} */ +/* Filter table values - @ operator required for higher-order functions */ +is_even : x -> x % 2 = 0; +evens : filter @is_even numbers; /* {b: 2, d: 4} */ -/* Reduce table values */ -sum : reduce add 0 numbers; /* 15 */ +/* Reduce table values - @ operator required for higher-order functions */ +sum : reduce @add 0 numbers; /* 15 */ </code></pre> <h2>Common Patterns</h2> <h3>Configuration Objects</h3> @@ -191,10 +204,10 @@ raw_data : { transform_user : user -> { name: user.name, age: user.age, - average_score: reduce add 0 user.scores / 3 + average_score: reduce @add 0 user.scores / 3 }; -transformed_users : map transform_user raw_data.users; +transformed_users : map @transform_user raw_data.users; /* Result: { alice: {name: "Alice", age: 30, average_score: 87.67}, bob: {name: "Bob", age: 25, average_score: 91.33} @@ -218,9 +231,9 @@ company_data : { } }; -/* Extract all employee names */ -get_names : dept -> map (emp -> emp.name) dept.employees; -all_names : map get_names company_data.departments; +/* Extract all employee names - @ operator required for higher-order functions */ +get_names : dept -> map @(emp -> emp.name) dept.employees; +all_names : map @get_names company_data.departments; /* Result: { engineering: {"Alice", "Bob"}, marketing: {"Charlie"} @@ -248,7 +261,7 @@ all_names : map get_names company_data.departments; <li><strong>Unified structure</strong> - one data type for all collections</li> <li><strong>Flexible syntax</strong> - supports both key-value pairs and array elements</li> <li><strong>Nested support</strong> - can contain other tables</li> -<li><strong>Element-wise operations</strong> - works with <code>map</code>, <code>filter</code>, <code>reduce</code></li> +<li><strong>Element-wise operations</strong> - works with <code>map</code>, <code>filter</code>, <code>reduce</code> (using <code>@</code> operator)</li> <li><strong>Immutable operations</strong> - all operations return new tables</li> </ol> <h2>Why This Matters</h2> @@ -267,17 +280,13 @@ all_names : map get_names company_data.departments; </div> -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. </footer> -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> </body> </html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-11_Standard_Library.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-11_Standard_Library.html new file mode 100644 index 0000000..e56d300 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-11_Standard_Library.html @@ -0,0 +1,164 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>11_Standard_Library - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">11_Standard_Library</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>Standard Library Overview</h1> +<h2>What is the Standard Library?</h2> +<p>The Baba Yaga standard library provides a comprehensive set of functions for common operations. Everything is a function - even operators like <code>+</code> and <code>*</code> are just functions under the hood.</p> +<h2>Core Categories</h2> +<h3>Arithmetic Functions</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Basic arithmetic */ +add 5 3; /* 8 */ +subtract 10 4; /* 6 */ +multiply 6 7; /* 42 */ +divide 20 5; /* 4 */ +modulo 17 5; /* 2 */ +power 2 8; /* 256 */ +negate 42; /* -42 */ +</code></pre> +<h3>Comparison Functions</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Comparisons return booleans */ +equals 5 5; /* true */ +notEquals 3 7; /* true */ +lessThan 3 7; /* true */ +greaterThan 10 5; /* true */ +lessEqual 5 5; /* true */ +greaterEqual 8 3; /* true */ +</code></pre> +<h3>Logical Functions</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Logical operations */ +logicalAnd true false; /* false */ +logicalOr true false; /* true */ +logicalXor true true; /* false */ +logicalNot true; /* false */ +</code></pre> +<h3>Higher-Order Functions</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Function manipulation */ +compose @double @increment 5; /* 12 */ +pipe @increment @double 5; /* 12 */ +apply @add 3 4; /* 7 */ +curry @add 3; /* function that adds 3 */ +</code></pre> +<h3>Collection Functions</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Working with collections */ +map @double {1, 2, 3}; /* {2, 4, 6} */ +filter @is_even {1, 2, 3, 4}; /* {2, 4} */ +reduce @add 0 {1, 2, 3}; /* 6 */ +each @add {1, 2} {10, 20}; /* {11, 22} */ +</code></pre> +<h3>Enhanced Combinators</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Utility functions */ +identity 42; /* 42 */ +constant 5 10; /* 5 */ +flip @subtract 5 10; /* 5 (10 - 5) */ +on @length @add "hello" "world"; /* 10 */ +both @is_even @is_positive 6; /* true */ +either @is_even @is_negative 6; /* true */ +</code></pre> +<h2>Table Operations (<code>t.</code> namespace)</h2> +<p>All table operations are immutable and return new tables:</p> +<pre class="prettyprint source lang-plaintext"><code>/* Table-specific operations */ +data : {a: 1, b: 2, c: 3}; +doubled : t.map @double data; /* {a: 2, b: 4, c: 6} */ +filtered : t.filter @is_even data; /* {b: 2} */ +updated : t.set data "d" 4; /* {a: 1, b: 2, c: 3, d: 4} */ +removed : t.delete data "b"; /* {a: 1, c: 3} */ +merged : t.merge data {d: 4, e: 5}; /* {a: 1, b: 2, c: 3, d: 4, e: 5} */ +value : t.get data "a"; /* 1 */ +has_key : t.has data "b"; /* true */ +count : t.length data; /* 3 */ +</code></pre> +<h2>When to Use Which Function</h2> +<ul> +<li><strong>Use <code>map</code></strong> for transforming every element in a collection</li> +<li><strong>Use <code>filter</code></strong> for selecting elements that match a condition</li> +<li><strong>Use <code>reduce</code></strong> for combining all elements into a single value</li> +<li><strong>Use <code>each</code></strong> for element-wise operations across multiple collections</li> +<li><strong>Use <code>t.map</code>/<code>t.filter</code></strong> when you want to emphasize table operations</li> +<li><strong>Use <code>compose</code></strong> for mathematical-style function composition (right-to-left)</li> +<li><strong>Use <code>pipe</code></strong> for pipeline-style composition (left-to-right)</li> +</ul> +<h2>Common Patterns</h2> +<pre class="prettyprint source lang-plaintext"><code>/* Data processing pipeline */ +data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; +is_even : x -> x % 2 = 0; +double : x -> x * 2; +sum : x -> reduce @add 0 x; + +/* Process: filter evens, double them, sum the result */ +result : sum map @double filter @is_even data; +/* Result: 60 */ + +/* Table transformation */ +users : { + alice: {name: "Alice", age: 25}, + bob: {name: "Bob", age: 30} +}; +get_age : x -> x.age; +is_adult : x -> x >= 18; +format_age : x -> x + " years old"; + +/* Get formatted ages of adult users */ +adult_ages : map @format_age filter @is_adult map @get_age users; +/* Result: {alice: "25 years old", bob: "30 years old"} */ +</code></pre> +<h2>Next Steps</h2> +<p>Now that you understand the standard library, explore:</p> +<ul> +<li><a href="14_Advanced_Combinators.md">Advanced Combinators</a> for complex patterns</li> +<li><a href="12_IO_Operations.md">IO Operations</a> for input/output</li> +<li><a href="13_Error_Handling.md">Error Handling</a> for robust programs</li> +</ul> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-12_IO_Operations.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-12_IO_Operations.html new file mode 100644 index 0000000..6b9df04 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-12_IO_Operations.html @@ -0,0 +1,229 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>12_IO_Operations - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">12_IO_Operations</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>IO Operations</h1> +<h2>What are IO Operations?</h2> +<p>IO (Input/Output) operations allow your functional programs to interact with the outside world. Baba Yaga provides a minimal set of IO operations that keep side effects contained and explicit.</p> +<h2>Basic Output</h2> +<h3>Simple Output</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Output values to console */ +..out "Hello, World!"; +..out 42; +..out true; +..out {name: "Alice", age: 30}; +</code></pre> +<h3>Output with Expressions</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Output computed values */ +result : 5 + 3 * 2; +..out result; /* Output: 11 */ + +/* Output function results */ +double : x -> x * 2; +..out double 7; /* Output: 14 */ + +/* Output table operations */ +numbers : {1, 2, 3, 4, 5}; +doubled : map @double numbers; +..out doubled; /* Output: {2, 4, 6, 8, 10} */ +</code></pre> +<h2>Assertions</h2> +<p>Assertions help you verify your program's behavior:</p> +<pre class="prettyprint source lang-plaintext"><code>/* Basic assertions */ +..assert 5 = 5; /* Passes */ +..assert 3 + 2 = 5; /* Passes */ +..assert true; /* Passes */ +..assert false; /* Fails with error */ + +/* Assertions with messages */ +..assert "5 equals 5" 5 = 5; /* Passes */ +..assert "3 + 2 equals 5" 3 + 2 = 5; /* Passes */ +..assert "This will fail" 1 = 2; /* Fails with message */ +</code></pre> +<h3>Testing Functions</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Test function behavior */ +factorial : n -> + when n is + 0 then 1 + _ then n * (factorial (n - 1)); + +/* Test cases */ +..assert "factorial 0 = 1" factorial 0 = 1; +..assert "factorial 1 = 1" factorial 1 = 1; +..assert "factorial 5 = 120" factorial 5 = 120; +</code></pre> +<h2>Emit and Listen Pattern</h2> +<p>The <code>..emit</code> and <code>..listen</code> pattern provides a way to interface functional code with external systems:</p> +<h3>Emitting Events</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Emit events with data */ +..emit "user_created" {id: 123, name: "Alice"}; +..emit "data_processed" {count: 42, success: true}; +..emit "error_occurred" {message: "Invalid input", code: 400}; +</code></pre> +<h3>Listening for Events</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Listen for specific events */ +..listen "user_created" handle_user_created; +..listen "data_processed" handle_data_processed; +..listen "error_occurred" handle_error; +</code></pre> +<h3>Event Handlers</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Define event handlers */ +handle_user_created : user_data -> + ..out "New user created:"; + ..out user_data.name; + +handle_data_processed : result -> + when result.success is + true then ..out "Processing successful: " + result.count + " items" + false then ..out "Processing failed"; + +handle_error : error -> + ..out "Error: " + error.message; + ..out "Code: " + error.code; +</code></pre> +<h2>Input Operations</h2> +<h3>Reading Input</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Read input from user */ +name : ..in "Enter your name: "; +..out "Hello, " + name + "!"; + +/* Read and process input */ +age_input : ..in "Enter your age: "; +age : parseInt age_input; +..out "You are " + age + " years old"; +</code></pre> +<h2>IO Best Practices</h2> +<h3>Keep Side Effects Explicit</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Good: Clear IO operations */ +process_data : data -> + result : transform data; + ..out "Processing complete"; + ..emit "data_processed" result; + result; + +/* Avoid: Hidden side effects in pure functions */ +bad_transform : data -> + ..out "Processing..."; /* Side effect in "pure" function */ + data * 2; +</code></pre> +<h3>Use Assertions for Testing</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Test your functions thoroughly */ +is_even : x -> x % 2 = 0; +double : x -> x * 2; + +/* Test individual functions */ +..assert "0 is even" is_even 0 = true; +..assert "1 is not even" is_even 1 = false; +..assert "double 5 = 10" double 5 = 10; + +/* Test composed functions */ +doubled_evens : compose @double @is_even; +..assert "doubled_evens 6 = true" doubled_evens 6 = true; +</code></pre> +<h3>Structured Output</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Use tables for structured output */ +user : {name: "Alice", age: 30, city: "NYC"}; +..out "User Profile:"; +..out " Name: " + user.name; +..out " Age: " + user.age; +..out " City: " + user.city; + +/* Or output the entire structure */ +..out user; +</code></pre> +<h2>Common Patterns</h2> +<h3>Data Processing Pipeline</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Process data with IO feedback */ +data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; +..out "Processing " + t.length data + " items"; + +is_even : x -> x % 2 = 0; +double : x -> x * 2; +sum : x -> reduce @add 0 x; + +/* Process with progress updates */ +evens : filter @is_even data; +..out "Found " + t.length evens + " even numbers"; + +doubled : map @double evens; +..out "Doubled values:"; +..out doubled; + +total : sum doubled; +..out "Sum of doubled evens: " + total; + +/* Emit final result */ +..emit "processing_complete" {input_count: t.length data, result: total}; +</code></pre> +<h3>Error Handling</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Handle potential errors gracefully */ +safe_divide : x y -> + when y = 0 then + ..emit "division_error" {dividend: x, divisor: y}; + "Error: Division by zero" + _ then x / y; + +/* Test error handling */ +..out safe_divide 10 2; /* 5 */ +..out safe_divide 10 0; /* Error: Division by zero */ +</code></pre> +<h2>Next Steps</h2> +<p>Now that you understand IO operations, explore:</p> +<ul> +<li><a href="13_Error_Handling.md">Error Handling</a> for robust error management</li> +<li><a href="15_Integration_Patterns.md">Integration Patterns</a> for external system integration</li> +<li><a href="16_Best_Practices.md">Best Practices</a> for writing clean code</li> +</ul> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-13_Error_Handling.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-13_Error_Handling.html new file mode 100644 index 0000000..d28d63d --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-13_Error_Handling.html @@ -0,0 +1,276 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>13_Error_Handling - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">13_Error_Handling</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>Error Handling</h1> +<h2>What is Error Handling?</h2> +<p>Error handling in Baba Yaga is based on functional programming principles - instead of throwing exceptions, we use pattern matching and return values to handle errors gracefully.</p> +<h2>Basic Error Handling</h2> +<h3>Using Pattern Matching</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Handle division by zero */ +safe_divide : x y -> + when y = 0 then "Error: Division by zero" + _ then x / y; + +/* Test the function */ +..out safe_divide 10 2; /* 5 */ +..out safe_divide 10 0; /* Error: Division by zero */ +</code></pre> +<h3>Return Error Values</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Return structured error information */ +divide_with_error : x y -> + when y = 0 then {error: true, message: "Division by zero", dividend: x} + _ then {error: false, result: x / y}; + +/* Handle the result */ +result : divide_with_error 10 0; +when result.error is + true then ..out "Error: " + result.message + false then ..out "Result: " + result.result; +</code></pre> +<h2>Assertions for Validation</h2> +<h3>Input Validation</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Validate function inputs */ +factorial : n -> + ..assert "n must be non-negative" n >= 0; + when n is + 0 then 1 + _ then n * (factorial (n - 1)); + +/* Test validation */ +..out factorial 5; /* 120 */ +/* factorial -1; */ /* Would fail assertion */ +</code></pre> +<h3>Data Validation</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Validate table structure */ +validate_user : user -> + ..assert "user must have name" t.has user "name"; + ..assert "user must have age" t.has user "age"; + ..assert "age must be positive" user.age > 0; + user; + +/* Test validation */ +valid_user : {name: "Alice", age: 30}; +invalid_user : {name: "Bob"}; /* Missing age */ + +validated : validate_user valid_user; +/* validate_user invalid_user; */ /* Would fail assertion */ +</code></pre> +<h2>Error Patterns</h2> +<h3>Maybe Pattern</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Maybe pattern for optional values */ +find_user : id users -> + when t.has users id then {just: true, value: t.get users id} + _ then {just: false}; + +/* Handle maybe results */ +users : { + alice: {name: "Alice", age: 30}, + bob: {name: "Bob", age: 25} +}; + +result : find_user "alice" users; +when result.just is + true then ..out "Found: " + result.value.name + false then ..out "User not found"; + +not_found : find_user "charlie" users; +when not_found.just is + true then ..out "Found: " + not_found.value.name + false then ..out "User not found"; +</code></pre> +<h3>Either Pattern</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Either pattern for success/error */ +parse_number : input -> + parsed : parseInt input; + when parsed = NaN then {left: "Invalid number: " + input} + _ then {right: parsed}; + +/* Handle either results */ +valid : parse_number "42"; +when valid.left is + _ then ..out "Error: " + valid.left + _ then ..out "Success: " + valid.right; + +invalid : parse_number "abc"; +when invalid.left is + _ then ..out "Error: " + invalid.left + _ then ..out "Success: " + invalid.right; +</code></pre> +<h2>Error Recovery</h2> +<h3>Fallback Values</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Provide fallback values */ +get_config : key default_value config -> + when t.has config key then t.get config key + _ then default_value; + +/* Use with fallbacks */ +config : {debug: true, timeout: 30}; +debug_mode : get_config "debug" false config; /* true */ +retries : get_config "retries" 3 config; /* 3 (fallback) */ +</code></pre> +<h3>Retry Logic</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Simple retry with exponential backoff */ +retry_operation : operation max_attempts -> + attempt_operation : attempt -> + when attempt > max_attempts then {error: "Max attempts exceeded"} + _ then + result : operation; + when result.error is + true then + delay : power 2 attempt; /* Exponential backoff */ + ..out "Attempt " + attempt + " failed, retrying in " + delay + "ms"; + attempt_operation (attempt + 1) + false then result; + + attempt_operation 1; +</code></pre> +<h2>Error Propagation</h2> +<h3>Chaining Error Handling</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Chain operations that might fail */ +process_user_data : user_id -> + /* Step 1: Find user */ + user_result : find_user user_id users; + when user_result.just is + false then {error: "User not found: " + user_id} + _ then + user : user_result.value; + + /* Step 2: Validate user */ + validation_result : validate_user user; + when validation_result.error is + true then {error: "Invalid user data"} + _ then + /* Step 3: Process user */ + processed : process_user user; + {success: true, data: processed}; +</code></pre> +<h2>Testing Error Conditions</h2> +<h3>Test Error Cases</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Test both success and error cases */ +test_safe_divide : -> + /* Test successful division */ + ..assert "10 / 2 = 5" safe_divide 10 2 = 5; + + /* Test division by zero */ + error_result : safe_divide 10 0; + ..assert "Division by zero returns error" error_result = "Error: Division by zero"; + + ..out "All tests passed"; + +/* Run the tests */ +test_safe_divide; +</code></pre> +<h3>Property-Based Testing</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Test properties of error handling */ +test_divide_properties : -> + /* Property: safe_divide x 1 = x */ + ..assert "x / 1 = x" safe_divide 42 1 = 42; + + /* Property: safe_divide x 0 always returns error */ + ..assert "x / 0 always errors" safe_divide 5 0 = "Error: Division by zero"; + ..assert "x / 0 always errors" safe_divide -3 0 = "Error: Division by zero"; + + /* Property: safe_divide 0 x = 0 (when x ≠ 0) */ + ..assert "0 / x = 0" safe_divide 0 5 = 0; + + ..out "All properties verified"; +</code></pre> +<h2>Best Practices</h2> +<h3>Keep Error Handling Explicit</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Good: Explicit error handling */ +process_data : data -> + when data = null then {error: "No data provided"} + _ then + result : transform data; + when result.error is + true then result + false then {success: true, data: result.data}; + +/* Avoid: Silent failures */ +bad_process : data -> + transform data; /* What if this fails? */ +</code></pre> +<h3>Use Descriptive Error Messages</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Good: Descriptive errors */ +validate_age : age -> + when age < 0 then "Age cannot be negative: " + age + when age > 150 then "Age seems unrealistic: " + age + _ then age; + +/* Avoid: Generic errors */ +bad_validate : age -> + when age < 0 then "Invalid input" /* Too generic */ + _ then age; +</code></pre> +<h3>Handle Errors at the Right Level</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Handle errors where you have context */ +process_user : user_id -> + user : find_user user_id; + when user.just is + false then + ..emit "user_not_found" {user_id: user_id, timestamp: now()}; + "User not found" + _ then + process_user_data user.value; +</code></pre> +<h2>Next Steps</h2> +<p>Now that you understand error handling, explore:</p> +<ul> +<li><a href="15_Integration_Patterns.md">Integration Patterns</a> for external system error handling</li> +<li><a href="14_Advanced_Combinators.md">Advanced Combinators</a> for error handling patterns</li> +<li><a href="16_Best_Practices.md">Best Practices</a> for writing robust code</li> +</ul> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-14_Advanced_Combinators.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-14_Advanced_Combinators.html new file mode 100644 index 0000000..4921ec2 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-14_Advanced_Combinators.html @@ -0,0 +1,315 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>14_Advanced_Combinators - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">14_Advanced_Combinators</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>Advanced Combinators</h1> +<h2>What are Advanced Combinators?</h2> +<p>Advanced combinators are powerful patterns that combine multiple functions and operations to solve complex problems. They build on the basic combinators you've already learned.</p> +<h2>Partial Application and Currying</h2> +<h3>Creating Specialized Functions</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Basic partial application */ +add : x y -> x + y; +add_ten : add 10; +result : add_ten 5; /* 15 */ + +/* Complex partial application */ +format_with_prefix : prefix value -> prefix + ": " + value; +format_name : format_with_prefix "Name"; +format_age : format_with_prefix "Age"; + +person : {name: "Alice", age: 30}; +formatted_name : format_name person.name; /* "Name: Alice" */ +formatted_age : format_age person.age; /* "Age: 30" */ +</code></pre> +<h3>Currying with Combinators</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Create specialized functions */ +multiply_by : x y -> x * y; +double : multiply_by 2; +triple : multiply_by 3; + +numbers : {1, 2, 3, 4, 5}; +doubled : map @double numbers; /* {2, 4, 6, 8, 10} */ +tripled : map @triple numbers; /* {3, 6, 9, 12, 15} */ +</code></pre> +<h2>Higher-Order Combinators</h2> +<h3>Combinators that Work with Other Combinators</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Apply a combinator to multiple collections */ +apply_to_all : combinator collections -> + reduce @t.merge {} (map @combinator collections); + +/* Example usage */ +add_one : x -> x + 1; +collections : {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; +all_incremented : apply_to_all @map @add_one collections; +/* Result: {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10} */ +</code></pre> +<h3>Composing Multiple Functions</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Compose many functions together */ +compose_many : functions -> + reduce @compose @identity functions; + +/* Example usage */ +double_then_increment : compose @increment @double; +complex_transform : compose @double_then_increment @square; +result : complex_transform 3; +/* Result: 19 (3^2=9, 9*2=18, 18+1=19) */ +</code></pre> +<h2>Memoization Pattern</h2> +<h3>Caching Function Results</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Simple memoization */ +memoize : f -> { + cache: {}, + compute: x -> + when t.has cache x then t.get cache x + _ then { + result: f x, + new_cache: t.set cache x (f x) + } +}; + +/* Using memoized function */ +expensive_calc : x -> x * x * x; /* Simulate expensive computation */ +memoized_calc : memoize @expensive_calc; +result1 : memoized_calc.compute 5; /* Computes 125 */ +result2 : memoized_calc.compute 5; /* Uses cached result */ +</code></pre> +<h2>Real-World Problem Solving</h2> +<h3>E-commerce Order Processing</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Process customer orders */ +orders : { + order1: {customer: "Alice", items: {book: 2, pen: 5}, status: "pending"}, + order2: {customer: "Bob", items: {laptop: 1}, status: "shipped"}, + order3: {customer: "Charlie", items: {book: 1, pen: 3}, status: "pending"} +}; + +prices : {book: 15, pen: 2, laptop: 800}; + +/* Calculate order totals */ +calculate_total : order -> { + customer: order.customer, + total: reduce @add 0 (map @calculate_item_total order.items), + status: order.status +}; + +calculate_item_total : item quantity -> + when item is + "book" then 15 * quantity + "pen" then 2 * quantity + "laptop" then 800 * quantity + _ then 0; + +/* Process all orders */ +processed_orders : map @calculate_total orders; +..out processed_orders; +</code></pre> +<h3>Data Transformation Pipeline</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Transform user data through multiple stages */ +users : { + alice: {name: "Alice", age: 25, city: "NYC", active: true}, + bob: {name: "Bob", age: 30, city: "LA", active: false}, + charlie: {name: "Charlie", age: 35, city: "NYC", active: true} +}; + +/* Pipeline stages */ +filter_active : users -> filter @is_active users; +add_greeting : users -> map @add_greeting_to_user users; +format_output : users -> map @format_user_output users; + +is_active : user -> user.active; +add_greeting_to_user : user -> t.merge user {greeting: "Hello, " + user.name}; +format_user_output : user -> { + name: user.name, + greeting: user.greeting, + location: user.city +}; + +/* Execute pipeline */ +active_users : filter_active users; +greeted_users : add_greeting active_users; +formatted_users : format_output greeted_users; + +..out formatted_users; +</code></pre> +<h2>Advanced Patterns</h2> +<h3>Lazy Evaluation</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Lazy evaluation with thunks */ +lazy : computation -> { + compute: computation, + evaluated: false, + result: null, + get: -> + when evaluated then result + _ then { + computed_result: compute, + new_lazy: { + compute: computation, + evaluated: true, + result: computed_result, + get: -> computed_result + } + } +}; + +/* Use lazy evaluation */ +expensive_operation : -> { + /* Simulate expensive computation */ + ..out "Computing..."; + 42 +}; + +lazy_result : lazy expensive_operation; +/* Computation hasn't happened yet */ + +actual_result : lazy_result.get; +/* Now computation happens */ +</code></pre> +<h3>Continuation-Passing Style</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Continuation-passing style for complex control flow */ +process_with_continuation : data success_cont error_cont -> + when data = null then error_cont "No data provided" + _ then + processed : transform data; + when processed.error is + true then error_cont processed.message + false then success_cont processed.result; + +/* Use continuations */ +success_handler : result -> ..out "Success: " + result; +error_handler : error -> ..out "Error: " + error; + +process_with_continuation "valid data" success_handler error_handler; +process_with_continuation null success_handler error_handler; +</code></pre> +<h2>Performance Optimization</h2> +<h3>Avoiding Redundant Computations</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Cache expensive computations */ +expensive_transform : data -> + /* Simulate expensive operation */ + data * data * data; + +/* With caching */ +transform_with_cache : { + cache: {}, + transform: data -> + when t.has cache data then t.get cache data + _ then { + result: expensive_transform data, + new_cache: t.set cache data (expensive_transform data) + } +}; + +/* Use cached version */ +result1 : transform_with_cache.transform 5; /* Computes */ +result2 : transform_with_cache.transform 5; /* Uses cache */ +</code></pre> +<h3>Lazy Collections</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Lazy collection processing */ +lazy_map : f collection -> { + f: f, + collection: collection, + get: index -> + when index >= t.length collection then null + _ then f (t.get collection index) +}; + +/* Use lazy mapping */ +numbers : {1, 2, 3, 4, 5}; +expensive_double : x -> { + /* Simulate expensive operation */ + ..out "Doubling " + x; + x * 2 +}; + +lazy_doubled : lazy_map @expensive_double numbers; +/* No computation yet */ + +first_result : lazy_doubled.get 0; /* Only computes for index 0 */ +</code></pre> +<h2>Best Practices</h2> +<h3>Keep Combinators Focused</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Good: Single responsibility */ +filter_by_age : min_age users -> + filter @(is_older_than min_age) users; + +is_older_than : min_age user -> user.age >= min_age; + +/* Avoid: Multiple responsibilities */ +bad_filter : min_age max_age users -> + filter @(complex_age_check min_age max_age) users; +</code></pre> +<h3>Use Descriptive Names</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Good: Clear intent */ +process_active_users : users -> + filter @is_active (map @add_user_id users); + +/* Avoid: Generic names */ +process : data -> + filter @check (map @transform data); +</code></pre> +<h3>Compose, Don't Nest</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Good: Composed functions */ +pipeline : compose @format_output (compose @add_metadata (filter @is_valid data)); + +/* Avoid: Deep nesting */ +nested : format_output (add_metadata (filter @is_valid data)); +</code></pre> +<h2>Next Steps</h2> +<p>Now that you understand advanced combinators, explore:</p> +<ul> +<li><a href="15_Integration_Patterns.md">Integration Patterns</a> for external system integration</li> +<li><a href="13_Error_Handling.md">Error Handling</a> for robust error management</li> +<li><a href="16_Best_Practices.md">Best Practices</a> for writing clean code</li> +</ul> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-15_Integration_Patterns.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-15_Integration_Patterns.html new file mode 100644 index 0000000..4bd9585 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-15_Integration_Patterns.html @@ -0,0 +1,391 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>15_Integration_Patterns - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">15_Integration_Patterns</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>Integration Patterns</h1> +<h2>What are Integration Patterns?</h2> +<p>Integration patterns show how to connect Baba Yaga programs with external systems, APIs, and other services while maintaining functional purity through the <code>..emit</code> and <code>..listen</code> pattern.</p> +<h2>Basic Integration Concepts</h2> +<h3>Emit and Listen Pattern</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Emit events to external systems */ +..emit "user_created" {id: 123, name: "Alice"}; +..emit "data_processed" {count: 42, success: true}; + +/* Listen for external events */ +..listen "user_created" handle_user_created; +..listen "data_processed" handle_data_processed; +</code></pre> +<h3>State Management</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Get current state from external system */ +current_state : ..listen; + +/* Process based on state */ +user_id : current_state.user_id; +user_data : current_state.user_data; + +/* Emit processed result */ +..emit "user_processed" { + id: user_id, + processed_data: transform user_data +}; +</code></pre> +<h2>API Integration</h2> +<h3>HTTP Request Pattern</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Emit HTTP requests */ +..emit { + action: "http_request", + method: "GET", + url: "https://api.example.com/users/123" +}; + +/* Emit POST request with data */ +..emit { + action: "http_request", + method: "POST", + url: "https://api.example.com/users", + data: {name: "Alice", email: "alice@example.com"} +}; +</code></pre> +<h3>API Response Handling</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Listen for API responses */ +..listen "api_response" handle_api_response; + +handle_api_response : response -> + when response.success is + true then + ..out "API call successful:"; + ..out response.data + false then + ..out "API call failed:"; + ..out response.error; +</code></pre> +<h2>Database Integration</h2> +<h3>Database Operations</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Emit database queries */ +..emit { + action: "db_query", + type: "select", + table: "users", + where: {id: 123} +}; + +/* Emit insert operation */ +..emit { + action: "db_query", + type: "insert", + table: "users", + data: {name: "Bob", email: "bob@example.com"} +}; +</code></pre> +<h3>Database Response Processing</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Process database results */ +..listen "db_result" handle_db_result; + +handle_db_result : result -> + when result.type = "select" then + users : result.data; + processed_users : map @format_user users; + ..out "Found " + t.length users + " users"; + processed_users + _ then result.data; +</code></pre> +<h2>File System Integration</h2> +<h3>File Operations</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Emit file operations */ +..emit { + action: "file_operation", + type: "read", + path: "/data/users.json" +}; + +/* Emit write operation */ +..emit { + action: "file_operation", + type: "write", + path: "/output/processed.json", + content: processed_data +}; +</code></pre> +<h3>File Processing</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Process file contents */ +..listen "file_result" handle_file_result; + +handle_file_result : result -> + when result.type = "read" then + data : parse_json result.content; + processed : transform_data data; + processed + _ then result; +</code></pre> +<h2>Event-Driven Architecture</h2> +<h3>Event Processing Pipeline</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Process incoming events */ +process_event : event -> + when event.type = "user_created" then + user : event.data; + validated_user : validate_user user; + when validated_user.valid is + true then + ..emit "user_validated" validated_user.data; + validated_user.data + false then + ..emit "validation_failed" validated_user.errors; + null + _ then event.data; +</code></pre> +<h3>Event Handlers</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Register event handlers */ +..listen "user_created" process_event; +..listen "order_placed" process_event; +..listen "payment_received" process_event; +</code></pre> +<h2>External Service Integration</h2> +<h3>Third-Party API Integration</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Integrate with external service */ +integrate_payment : order -> + payment_data : { + amount: order.total, + currency: "USD", + customer_id: order.customer_id + }; + + ..emit { + action: "external_api", + service: "stripe", + endpoint: "/payments", + method: "POST", + data: payment_data + }; + + payment_data; +</code></pre> +<h3>Service Response Handling</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Handle external service responses */ +..listen "external_api_response" handle_external_response; + +handle_external_response : response -> + when response.service = "stripe" then + when response.success is + true then + ..emit "payment_successful" response.data; + response.data + false then + ..emit "payment_failed" response.error; + null + _ then response; +</code></pre> +<h2>Real-World Integration Example</h2> +<h3>E-commerce Order Processing</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Complete order processing pipeline */ +process_order : order -> + /* Step 1: Validate order */ + validation_result : validate_order order; + when validation_result.valid is + false then + ..emit "order_invalid" validation_result.errors; + null + _ then + /* Step 2: Check inventory */ + ..emit { + action: "db_query", + type: "select", + table: "inventory", + where: {product_id: order.product_id} + }; + + /* Step 3: Process payment */ + payment_result : integrate_payment order; + + /* Step 4: Update inventory */ + ..emit { + action: "db_query", + type: "update", + table: "inventory", + where: {product_id: order.product_id}, + data: {quantity: decrement_quantity order.quantity} + }; + + /* Step 5: Send confirmation */ + ..emit { + action: "email", + to: order.customer_email, + subject: "Order Confirmed", + template: "order_confirmation", + data: order + }; + + {order_id: order.id, status: "processed"}; +</code></pre> +<h2>Error Handling in Integration</h2> +<h3>Graceful Degradation</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Handle integration failures */ +safe_api_call : api_request -> + ..emit api_request; + + /* Set timeout for response */ + timeout_result : wait_for_response 5000; + when timeout_result.timeout is + true then + ..emit "api_timeout" api_request; + {error: "API timeout", fallback: true} + _ then timeout_result.response; +</code></pre> +<h3>Retry Logic</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Retry failed operations */ +retry_operation : operation max_retries -> + attempt_operation : attempt -> + when attempt > max_retries then + ..emit "max_retries_exceeded" operation; + {error: "Max retries exceeded"} + _ then + result : operation; + when result.error is + true then + delay : power 2 attempt; /* Exponential backoff */ + ..emit "retry_attempt" {attempt: attempt, delay: delay}; + retry_operation operation max_retries + false then result; + + attempt_operation 1; +</code></pre> +<h2>Testing Integration</h2> +<h3>Mock External Services</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Test integration without real services */ +test_payment_integration : -> + /* Mock order */ + test_order : { + id: "test_123", + total: 100, + customer_id: "cust_456" + }; + + /* Test payment integration */ + result : integrate_payment test_order; + + /* Verify emitted events */ + ..assert "Payment data emitted" result.amount = 100; + ..assert "Payment data emitted" result.currency = "USD"; + + ..out "Payment integration test passed"; +</code></pre> +<h3>Integration Test Patterns</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Test complete integration flow */ +test_order_flow : -> + /* Test order */ + test_order : { + id: "test_123", + product_id: "prod_789", + quantity: 2, + customer_email: "test@example.com", + total: 50 + }; + + /* Process order */ + result : process_order test_order; + + /* Verify result */ + ..assert "Order processed successfully" result.status = "processed"; + ..assert "Order ID preserved" result.order_id = "test_123"; + + ..out "Order flow test passed"; +</code></pre> +<h2>Best Practices</h2> +<h3>Keep Integration Pure</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Good: Pure function with explicit side effects */ +process_data : data -> + transformed : transform data; + ..emit "data_processed" transformed; + transformed; + +/* Avoid: Hidden side effects */ +bad_process : data -> + ..emit "processing_started"; /* Hidden side effect */ + transform data; +</code></pre> +<h3>Use Structured Events</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Good: Structured event data */ +..emit { + type: "user_created", + timestamp: now(), + data: {id: 123, name: "Alice"}, + metadata: {source: "web_form", version: "1.0"} +}; + +/* Avoid: Unstructured events */ +..emit "user_created Alice 123"; /* Hard to parse */ +</code></pre> +<h3>Handle Errors Gracefully</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Good: Explicit error handling */ +safe_integration : request -> + when request.valid is + false then + ..emit "integration_error" {request: request, error: "Invalid request"}; + null + _ then + result : call_external_service request; + when result.error is + true then + ..emit "service_error" result; + result.fallback_value + false then result.data; +</code></pre> +<h2>Next Steps</h2> +<p>Now that you understand integration patterns, explore:</p> +<ul> +<li><a href="13_Error_Handling.md">Error Handling</a> for robust error management</li> +<li><a href="14_Advanced_Combinators.md">Advanced Combinators</a> for complex integration patterns</li> +<li><a href="16_Best_Practices.md">Best Practices</a> for writing maintainable code</li> +</ul> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-16_Best_Practices.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-16_Best_Practices.html new file mode 100644 index 0000000..819884e --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-16_Best_Practices.html @@ -0,0 +1,226 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>16_Best_Practices - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">16_Best_Practices</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>Operator Spacing Best Practices</h1> +<h2>Why Spacing Matters</h2> +<p>The language uses spacing to distinguish between different types of operators and make expressions unambiguous. Proper spacing follows functional language conventions and makes your code more readable.</p> +<h2>Minus Operator Spacing</h2> +<h3>Unary Minus (Negative Numbers)</h3> +<p>Unary minus works without parentheses and requires no leading space:</p> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Unary minus without parentheses */ +-5; /* negate(5) */ +-3.14; /* negate(3.14) */ +-x; /* negate(x) */ +f -5; /* f(negate(5)) */ +map double -3; /* map(double, negate(3)) */ +</code></pre> +<h3>Binary Minus (Subtraction)</h3> +<p>Binary minus requires spaces on both sides:</p> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Binary minus with spaces */ +5 - 3; /* subtract(5, 3) */ +10 - 5; /* subtract(10, 5) */ +x - y; /* subtract(x, y) */ +3.14 - 1.5; /* subtract(3.14, 1.5) */ +</code></pre> +<h3>Legacy Syntax (Still Works)</h3> +<p>Legacy syntax continues to work for backward compatibility:</p> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Legacy syntax still works */ +(-5); /* negate(5) - explicit grouping */ +f (-5); /* f(negate(5)) - explicit grouping */ +5-3; /* subtract(5, 3) - legacy fallback */ +</code></pre> +<h3>Complex Expressions</h3> +<p>Complex expressions with mixed operators work correctly:</p> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Complex expressions */ +-5 + 3; /* add(negate(5), 3) */ +-5 - 3; /* subtract(negate(5), 3) */ +-5 * 3; /* multiply(negate(5), 3) */ +-5 + 3 - 2; /* subtract(add(negate(5), 3), 2) */ +</code></pre> +<h2>General Operator Spacing</h2> +<h3>Binary Operators</h3> +<p>All binary operators should have spaces around them:</p> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Binary operators with spaces */ +5 + 3; /* add(5, 3) */ +5 * 3; /* multiply(5, 3) */ +5 / 3; /* divide(5, 3) */ +5 % 3; /* modulo(5, 3) */ +5 ^ 3; /* power(5, 3) */ +</code></pre> +<h3>Comparison Operators</h3> +<p>Comparison operators require spaces:</p> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Comparison operators with spaces */ +5 = 3; /* equals(5, 3) */ +5 != 3; /* notEquals(5, 3) */ +5 < 3; /* lessThan(5, 3) */ +5 > 3; /* greaterThan(5, 3) */ +5 <= 3; /* lessEqual(5, 3) */ +5 >= 3; /* greaterEqual(5, 3) */ +</code></pre> +<h3>Logical Operators</h3> +<p>Logical operators require spaces:</p> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Logical operators with spaces */ +true and false; /* logicalAnd(true, false) */ +true or false; /* logicalOr(true, false) */ +true xor false; /* logicalXor(true, false) */ +</code></pre> +<h3>Unary Operators</h3> +<p>Unary operators (except minus) don't require special spacing:</p> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Unary operators */ +not true; /* logicalNot(true) */ +not false; /* logicalNot(false) */ +</code></pre> +<h2>When to Use Parentheses</h2> +<h3>Explicit Grouping</h3> +<p>Use parentheses when you need explicit control over precedence:</p> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Explicit grouping */ +(-5) + 3; /* add(negate(5), 3) - explicit grouping */ +f (-5); /* f(negate(5)) - explicit grouping */ +(5 + 3) * 2; /* multiply(add(5, 3), 2) - explicit grouping */ +</code></pre> +<h3>Complex Expressions</h3> +<p>Use parentheses to make complex expressions more readable:</p> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Complex expressions with parentheses */ +(-5 + 3) * 2; /* multiply(add(negate(5), 3), 2) */ +(-5) * (3 + 2); /* multiply(negate(5), add(3, 2)) */ +</code></pre> +<h2>Common Patterns</h2> +<h3>Function Calls with Negative Numbers</h3> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Function calls with negative numbers */ +double -5; /* double(negate(5)) */ +map double -3; /* map(double, negate(3)) */ +filter is_negative {-5, 0, 5}; /* filter(is_negative, {-5, 0, 5}) */ +</code></pre> +<h3>Comparisons with Negative Numbers</h3> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Comparisons with negative numbers */ +-5 >= 0; /* greaterEqual(negate(5), 0) */ +-5 < 0; /* lessThan(negate(5), 0) */ +is_negative -5; /* is_negative(negate(5)) */ +</code></pre> +<h3>Arithmetic with Mixed Operators</h3> +<pre class="prettyprint source lang-plaintext"><code>/* ✅ CORRECT - Mixed arithmetic */ +-5 + 3 - 2; /* subtract(add(negate(5), 3), 2) */ +5 * -3 + 2; /* add(multiply(5, negate(3)), 2) */ +(-5) * 3 + 2; /* add(multiply(negate(5), 3), 2) */ +</code></pre> +<h2>Best Practices Summary</h2> +<h3>Do's</h3> +<ul> +<li>✅ <strong>Use spaces around binary operators</strong>: <code>5 - 3</code>, <code>5 + 3</code>, <code>5 * 3</code></li> +<li>✅ <strong>Unary minus works without parentheses</strong>: <code>-5</code>, <code>f -5</code></li> +<li>✅ <strong>Use parentheses for explicit grouping</strong>: <code>(-5)</code>, <code>(5 + 3) * 2</code></li> +<li>✅ <strong>Use spaces around comparison operators</strong>: <code>5 = 3</code>, <code>5 < 3</code></li> +<li>✅ <strong>Use spaces around logical operators</strong>: <code>true and false</code></li> +</ul> +<h3>Don'ts</h3> +<ul> +<li>❌ <strong>Don't omit spaces around binary operators</strong>: <code>5-3</code>, <code>5+3</code> (legacy fallback)</li> +<li>❌ <strong>Don't add spaces after unary minus</strong>: <code>- 5</code> (legacy fallback)</li> +<li>❌ <strong>Don't use inconsistent spacing</strong>: <code>5- 3</code>, <code>5 -3</code> (legacy fallback)</li> +</ul> +<h3>When in Doubt</h3> +<ul> +<li><strong>Use spaces around binary operators</strong> - it's always correct and more readable</li> +<li><strong>Unary minus works without parentheses</strong> - <code>-5</code> is the preferred syntax</li> +<li><strong>Use parentheses for explicit grouping</strong> - when you need to control precedence</li> +<li><strong>Follow functional language conventions</strong> - spaces around operators are standard</li> +</ul> +<h2>Examples in Context</h2> +<h3>Data Processing</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Process data with proper spacing */ +data : {-5, 0, 5, 10, 15}; +is_positive : x -> x > 0; +double : x -> x * 2; +sum : x -> reduce add 0 x; + +/* Pipeline with proper spacing */ +result : sum map double filter is_positive data; +/* Reads: sum (map double (filter is_positive data)) */ +/* Result: 60 (positive: {5,10,15}, doubled: {10,20,30}, sum: 60) */ +</code></pre> +<h3>Validation Logic</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Validation with proper spacing */ +validate_age : age -> (age >= 0) and (age <= 120); +validate_salary : salary -> (salary >= 0) and (salary <= 1000000); + +/* Test validation */ +test1 : validate_age -5; /* false */ +test2 : validate_age 25; /* true */ +test3 : validate_salary 50000; /* true */ +</code></pre> +<h3>Mathematical Expressions</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Mathematical expressions with proper spacing */ +calculate_discount : price discount_rate -> + price - (price * discount_rate); + +apply_tax : price tax_rate -> + price + (price * tax_rate); + +/* Use the functions */ +final_price : apply_tax (calculate_discount 100 0.1) 0.08; +/* Result: 97.2 (discount: 90, tax: 7.2) */ +</code></pre> +<h2>Key Takeaways</h2> +<ol> +<li><strong>Spacing distinguishes operators</strong> - unary vs binary minus</li> +<li><strong>Unary minus works without parentheses</strong> - <code>-5</code> is preferred</li> +<li><strong>Binary operators need spaces</strong> - <code>5 - 3</code>, <code>5 + 3</code>, <code>5 * 3</code></li> +<li><strong>Legacy syntax still works</strong> - but spaces are recommended</li> +<li><strong>Parentheses for explicit grouping</strong> - when you need control</li> +<li><strong>Follow functional conventions</strong> - spaces around operators are standard</li> +</ol> +<p><strong>Remember</strong>: Proper spacing makes your code more readable and follows functional language conventions! 🚀</p> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-README.html b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-README.html new file mode 100644 index 0000000..a9c0e19 --- /dev/null +++ b/js/scripting-lang/docs/baba-yaga/0.0.1/tutorial-README.html @@ -0,0 +1,170 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>README - Documentation</title> + + <script src="scripts/prettify/prettify.js"></script> + <script src="scripts/prettify/lang-css.js"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> +<body> + +<input type="checkbox" id="nav-trigger" class="nav-trigger" /> +<label for="nav-trigger" class="navicon-button x"> + <div class="navicon"></div> +</label> + +<label for="nav-trigger" class="overlay"></label> + +<nav> + <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Tutorials</li><li class="nav-item"><a href="tutorial-00_Introduction.html">00_Introduction</a></li><li class="nav-item"><a href="tutorial-01_Function_Calls.html">01_Function_Calls</a></li><li class="nav-item"><a href="tutorial-02_Function_Composition.html">02_Function_Composition</a></li><li class="nav-item"><a href="tutorial-03_Table_Operations.html">03_Table_Operations</a></li><li class="nav-item"><a href="tutorial-04_Currying.html">04_Currying</a></li><li class="nav-item"><a href="tutorial-05_Pattern_Matching.html">05_Pattern_Matching</a></li><li class="nav-item"><a href="tutorial-06_Immutable_Tables.html">06_Immutable_Tables</a></li><li class="nav-item"><a href="tutorial-07_Function_References.html">07_Function_References</a></li><li class="nav-item"><a href="tutorial-08_Combinators.html">08_Combinators</a></li><li class="nav-item"><a href="tutorial-09_Expression_Based.html">09_Expression_Based</a></li><li class="nav-item"><a href="tutorial-10_Tables_Deep_Dive.html">10_Tables_Deep_Dive</a></li><li class="nav-item"><a href="tutorial-11_Standard_Library.html">11_Standard_Library</a></li><li class="nav-item"><a href="tutorial-12_IO_Operations.html">12_IO_Operations</a></li><li class="nav-item"><a href="tutorial-13_Error_Handling.html">13_Error_Handling</a></li><li class="nav-item"><a href="tutorial-14_Advanced_Combinators.html">14_Advanced_Combinators</a></li><li class="nav-item"><a href="tutorial-15_Integration_Patterns.html">15_Integration_Patterns</a></li><li class="nav-item"><a href="tutorial-16_Best_Practices.html">16_Best_Practices</a></li><li class="nav-item"><a href="tutorial-README.html">README</a></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#callStackTracker">callStackTracker</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugError">debugError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#debugLog">debugLog</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#executeFile">executeFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#interpreter">interpreter</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#lexer">lexer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#main">main</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#parser">parser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#readFile">readFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#run">run</a></span></li> +</nav> + +<div id="main"> + + <h1 class="page-title">README</h1> + + + <section> + +<header> + +</header> + +<article> + <h1>Baba Yaga Tutorials</h1> +<p>Welcome to the Baba Yaga tutorials! These tutorials will guide you through learning this functional programming language step by step.</p> +<h2>Getting Started</h2> +<p>Start with the <strong>Introduction</strong> tutorial to learn the basics, then follow the numbered sequence for a complete learning path.</p> +<h2>Tutorial Sequence</h2> +<h3>🚀 <strong>Beginner Level</strong></h3> +<ol> +<li><strong><a href="00_Introduction.md">00_Introduction.md</a></strong> - Basic concepts, functions, and pattern matching</li> +<li><strong><a href="01_Function_Calls.md">01_Function_Calls.md</a></strong> - Function calls without parentheses (juxtaposition)</li> +<li><strong><a href="02_Function_Composition.md">02_Function_Composition.md</a></strong> - Function composition with <code>via</code>, <code>compose</code>, and <code>pipe</code></li> +<li><strong><a href="03_Table_Operations.md">03_Table_Operations.md</a></strong> - Working with tables and element-wise operations</li> +<li><strong><a href="04_Currying.md">04_Currying.md</a></strong> - Partial function application by default</li> +<li><strong><a href="05_Pattern_Matching.md">05_Pattern_Matching.md</a></strong> - Pattern matching with <code>when</code> expressions</li> +<li><strong><a href="06_Immutable_Tables.md">06_Immutable_Tables.md</a></strong> - Immutable table operations and functional programming</li> +<li><strong><a href="07_Function_References.md">07_Function_References.md</a></strong> - Function references with <code>@</code> symbol</li> +</ol> +<h3>🔧 <strong>Intermediate Level</strong></h3> +<ol start="9"> +<li><strong><a href="08_Combinators.md">08_Combinators.md</a></strong> - Understanding the combinator-based architecture</li> +<li><strong><a href="09_Expression_Based.md">09_Expression_Based.md</a></strong> - Expression-based programming without explicit returns</li> +<li><strong><a href="10_Tables_Deep_Dive.md">10_Tables_Deep_Dive.md</a></strong> - Advanced table usage and data structures</li> +<li><strong><a href="11_Standard_Library.md">11_Standard_Library.md</a></strong> - Overview of available functions and combinators</li> +<li><strong><a href="12_IO_Operations.md">12_IO_Operations.md</a></strong> - Input/output operations and assertions</li> +<li><strong><a href="13_Error_Handling.md">13_Error_Handling.md</a></strong> - Error handling patterns and validation</li> +</ol> +<h3>🎯 <strong>Advanced Level</strong></h3> +<ol start="15"> +<li><strong><a href="14_Advanced_Combinators.md">14_Advanced_Combinators.md</a></strong> - Advanced combinator patterns and optimization</li> +<li><strong><a href="15_Integration_Patterns.md">15_Integration_Patterns.md</a></strong> - External system integration and APIs</li> +<li><strong><a href="16_Best_Practices.md">16_Best_Practices.md</a></strong> - Best practices and coding guidelines</li> +</ol> +<h2>Key Concepts Covered</h2> +<ul> +<li><strong>Functional Programming</strong>: Pure functions, immutability, composition</li> +<li><strong>Pattern Matching</strong>: <code>when</code> expressions for conditional logic</li> +<li><strong>Tables</strong>: Immutable data structures with functional operations</li> +<li><strong>Combinators</strong>: Higher-order functions for data transformation</li> +<li><strong>IO Operations</strong>: Input/output, assertions, and event handling</li> +<li><strong>Error Handling</strong>: Functional error patterns and validation</li> +<li><strong>Integration</strong>: External system integration patterns</li> +<li><strong>Best Practices</strong>: Operator spacing, syntax guidelines, and code organization</li> +</ul> +<h2>REPL Integration Documentation</h2> +<p>For comprehensive integration patterns and harness architecture documentation, see the <strong><a href="../docs/repl/scripting-lang/0.0.1/repl.js.html">REPL Documentation</a></strong> which is generated directly from the REPL source code and contains extensive JSDoc comments about:</p> +<ul> +<li>Architecture overview and TEA-inspired patterns</li> +<li>Harness integration examples</li> +<li>Adapter pattern implementation</li> +<li>State management and versioning</li> +<li>Error handling and recovery</li> +<li>Command routing strategies</li> +<li>Complete integration examples</li> +</ul> +<h2>Quick Reference</h2> +<h3>Essential Syntax</h3> +<pre class="prettyprint source lang-plaintext"><code>/* Function definition */ +function_name : param1 param2 -> expression; + +/* Function application */ +function_name arg1 arg2; + +/* Pattern matching */ +when value is + pattern1 then result1 + pattern2 then result2 + _ then default_result; + +/* Table literals */ +{key1: value1, key2: value2}; + +/* Function references */ +map @function_name collection; + +/* IO operations */ +..out "Hello, World!"; +..assert "test" 5 = 5; +..emit "event" data; +..listen "event" handler; +</code></pre> +<h3>Best Practices</h3> +<ul> +<li>✅ <strong>Use spaces around binary operators</strong>: <code>5 - 3</code>, <code>5 + 3</code>, <code>5 * 3</code></li> +<li>✅ <strong>Unary minus works without parentheses</strong>: <code>-5</code>, <code>f -5</code></li> +<li>✅ <strong>Use parentheses for explicit grouping</strong>: <code>(-5)</code>, <code>(5 + 3) * 2</code></li> +<li>✅ <strong>Follow functional conventions</strong>: Immutable data, pure functions</li> +<li>✅ <strong>Keep functions focused</strong>: Single responsibility principle</li> +<li>✅ <strong>Use descriptive names</strong>: Clear intent and purpose</li> +<li>✅ <strong>Handle errors explicitly</strong>: Pattern matching over exceptions</li> +</ul> +<h2>Running Examples</h2> +<p>To run examples from these tutorials:</p> +<ol> +<li>Create a <code>.txt</code> or <code>.baba</code> file with the example code</li> +<li>Run: <code>node lang.js your_file.txt</code></li> +</ol> +<p>Example:</p> +<pre class="prettyprint source lang-bash"><code># Create test.txt with tutorial code +echo "result : 5 - 3;" > test.txt + +# Run the example +node lang.js test.txt +</code></pre> +<h2>File Extensions</h2> +<p>Baba Yaga files should use either the <code>.txt</code> file extension, or the <code>.baba</code> extension.</p> +<h2>Need Help?</h2> +<ul> +<li>Check the <a href="../README.md">main README</a> for language overview</li> +<li>Review <a href="16_Best_Practices.md">Best Practices</a> for syntax guidelines</li> +<li>Run the test suite: <code>./run_tests.sh</code> to see working examples</li> +<li>Explore <a href="14_Advanced_Combinators.md">Advanced Combinators</a> for complex patterns</li> +<li>Check <a href="15_Integration_Patterns.md">Integration Patterns</a> for external system integration</li> +</ul> +<p>Happy learning! 🚀</p> +</article> + +</section> + +</div> + +<br class="clear"> + +<footer> + Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Jul 29 2025 23:15:00 GMT-0400 (Eastern Daylight Time) using the Minami theme. +</footer> + +<script>prettyPrint();</script> +<script src="scripts/linenumber.js"></script> +</body> +</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/global.html b/js/scripting-lang/docs/scripting-lang/0.0.1/global.html deleted file mode 100644 index 684ed47..0000000 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/global.html +++ /dev/null @@ -1,2012 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>JSDoc: Global</title> - - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> - <!--[if lt IE 9]> - <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> - <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> -</head> - -<body> - -<div id="main"> - - <h1 class="page-title">Global</h1> - - - - - - -<section> - -<header> - - <h2></h2> - - -</header> - -<article> - <div class="container-overview"> - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -</dl> - - - - - </div> - - - - - - - - - - - - - - - <h3 class="subsection-title">Members</h3> - - - -<h4 class="name" id="TokenType"><span class="type-signature">(constant) </span>TokenType<span class="type-signature"></span></h4> - - - - -<div class="description"> - Defines all token types used by the lexer and parser. -Each token type represents a distinct syntactic element in the language. - -The token types are organized into categories: -- Literals: NUMBER, STRING, TRUE, FALSE -- Operators: PLUS, MINUS, MULTIPLY, DIVIDE, MODULO, POWER, etc. -- Keywords: WHEN, IS, THEN, FUNCTION, etc. -- Punctuation: LEFT_PAREN, RIGHT_PAREN, SEMICOLON, COMMA, etc. -- Special: IO_IN, IO_OUT, IO_ASSERT, FUNCTION_REF, FUNCTION_ARG - -This enumeration provides a centralized definition of all possible -token types, ensuring consistency between lexer and parser. The token -types are designed to support the combinator-based architecture where -all operations are translated to function calls. -</div> - - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="lexer.js.html">lexer.js</a>, <a href="lexer.js.html#line22">line 22</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - -<h4 class="name" id="callStackTracker"><span class="type-signature">(constant) </span>callStackTracker<span class="type-signature"></span></h4> - - - - -<div class="description"> - Tracks function calls to help identify infinite recursion -and deep call stacks that cause stack overflow errors. This is essential -for debugging the interpreter's recursive evaluation of AST nodes. - -The tracker maintains a stack of function calls with timestamps and context -information, counts function calls to identify hot paths, and detects -potential infinite recursion by monitoring stack depth. - -This tool is particularly important for the combinator-based architecture -where function calls are the primary execution mechanism, and complex -nested expressions can lead to deep call stacks. The tracker helps identify -when the combinator translation creates unexpectedly deep call chains, -enabling optimization of the function composition and application patterns. - -The tracker provides detailed statistics about function call patterns, -helping developers understand the execution characteristics of their code -and identify potential performance bottlenecks in the combinator evaluation. -</div> - - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2414">line 2414</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - - - - <h3 class="subsection-title">Methods</h3> - - - - - - - - <h4 class="name" id="debugError"><span class="type-signature"></span>debugError<span class="signature">(message, error<span class="signature-attributes">opt</span>)</span><span class="type-signature"></span></h4> - - - - - - -<div class="description"> - Logs debug error messages to console when DEBUG environment variable is set. -Provides verbose error output during development while remaining silent in production. - -Debug functions are gated by the DEBUG environment variable, allowing for -verbose output during development and silent operation in production. This -approach makes it easy to trace execution and diagnose issues without -cluttering normal output. - -This function is particularly useful for debugging parsing and evaluation errors, -providing detailed context about where and why errors occur in the language -execution pipeline. -</div> - - - - - - - - - - <h5>Parameters:</h5> - - -<table class="params"> - <thead> - <tr> - - <th>Name</th> - - - <th>Type</th> - - - <th>Attributes</th> - - - - <th>Default</th> - - - <th class="last">Description</th> - </tr> - </thead> - - <tbody> - - - <tr> - - <td class="name"><code>message</code></td> - - - <td class="type"> - - -<span class="param-type">string</span> - - - - </td> - - - <td class="attributes"> - - - - - - </td> - - - - <td class="default"> - - </td> - - - <td class="description last">Debug error message to log</td> - </tr> - - - - <tr> - - <td class="name"><code>error</code></td> - - - <td class="type"> - - -<span class="param-type">Error</span> - - - - </td> - - - <td class="attributes"> - - <optional><br> - - - - - - </td> - - - - <td class="default"> - - null - - </td> - - - <td class="description last">Optional error object to log</td> - </tr> - - - </tbody> -</table> - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2384">line 2384</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - - - - - - - - - - - - - - - - - - - - <h4 class="name" id="debugLog"><span class="type-signature"></span>debugLog<span class="signature">(message, data<span class="signature-attributes">opt</span>)</span><span class="type-signature"></span></h4> - - - - - - -<div class="description"> - Logs debug messages to console when DEBUG environment variable is set. -Provides verbose output during development while remaining silent in production. - -Debug functions are gated by the DEBUG environment variable, allowing for -verbose output during development and silent operation in production. This -approach makes it easy to trace execution and diagnose issues without -cluttering normal output. - -This function is essential for debugging the combinator-based architecture, -allowing developers to trace how operators are translated to function calls -and how the interpreter executes these calls through the standard library. - -The function is designed to be lightweight and safe to call frequently, -making it suitable for tracing execution flow through complex nested -expressions and function applications. -</div> - - - - - - - - - - <h5>Parameters:</h5> - - -<table class="params"> - <thead> - <tr> - - <th>Name</th> - - - <th>Type</th> - - - <th>Attributes</th> - - - - <th>Default</th> - - - <th class="last">Description</th> - </tr> - </thead> - - <tbody> - - - <tr> - - <td class="name"><code>message</code></td> - - - <td class="type"> - - -<span class="param-type">string</span> - - - - </td> - - - <td class="attributes"> - - - - - - </td> - - - - <td class="default"> - - </td> - - - <td class="description last">Debug message to log</td> - </tr> - - - - <tr> - - <td class="name"><code>data</code></td> - - - <td class="type"> - - -<span class="param-type">*</span> - - - - </td> - - - <td class="attributes"> - - <optional><br> - - - - - - </td> - - - - <td class="default"> - - null - - </td> - - - <td class="description last">Optional data to log with the message</td> - </tr> - - - </tbody> -</table> - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2357">line 2357</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - - - - - - - - - - - - - - - - - - - - <h4 class="name" id="executeFile"><span class="type-signature">(async) </span>executeFile<span class="signature">(filePath)</span><span class="type-signature"> → {Promise.<*>}</span></h4> - - - - - - -<div class="description"> - Main entry point for file execution. Handles the complete language -pipeline: file reading, lexical analysis, parsing, and interpretation. - -This function orchestrates the entire language execution process: -1. Reads the source file using cross-platform I/O utilities -2. Tokenizes the source code using the lexer -3. Parses tokens into an AST using the combinator-based parser -4. Interprets the AST using the combinator-based interpreter - -The function provides comprehensive error handling and debug output at each -stage for transparency and troubleshooting. It also manages the call stack -tracker to provide execution statistics and detect potential issues. - -Supports both synchronous and asynchronous execution, with proper -error handling and process exit codes. This function demonstrates the -complete combinator-based architecture in action, showing how source code -is transformed through each stage of the language pipeline. - -The function enforces the .txt file extension requirement and provides -detailed error reporting with call stack statistics to help developers -understand execution behavior and diagnose issues. -</div> - - - - - - - - - - <h5>Parameters:</h5> - - -<table class="params"> - <thead> - <tr> - - <th>Name</th> - - - <th>Type</th> - - - - - - <th class="last">Description</th> - </tr> - </thead> - - <tbody> - - - <tr> - - <td class="name"><code>filePath</code></td> - - - <td class="type"> - - -<span class="param-type">string</span> - - - - </td> - - - - - - <td class="description last">Path to the file to execute</td> - </tr> - - - </tbody> -</table> - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2557">line 2557</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - - - - - - -<h5>Throws:</h5> - - - -<dl> - <dt> - <div class="param-desc"> - For file reading, parsing, or execution errors - </div> - </dt> - <dd></dd> - <dt> - <dl> - <dt> - Type - </dt> - <dd> - -<span class="param-type">Error</span> - - - </dd> - </dl> - </dt> - <dd></dd> -</dl> - - - - - -<h5>Returns:</h5> - - -<div class="param-desc"> - The result of executing the file -</div> - - - -<dl> - <dt> - Type - </dt> - <dd> - -<span class="param-type">Promise.<*></span> - - - </dd> -</dl> - - - - - - - - - - - - - - <h4 class="name" id="initializeStandardLibrary"><span class="type-signature"></span>initializeStandardLibrary<span class="signature">(scope)</span><span class="type-signature"></span></h4> - - - - - - -<div class="description"> - Injects higher-order functions and combinator functions into the interpreter's global scope. -These functions provide functional programming utilities and implement the combinator foundation -that eliminates parsing ambiguity by translating all operations to function calls. - -The standard library includes: -- Higher-order functions (map, compose, pipe, apply, filter, reduce, fold, curry) -- Arithmetic combinators (add, subtract, multiply, divide, modulo, power, negate) -- Comparison combinators (equals, notEquals, lessThan, greaterThan, lessEqual, greaterEqual) -- Logical combinators (logicalAnd, logicalOr, logicalXor, logicalNot) -- Enhanced combinators (identity, constant, flip, on, both, either) - -This approach ensures that user code can access these functions as if they were built-in, -without special syntax or reserved keywords. The combinator foundation allows the parser -to translate all operators to function calls, eliminating ambiguity while preserving syntax. - -Functions are written to check argument types at runtime since the language is dynamically -typed and does not enforce arity or types at parse time. The combinator functions are -designed to work seamlessly with the parser's operator translation, providing a consistent -and extensible foundation for all language operations. -</div> - - - - - - - - - - <h5>Parameters:</h5> - - -<table class="params"> - <thead> - <tr> - - <th>Name</th> - - - <th>Type</th> - - - - - - <th class="last">Description</th> - </tr> - </thead> - - <tbody> - - - <tr> - - <td class="name"><code>scope</code></td> - - - <td class="type"> - - -<span class="param-type">Object</span> - - - - </td> - - - - - - <td class="description last">The global scope object to inject functions into</td> - </tr> - - - </tbody> -</table> - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line31">line 31</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - - - - - - - - - - - - - - - - - - - - <h4 class="name" id="interpreter"><span class="type-signature"></span>interpreter<span class="signature">(ast)</span><span class="type-signature"> → {*}</span></h4> - - - - - - -<div class="description"> - Evaluates an AST by walking through each node and performing the -corresponding operations. Manages scope, handles function calls, and supports -both synchronous and asynchronous operations. - -The interpreter implements a combinator-based architecture where all operations -are executed through function calls to standard library combinators. This design -eliminates parsing ambiguity while preserving intuitive syntax. The parser translates -all operators (+, -, *, /, etc.) into FunctionCall nodes that reference combinator -functions, ensuring consistent semantics across all operations. - -Key architectural features: -- Combinator Foundation: All operations are function calls to standard library combinators -- Scope Management: Prototypal inheritance for variable lookup and function definitions -- Forward Declaration: Recursive functions are supported through placeholder creation -- Error Handling: Comprehensive error detection and reporting with call stack tracking -- Debug Support: Optional debug mode for development and troubleshooting - -The interpreter processes legacy operator expressions (PlusExpression, MinusExpression, etc.) -for backward compatibility, but the parser now generates FunctionCall nodes for all operators, -which are handled by the standard library combinator functions. This ensures that all -operations follow the same execution model and can be extended by adding new combinator -functions to the standard library. -are translated to function calls to standard library combinators. This eliminates -parsing ambiguity while preserving the original syntax. The parser generates -FunctionCall nodes for operators (e.g., x + y becomes add(x, y)), and the -interpreter executes these calls using the combinator functions in the global scope. - -The interpreter uses a global scope for variable storage and function definitions. -Each function call creates a new scope (using prototypal inheritance) to implement -lexical scoping. Immutability is enforced by preventing reassignment in the -global scope. - -The interpreter is split into three functions: evalNode (global), -localEvalNodeWithScope (for function bodies), and localEvalNode (for internal -recursion). This separation allows for correct scope handling and easier debugging. - -Recursive function support is implemented using a forward declaration pattern: -a placeholder function is created in the global scope before evaluation, allowing -the function body to reference itself during evaluation. - -The combinator foundation ensures that all operations are executed through -function calls, providing a consistent and extensible execution model. This -approach enables powerful abstractions and eliminates the need for special -handling of different operator types in the interpreter. -</div> - - - - - - - - - - <h5>Parameters:</h5> - - -<table class="params"> - <thead> - <tr> - - <th>Name</th> - - - <th>Type</th> - - - - - - <th class="last">Description</th> - </tr> - </thead> - - <tbody> - - - <tr> - - <td class="name"><code>ast</code></td> - - - <td class="type"> - - -<span class="param-type">Object</span> - - - - </td> - - - - - - <td class="description last">Abstract Syntax Tree to evaluate</td> - </tr> - - - </tbody> -</table> - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line1220">line 1220</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - - - - - - -<h5>Throws:</h5> - - - -<dl> - <dt> - <div class="param-desc"> - For evaluation errors like division by zero, undefined variables, etc. - </div> - </dt> - <dd></dd> - <dt> - <dl> - <dt> - Type - </dt> - <dd> - -<span class="param-type">Error</span> - - - </dd> - </dl> - </dt> - <dd></dd> -</dl> - - - - - -<h5>Returns:</h5> - - -<div class="param-desc"> - The result of evaluating the AST, or a Promise for async operations -</div> - - - -<dl> - <dt> - Type - </dt> - <dd> - -<span class="param-type">*</span> - - - </dd> -</dl> - - - - - - - - - - - - - - <h4 class="name" id="lexer"><span class="type-signature"></span>lexer<span class="signature">(input)</span><span class="type-signature"> → {Array.<Object>}</span></h4> - - - - - - -<div class="description"> - The lexer performs lexical analysis by converting source code -into a stream of tokens. Each token represents a meaningful unit of the -language syntax, such as identifiers, literals, operators, and keywords. - -The lexer implements a character-by-character scanning approach with -lookahead for multi-character tokens. It maintains line and column -information for accurate error reporting and debugging. - -Key features: -- Handles whitespace and comments (single-line and multi-line) -- Recognizes all language constructs including operators, keywords, and literals -- Supports string literals with escape sequences -- Provides detailed position information for error reporting -- Cross-platform compatibility (Node.js, Bun, browser) -- Supports function composition with 'via' keyword -- Handles function references with '@' operator - -The lexer is designed to be robust and provide clear error messages -for malformed input, making it easier to debug syntax errors in user code. -It supports the combinator-based architecture by recognizing all operators -and special tokens needed for function composition and application. - -The lexer is the first step in the language processing pipeline and must -correctly identify all tokens that the parser will translate into function -calls. This includes operators that will become combinator function calls, -function references that enable higher-order programming, and special -keywords that support the functional programming paradigm. -</div> - - - - - - - - - - <h5>Parameters:</h5> - - -<table class="params"> - <thead> - <tr> - - <th>Name</th> - - - <th>Type</th> - - - - - - <th class="last">Description</th> - </tr> - </thead> - - <tbody> - - - <tr> - - <td class="name"><code>input</code></td> - - - <td class="type"> - - -<span class="param-type">string</span> - - - - </td> - - - - - - <td class="description last">The source code to tokenize</td> - </tr> - - - </tbody> -</table> - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="lexer.js.html">lexer.js</a>, <a href="lexer.js.html#line105">line 105</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - - - - - - -<h5>Throws:</h5> - - - -<dl> - <dt> - <div class="param-desc"> - For unexpected characters or malformed tokens - </div> - </dt> - <dd></dd> - <dt> - <dl> - <dt> - Type - </dt> - <dd> - -<span class="param-type">Error</span> - - - </dd> - </dl> - </dt> - <dd></dd> -</dl> - - - - - -<h5>Returns:</h5> - - -<div class="param-desc"> - Array of token objects with type, value, line, and column -</div> - - - -<dl> - <dt> - Type - </dt> - <dd> - -<span class="param-type">Array.<Object></span> - - - </dd> -</dl> - - - - - - - - - - - - - - <h4 class="name" id="main"><span class="type-signature">(async) </span>main<span class="signature">()</span><span class="type-signature"></span></h4> - - - - - - -<div class="description"> - Processes command line arguments and executes the specified file. -Provides helpful error messages for incorrect usage. - -The language is designed for file execution only (no REPL), so the CLI -enforces this usage and provides helpful error messages for incorrect invocation. -The function validates that exactly one file path is provided and that the -file has the correct .txt extension. - -Exits with appropriate error codes for different failure scenarios. -</div> - - - - - - - - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2629">line 2629</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - - - - - - - - - - - - - - - - - - - - <h4 class="name" id="parser"><span class="type-signature"></span>parser<span class="signature">(tokens)</span><span class="type-signature"> → {Object}</span></h4> - - - - - - -<div class="description"> - The parser implements a combinator-based architecture where all -operators are translated to function calls to standard library combinators. -This eliminates parsing ambiguity while preserving the original syntax. - -The parser uses a recursive descent approach with proper operator precedence -handling. Each operator expression (e.g., x + y) is translated to a FunctionCall -node (e.g., add(x, y)) that will be executed by the interpreter using the -corresponding combinator function. - -Key architectural decisions: -- All operators become FunctionCall nodes to eliminate ambiguity -- Operator precedence is handled through recursive parsing functions -- Function calls are detected by looking for identifiers followed by expressions -- When expressions and case patterns are parsed with special handling -- Table literals and access are parsed as structured data -- Function composition uses 'via' keyword with right-associative precedence -- Function application uses juxtaposition with left-associative precedence - -The parser maintains a current token index and advances through the token -stream, building the AST bottom-up from primary expressions to complex -logical expressions. This approach ensures that all operations are consistently -represented as function calls, enabling the interpreter to use the combinator -foundation for execution. - -This design choice eliminates the need for special operator handling in the -interpreter and enables powerful abstractions through the combinator foundation. -All operations become function calls, providing a consistent and extensible -execution model that can be enhanced by adding new combinator functions. -</div> - - - - - - - - - - <h5>Parameters:</h5> - - -<table class="params"> - <thead> - <tr> - - <th>Name</th> - - - <th>Type</th> - - - - - - <th class="last">Description</th> - </tr> - </thead> - - <tbody> - - - <tr> - - <td class="name"><code>tokens</code></td> - - - <td class="type"> - - -<span class="param-type">Array.<Object></span> - - - - </td> - - - - - - <td class="description last">Array of tokens from the lexer</td> - </tr> - - - </tbody> -</table> - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="parser.js.html">parser.js</a>, <a href="parser.js.html#line43">line 43</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - - - - - - -<h5>Throws:</h5> - - - -<dl> - <dt> - <div class="param-desc"> - For parsing errors like unexpected tokens or missing delimiters - </div> - </dt> - <dd></dd> - <dt> - <dl> - <dt> - Type - </dt> - <dd> - -<span class="param-type">Error</span> - - - </dd> - </dl> - </dt> - <dd></dd> -</dl> - - - - - -<h5>Returns:</h5> - - -<div class="param-desc"> - Abstract Syntax Tree with program body -</div> - - - -<dl> - <dt> - Type - </dt> - <dd> - -<span class="param-type">Object</span> - - - </dd> -</dl> - - - - - - - - - - - - - - <h4 class="name" id="readFile"><span class="type-signature">(async) </span>readFile<span class="signature">(filePath)</span><span class="type-signature"> → {Promise.<string>}</span></h4> - - - - - - -<div class="description"> - Handles file reading across different platforms (Node.js, Bun, browser) -with appropriate fallbacks for each environment. This function is essential for -the language's file execution model where scripts are loaded from .txt files. - -The function prioritizes ES modules compatibility by using dynamic import, -but falls back to require for older Node.js versions. Browser environments -are not supported for file I/O operations. - -This cross-platform approach ensures the language can run in various JavaScript -environments while maintaining consistent behavior. The file reading capability -enables the language to execute scripts from files, supporting the development -workflow where tests and examples are stored as .txt files. -</div> - - - - - - - - - - <h5>Parameters:</h5> - - -<table class="params"> - <thead> - <tr> - - <th>Name</th> - - - <th>Type</th> - - - - - - <th class="last">Description</th> - </tr> - </thead> - - <tbody> - - - <tr> - - <td class="name"><code>filePath</code></td> - - - <td class="type"> - - -<span class="param-type">string</span> - - - - </td> - - - - - - <td class="description last">Path to the file to read</td> - </tr> - - - </tbody> -</table> - - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> - <a href="lang.js.html">lang.js</a>, <a href="lang.js.html#line2509">line 2509</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - - - - - - - - - -<h5>Throws:</h5> - - - -<dl> - <dt> - <div class="param-desc"> - For file reading errors - </div> - </dt> - <dd></dd> - <dt> - <dl> - <dt> - Type - </dt> - <dd> - -<span class="param-type">Error</span> - - - </dd> - </dl> - </dt> - <dd></dd> -</dl> - - - - - -<h5>Returns:</h5> - - -<div class="param-desc"> - File contents as a string -</div> - - - -<dl> - <dt> - Type - </dt> - <dd> - -<span class="param-type">Promise.<string></span> - - - </dd> -</dl> - - - - - - - - - - - - - -</article> - -</section> - - - - -</div> - -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - -<br class="clear"> - -<footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) -</footer> - -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> -</body> -</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/index.html b/js/scripting-lang/docs/scripting-lang/0.0.1/index.html deleted file mode 100644 index 0a85d5d..0000000 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/index.html +++ /dev/null @@ -1,281 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>JSDoc: Home</title> - - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> - <!--[if lt IE 9]> - <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> - <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> -</head> - -<body> - -<div id="main"> - - <h1 class="page-title">Home</h1> - - - - - - - - - <h3>scripting-lang 0.0.1</h3> - - - - - - - - - - - - - - - - <section> - <article><h1>Scripting Language</h1> -<p>A combinator-based scripting language with functional programming features, pattern matching, and a comprehensive standard library.</p> -<h2>Overview</h2> -<p>This is a functional scripting language that translates all operations into function calls to standard library combinators. The language supports:</p> -<ul> -<li><strong>Function Definitions</strong>: Arrow syntax with lexical scoping</li> -<li><strong>Pattern Matching</strong>: When expressions with wildcards and nested expressions</li> -<li><strong>Tables</strong>: Array-like and key-value entries with boolean keys</li> -<li><strong>Function References</strong>: @ operator for higher-order programming</li> -<li><strong>IO Operations</strong>: Input, output, and assertions</li> -<li><strong>Standard Library</strong>: Complete set of arithmetic, comparison, logical, and higher-order combinators</li> -<li><strong>Table Enhancements</strong>: APL-inspired element-wise operations and immutable table operations</li> -</ul> -<h2>Quick Start</h2> -<h3>Usage</h3> -<pre class="prettyprint source lang-bash"><code># Run a script file -node lang.js your-script.txt - -# Or with Bun -bun lang.js your-script.txt -</code></pre> -<h3>Example Script</h3> -<pre class="prettyprint source lang-plaintext"><code>// Basic arithmetic -result : 5 + 3 * 2; -..out result; - -// Function definition -factorial : n -> - when n is - 0 then 1 - _ then n * (factorial (n - 1)); - -// Pattern matching -classify : x y -> - when x y is - 0 0 then "both zero" - 0 _ then "x is zero" - _ 0 then "y is zero" - _ _ then "neither zero"; - -// Tables -person : {name: "Alice", age: 30, active: true}; -..out person.name; -..out person["age"]; - -// Function composition -double : x -> x * 2; -increment : x -> x + 1; -composed : compose @double @increment 5; -..out composed; // Output: 12 - -// Table enhancements -numbers : {1, 2, 3, 4, 5}; -doubled : map @double numbers; -..out doubled[1]; // Output: 2 - -// APL-style element-wise operations -table1 : {a: 1, b: 2, c: 3}; -table2 : {a: 10, b: 20, c: 30}; -sum : each @add table1 table2; -..out sum.a; // Output: 11 -</code></pre> -<h2>Key Features</h2> -<h3>Function Application</h3> -<p>Functions are applied using juxtaposition (space-separated):</p> -<pre class="prettyprint source lang-plaintext"><code>f x // Apply function f to argument x -f x y // Apply f to x, then apply result to y -f (g x) // Apply g to x, then apply f to result -</code></pre> -<h3>Pattern Matching</h3> -<p>Use <code>when</code> expressions for pattern matching:</p> -<pre class="prettyprint source lang-plaintext"><code>result : when value is - 0 then "zero" - 1 then "one" - _ then "other"; -</code></pre> -<h3>Tables</h3> -<p>Create and access data structures:</p> -<pre class="prettyprint source lang-plaintext"><code>// Array-like -numbers : {1, 2, 3, 4, 5}; - -// Key-value pairs -person : {name: "Alice", age: 30, active: true}; - -// Boolean keys -flags : {true: "enabled", false: "disabled"}; -</code></pre> -<h3>Function References</h3> -<p>Use <code>@</code> to reference functions:</p> -<pre class="prettyprint source lang-plaintext"><code>numbers : {1, 2, 3, 4, 5}; -doubled : map @double numbers; -</code></pre> -<h2>Combinators and Higher-Order Functions</h2> -<p>The language provides a comprehensive set of combinators for functional programming:</p> -<h3>Core Combinators</h3> -<ul> -<li><strong><code>map(f, x)</code></strong> - Transform elements in collections</li> -<li><strong><code>filter(p, x)</code></strong> - Select elements based on predicates</li> -<li><strong><code>reduce(f, init, x)</code></strong> - Accumulate values into a single result</li> -<li><strong><code>each(f, x)</code></strong> - Multi-argument element-wise operations</li> -</ul> -<h3>Function Composition</h3> -<ul> -<li><strong><code>compose(f, g)</code></strong> - Right-to-left composition (mathematical style)</li> -<li><strong><code>pipe(f, g)</code></strong> - Left-to-right composition (pipeline style)</li> -<li><strong><code>via</code> operator</strong> - Natural composition syntax: <code>f via g via h</code></li> -</ul> -<h3>Table Operations (<code>t.</code> namespace)</h3> -<ul> -<li><strong><code>t.map</code></strong>, <strong><code>t.filter</code></strong>, <strong><code>t.set</code></strong>, <strong><code>t.delete</code></strong>, <strong><code>t.merge</code></strong>, <strong><code>t.get</code></strong>, <strong><code>t.has</code></strong>, <strong><code>t.length</code></strong></li> -<li>All operations are immutable and return new tables</li> -</ul> -<h3>When to Use Which Combinator</h3> -<ul> -<li><strong><code>map</code> vs <code>t.map</code></strong>: Use <code>map</code> for general collections, <code>t.map</code> to emphasize table operations</li> -<li><strong><code>each</code> vs <code>map</code></strong>: Use <code>each</code> for multi-argument operations, <code>map</code> for single-table transformations</li> -<li><strong><code>compose</code> vs <code>pipe</code></strong>: Use <code>compose</code> for mathematical notation, <code>pipe</code> for pipeline notation</li> -</ul> -<h3>Standard Library</h3> -<p>The language includes a comprehensive standard library:</p> -<p><strong>Arithmetic</strong>: <code>add</code>, <code>subtract</code>, <code>multiply</code>, <code>divide</code>, <code>modulo</code>, <code>power</code>, <code>negate</code><br> -<strong>Comparison</strong>: <code>equals</code>, <code>notEquals</code>, <code>lessThan</code>, <code>greaterThan</code>, <code>lessEqual</code>, <code>greaterEqual</code><br> -<strong>Logical</strong>: <code>logicalAnd</code>, <code>logicalOr</code>, <code>logicalXor</code>, <code>logicalNot</code><br> -<strong>Higher-Order</strong>: <code>map</code>, <code>compose</code>, <code>pipe</code>, <code>apply</code>, <code>filter</code>, <code>reduce</code>, <code>fold</code>, <code>curry</code>, <code>each</code><br> -<strong>Enhanced</strong>: <code>identity</code>, <code>constant</code>, <code>flip</code>, <code>on</code>, <code>both</code>, <code>either</code><br> -<strong>Table Operations</strong>: <code>t.map</code>, <code>t.filter</code>, <code>t.set</code>, <code>t.delete</code>, <code>t.merge</code>, <code>t.get</code>, <code>t.has</code>, <code>t.length</code></p> -<h2>Key Language Takeaways</h2> -<ul> -<li><strong>Function application with negative arguments requires parentheses:</strong> -<ul> -<li>Example: <code>f (-5)</code> applies <code>f</code> to <code>-5</code>.</li> -</ul> -</li> -<li><strong>Infix minus (<code>-</code>) is always parsed as subtraction:</strong> -<ul> -<li>Example: <code>3 - 4</code> is parsed as <code>subtract(3, 4)</code>.</li> -</ul> -</li> -<li><strong>Ambiguous syntax like <code>f -5</code> is not supported:</strong> -<ul> -<li>Use parentheses for negative arguments in function application.</li> -</ul> -</li> -<li><strong>Table operations are immutable:</strong> -<ul> -<li>All <code>t.</code> namespace operations return new tables, never modify existing ones.</li> -</ul> -</li> -<li><strong><code>each</code> is for multi-argument operations:</strong> -<ul> -<li>Use <code>map</code> for single-table transformations, <code>each</code> for combining multiple collections.</li> -</ul> -</li> -</ul> -<p>These rules ensure that function application and infix operators are unambiguous and match functional language conventions.</p> -<h2>Architecture</h2> -<p>The language uses a combinator-based architecture where all operations are translated to function calls:</p> -<ol> -<li><strong>Lexer</strong>: Converts source code into tokens</li> -<li><strong>Parser</strong>: Translates tokens into AST, converting operators to combinator calls</li> -<li><strong>Interpreter</strong>: Executes combinator functions from the standard library</li> -</ol> -<p>This approach eliminates parsing ambiguity while preserving syntax and enabling powerful functional programming patterns.</p> -<h2>Testing</h2> -<p>Run the complete test suite:</p> -<pre class="prettyprint source lang-bash"><code>./run_tests.sh -</code></pre> -<p>All 24 tests should pass, covering:</p> -<ul> -<li>Basic lexer and parser functionality</li> -<li>Arithmetic and comparison operations</li> -<li>Function definitions and calls</li> -<li>Pattern matching and case expressions</li> -<li>Table literals and access</li> -<li>Standard library functions</li> -<li>Error handling and edge cases</li> -<li>Table enhancements and combinators</li> -<li>Integration tests</li> -</ul> -<h2>Documentation</h2> -<ul> -<li><strong><a href="tutorials/Introduction.md">tutorials/Introduction.md</a></strong> - Learn how to use the language</li> -<li><strong><a href="tutorials/Combinators_Deep_Dive.md">tutorials/Combinators_Deep_Dive.md</a></strong> - Advanced combinator patterns and problem-solving</li> -<li><strong><a href="design/ARCHITECTURE.md">design/ARCHITECTURE.md</a></strong> - Detailed architecture overview</li> -<li><strong><a href="design/README.md">design/README.md</a></strong> - Design principles and patterns</li> -<li><strong><a href="design/HISTORY/">design/HISTORY/</a></strong> - Implementation journey and decisions</li> -</ul> -<h2>Development</h2> -<h3>Project Structure</h3> -<pre class="prettyprint source"><code>scripting-lang/ -├── lang.js # Main interpreter and standard library -├── lexer.js # Lexical analysis -├── parser.js # Parsing and AST generation -├── tests/ # Test files (.txt format) -├── design/ # Architecture and design documentation -│ ├── ARCHITECTURE.md -│ ├── README.md -│ └── HISTORY/ # Historical implementation records -└── docs/ # Generated documentation -</code></pre> -<h3>Debug Mode</h3> -<p>Enable debug output for development:</p> -<pre class="prettyprint source lang-bash"><code>DEBUG=1 node lang.js your-script.txt -</code></pre> -<h3>Adding Features</h3> -<p>The language is designed to be extensible. To add new features:</p> -<ol> -<li><strong>Add tokens</strong> in <code>lexer.js</code></li> -<li><strong>Add parsing logic</strong> in <code>parser.js</code></li> -<li><strong>Add evaluation logic</strong> in <code>lang.js</code></li> -<li><strong>Add tests</strong> in <code>tests/</code></li> -<li><strong>Update documentation</strong></li> -</ol></article> - </section> - - - - - - -</div> - -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - -<br class="clear"> - -<footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) -</footer> - -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> -</body> -</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/styles/jsdoc-default.css b/js/scripting-lang/docs/scripting-lang/0.0.1/styles/jsdoc-default.css deleted file mode 100644 index 7d1729d..0000000 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/styles/jsdoc-default.css +++ /dev/null @@ -1,358 +0,0 @@ -@font-face { - font-family: 'Open Sans'; - font-weight: normal; - font-style: normal; - src: url('../fonts/OpenSans-Regular-webfont.eot'); - src: - local('Open Sans'), - local('OpenSans'), - url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'), - url('../fonts/OpenSans-Regular-webfont.woff') format('woff'), - url('../fonts/OpenSans-Regular-webfont.svg#open_sansregular') format('svg'); -} - -@font-face { - font-family: 'Open Sans Light'; - font-weight: normal; - font-style: normal; - src: url('../fonts/OpenSans-Light-webfont.eot'); - src: - local('Open Sans Light'), - local('OpenSans Light'), - url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'), - url('../fonts/OpenSans-Light-webfont.woff') format('woff'), - url('../fonts/OpenSans-Light-webfont.svg#open_sanslight') format('svg'); -} - -html -{ - overflow: auto; - background-color: #fff; - font-size: 14px; -} - -body -{ - font-family: 'Open Sans', sans-serif; - line-height: 1.5; - color: #4d4e53; - background-color: white; -} - -a, a:visited, a:active { - color: #0095dd; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -header -{ - display: block; - padding: 0px 4px; -} - -tt, code, kbd, samp { - font-family: Consolas, Monaco, 'Andale Mono', monospace; -} - -.class-description { - font-size: 130%; - line-height: 140%; - margin-bottom: 1em; - margin-top: 1em; -} - -.class-description:empty { - margin: 0; -} - -#main { - float: left; - width: 70%; -} - -article dl { - margin-bottom: 40px; -} - -article img { - max-width: 100%; -} - -section -{ - display: block; - background-color: #fff; - padding: 12px 24px; - border-bottom: 1px solid #ccc; - margin-right: 30px; -} - -.variation { - display: none; -} - -.signature-attributes { - font-size: 60%; - color: #aaa; - font-style: italic; - font-weight: lighter; -} - -nav -{ - display: block; - float: right; - margin-top: 28px; - width: 30%; - box-sizing: border-box; - border-left: 1px solid #ccc; - padding-left: 16px; -} - -nav ul { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif; - font-size: 100%; - line-height: 17px; - padding: 0; - margin: 0; - list-style-type: none; -} - -nav ul a, nav ul a:visited, nav ul a:active { - font-family: Consolas, Monaco, 'Andale Mono', monospace; - line-height: 18px; - color: #4D4E53; -} - -nav h3 { - margin-top: 12px; -} - -nav li { - margin-top: 6px; -} - -footer { - display: block; - padding: 6px; - margin-top: 12px; - font-style: italic; - font-size: 90%; -} - -h1, h2, h3, h4 { - font-weight: 200; - margin: 0; -} - -h1 -{ - font-family: 'Open Sans Light', sans-serif; - font-size: 48px; - letter-spacing: -2px; - margin: 12px 24px 20px; -} - -h2, h3.subsection-title -{ - font-size: 30px; - font-weight: 700; - letter-spacing: -1px; - margin-bottom: 12px; -} - -h3 -{ - font-size: 24px; - letter-spacing: -0.5px; - margin-bottom: 12px; -} - -h4 -{ - font-size: 18px; - letter-spacing: -0.33px; - margin-bottom: 12px; - color: #4d4e53; -} - -h5, .container-overview .subsection-title -{ - font-size: 120%; - font-weight: bold; - letter-spacing: -0.01em; - margin: 8px 0 3px 0; -} - -h6 -{ - font-size: 100%; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; - font-style: italic; -} - -table -{ - border-spacing: 0; - border: 0; - border-collapse: collapse; -} - -td, th -{ - border: 1px solid #ddd; - margin: 0px; - text-align: left; - vertical-align: top; - padding: 4px 6px; - display: table-cell; -} - -thead tr -{ - background-color: #ddd; - font-weight: bold; -} - -th { border-right: 1px solid #aaa; } -tr > th:last-child { border-right: 1px solid #ddd; } - -.ancestors, .attribs { color: #999; } -.ancestors a, .attribs a -{ - color: #999 !important; - text-decoration: none; -} - -.clear -{ - clear: both; -} - -.important -{ - font-weight: bold; - color: #950B02; -} - -.yes-def { - text-indent: -1000px; -} - -.type-signature { - color: #aaa; -} - -.name, .signature { - font-family: Consolas, Monaco, 'Andale Mono', monospace; -} - -.details { margin-top: 14px; border-left: 2px solid #DDD; } -.details dt { width: 120px; float: left; padding-left: 10px; padding-top: 6px; } -.details dd { margin-left: 70px; } -.details ul { margin: 0; } -.details ul { list-style-type: none; } -.details li { margin-left: 30px; padding-top: 6px; } -.details pre.prettyprint { margin: 0 } -.details .object-value { padding-top: 0; } - -.description { - margin-bottom: 1em; - margin-top: 1em; -} - -.code-caption -{ - font-style: italic; - font-size: 107%; - margin: 0; -} - -.source -{ - border: 1px solid #ddd; - width: 80%; - overflow: auto; -} - -.prettyprint.source { - width: inherit; -} - -.source code -{ - font-size: 100%; - line-height: 18px; - display: block; - padding: 4px 12px; - margin: 0; - background-color: #fff; - color: #4D4E53; -} - -.prettyprint code span.line -{ - display: inline-block; -} - -.prettyprint.linenums -{ - padding-left: 70px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.prettyprint.linenums ol -{ - padding-left: 0; -} - -.prettyprint.linenums li -{ - border-left: 3px #ddd solid; -} - -.prettyprint.linenums li.selected, -.prettyprint.linenums li.selected * -{ - background-color: lightyellow; -} - -.prettyprint.linenums li * -{ - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.params .name, .props .name, .name code { - color: #4D4E53; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 100%; -} - -.params td.description > p:first-child, -.props td.description > p:first-child -{ - margin-top: 0; - padding-top: 0; -} - -.params td.description > p:last-child, -.props td.description > p:last-child -{ - margin-bottom: 0; - padding-bottom: 0; -} - -.disabled { - color: #454545; -} diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-01_Juxtaposition_Function_Application.html b/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-01_Juxtaposition_Function_Application.html deleted file mode 100644 index e3b1ed2..0000000 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-01_Juxtaposition_Function_Application.html +++ /dev/null @@ -1,199 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>JSDoc: Tutorial: 01_Juxtaposition_Function_Application</title> - - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> - <!--[if lt IE 9]> - <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> - <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> -</head> - -<body> - -<div id="main"> - - <h1 class="page-title">Tutorial: 01_Juxtaposition_Function_Application</h1> - - <section> - -<header> - - - <h2>01_Juxtaposition_Function_Application</h2> -</header> - -<article> - <h1>Juxtaposition-Based Function Application</h1> -<h2>What is Juxtaposition?</h2> -<p>Juxtaposition means "placing side by side" - in our language, this means you can call functions by simply placing the function name next to its arguments, <strong>without parentheses</strong>.</p> -<pre class="prettyprint source lang-plaintext"><code>/* Traditional syntax: f(x, y) */ -/* Our syntax: f x y */ -</code></pre> -<h2>Why is This Esoteric?</h2> -<p>Most programming languages require parentheses for function calls. Our language eliminates them entirely, making function application look like mathematical notation.</p> -<h2>Basic Examples</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Simple function calls */ -add 5 3; /* Instead of add(5, 3) */ -multiply 4 7; /* Instead of multiply(4, 7) */ -subtract 10 3; /* Instead of subtract(10, 3) */ - -/* Function calls with tables */ -map double {1, 2, 3, 4, 5}; -filter is_even {1, 2, 3, 4, 5, 6}; -reduce add 0 {1, 2, 3, 4, 5}; -</code></pre> -<h2>How It Works</h2> -<p>The parser automatically translates juxtaposition into nested <code>apply</code> calls:</p> -<pre class="prettyprint source lang-plaintext"><code>/* f x y becomes: apply(apply(f, x), y) */ -/* map double {1, 2, 3} becomes: apply(apply(map, double), {1, 2, 3}) */ -</code></pre> -<h2>Precedence Rules</h2> -<p>Juxtaposition has <strong>lower precedence</strong> than operators:</p> -<pre class="prettyprint source lang-plaintext"><code>/* This works as expected */ -result : add 5 multiply 3 4; -/* Parsed as: add 5 (multiply 3 4) */ -/* Result: 5 + (3 * 4) = 17 */ - -/* Not as: (add 5 multiply) 3 4 */ -</code></pre> -<h2>Complex Examples</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Nested function calls */ -result : map double filter is_even {1, 2, 3, 4, 5, 6}; -/* Parsed as: map double (filter is_even {1, 2, 3, 4, 5, 6}) */ -/* Result: {4, 8, 12} */ - -/* Function composition with juxtaposition */ -double : x -> x * 2; -increment : x -> x + 1; -result : compose double increment 5; -/* Parsed as: (compose double increment) 5 */ -/* Result: double(increment(5)) = double(6) = 12 */ -</code></pre> -<h2>When to Use Juxtaposition</h2> -<p><strong>Use juxtaposition when:</strong></p> -<ul> -<li>Calling functions with arguments</li> -<li>Building function composition chains</li> -<li>Working with combinators like <code>map</code>, <code>filter</code>, <code>reduce</code></li> -</ul> -<p><strong>Don't use juxtaposition when:</strong></p> -<ul> -<li>Defining functions (use <code>:</code> and <code>-></code>)</li> -<li>Assigning values (use <code>:</code>)</li> -<li>Using operators (use <code>+</code>, <code>-</code>, <code>*</code>, etc.)</li> -</ul> -<h2>Common Patterns</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Data processing pipeline */ -data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; -is_even : x -> x % 2 = 0; -double : x -> x * 2; -sum : x -> reduce add 0 x; - -/* Pipeline using juxtaposition */ -result : sum map double filter is_even data; -/* Reads: sum (map double (filter is_even data)) */ -/* Result: 60 */ -</code></pre> -<h2>Using Parentheses for Control</h2> -<p>While juxtaposition eliminates the need for parentheses in most cases, parentheses are still available when you need explicit control over precedence or grouping.</p> -<h3>When to Use Parentheses</h3> -<p><strong>Use parentheses when:</strong></p> -<ul> -<li><strong>Controlling precedence</strong> - when the default left-associative parsing doesn't give you what you want</li> -<li><strong>Grouping expressions</strong> - to make complex expressions more readable</li> -<li><strong>Breaking ambiguity</strong> - when the parser might misinterpret your intent</li> -<li><strong>Debugging</strong> - to isolate and test specific parts of complex expressions</li> -</ul> -<h3>Precedence Control Examples</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Without parentheses - left-associative */ -result1 : add 5 multiply 3 4; -/* Parsed as: add 5 (multiply 3 4) */ -/* Result: 5 + (3 * 4) = 17 */ - -/* With parentheses - explicit grouping */ -result2 : add (add 1 2) (multiply 3 4); -/* Explicitly: (1 + 2) + (3 * 4) = 3 + 12 = 15 */ - -/* Complex nested operations */ -result3 : map double (filter is_even (map increment {1, 2, 3, 4, 5})); -/* Step by step: - 1. map increment {1, 2, 3, 4, 5} → {2, 3, 4, 5, 6} - 2. filter is_even {2, 3, 4, 5, 6} → {2, 4, 6} - 3. map double {2, 4, 6} → {4, 8, 12} -*/ -</code></pre> -<h3>Readability and Clarity</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Hard to read without parentheses */ -complex : map double filter is_even map increment {1, 2, 3, 4, 5}; - -/* Much clearer with parentheses */ -complex : map double (filter is_even (map increment {1, 2, 3, 4, 5})); - -/* Or break it into steps for maximum clarity */ -step1 : map increment {1, 2, 3, 4, 5}; -step2 : filter is_even step1; -step3 : map double step2; -</code></pre> -<h3>Debugging with Parentheses</h3> -<pre class="prettyprint source lang-plaintext"><code>/* When debugging, use parentheses to isolate parts */ -data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - -/* Test each step separately */ -filtered : filter is_even data; -doubled : map double filtered; -final : reduce add 0 doubled; - -/* Or use parentheses to test intermediate results */ -test1 : filter is_even data; /* {2, 4, 6, 8, 10} */ -test2 : map double (filter is_even data); /* {4, 8, 12, 16, 20} */ -</code></pre> -<h2>Debugging Juxtaposition</h2> -<p>If you get unexpected results, check the precedence:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Wrong: This doesn't work as expected */ -result : map double filter is_even {1, 2, 3, 4, 5}; - -/* Right: Use parentheses to control precedence */ -result : map double (filter is_even {1, 2, 3, 4, 5}); -</code></pre> -<h2>Key Takeaways</h2> -<ol> -<li><strong>No parentheses needed</strong> for function calls</li> -<li><strong>Left-associative</strong> - <code>f x y</code> means <code>(f x) y</code></li> -<li><strong>Lower precedence</strong> than operators</li> -<li><strong>Mathematical notation</strong> - looks like <code>f(x, y)</code> but written as <code>f x y</code></li> -<li><strong>Nested automatically</strong> - complex calls become nested <code>apply</code> calls</li> -</ol> -<h2>Why This Matters</h2> -<p>Juxtaposition makes the language feel more mathematical and less like traditional programming. It enables:</p> -<ul> -<li><strong>Concise syntax</strong> - less punctuation</li> -<li><strong>Natural reading</strong> - <code>map double numbers</code> reads like "map double over numbers"</li> -<li><strong>Functional style</strong> - emphasizes function application over method calls</li> -<li><strong>Composition focus</strong> - makes function composition the primary operation</li> -</ul> -<p>This is one of the most distinctive features of our language - it completely changes how you think about function calls! 🚀</p> -</article> - -</section> - -</div> - -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - -<br class="clear"> - -<footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) -</footer> - -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> -</body> -</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-02_Right_Associative_Via_Operator.html b/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-02_Right_Associative_Via_Operator.html deleted file mode 100644 index 20585f9..0000000 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-02_Right_Associative_Via_Operator.html +++ /dev/null @@ -1,203 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>JSDoc: Tutorial: 02_Right_Associative_Via_Operator</title> - - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> - <!--[if lt IE 9]> - <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> - <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> -</head> - -<body> - -<div id="main"> - - <h1 class="page-title">Tutorial: 02_Right_Associative_Via_Operator</h1> - - <section> - -<header> - - - <h2>02_Right_Associative_Via_Operator</h2> -</header> - -<article> - <h1>Right-Associative <code>via</code> Operator</h1> -<h2>What is the <code>via</code> Operator?</h2> -<p>The <code>via</code> operator is a <strong>function composition operator</strong> that combines functions from right to left, matching mathematical function composition notation.</p> -<pre class="prettyprint source lang-plaintext"><code>/* f via g = compose(f, g) */ -/* f via g via h = compose(f, compose(g, h)) */ -</code></pre> -<h2>Why is This Esoteric?</h2> -<p>Most composition operators in programming languages are <strong>left-associative</strong>. Our <code>via</code> operator is <strong>right-associative</strong>, which means:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Right-associative: f via g via h = f via (g via h) */ -/* Left-associative: f via g via h = (f via g) via h */ -</code></pre> -<p>This matches mathematical notation where <code>(f ∘ g ∘ h)(x) = f(g(h(x)))</code>.</p> -<h2>Basic Examples</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Define simple functions */ -double : x -> x * 2; -increment : x -> x + 1; -square : x -> x * x; - -/* Basic via composition */ -result1 : double via increment 5; -/* Result: 12 (5+1=6, 6*2=12) */ - -/* Chained via composition */ -result2 : double via increment via square 3; -/* Result: 20 (3^2=9, 9+1=10, 10*2=20) */ -</code></pre> -<h2>Right-Associative Behavior Explained</h2> -<p>The key insight is that <code>via</code> groups from <strong>right to left</strong>:</p> -<pre class="prettyprint source lang-plaintext"><code>/* This expression: */ -double via increment via square 3 - -/* Groups as: */ -double via (increment via square) 3 - -/* Which translates to: */ -compose(double, compose(increment, square))(3) - -/* Execution order: */ -/* 1. square(3) = 9 */ -/* 2. increment(9) = 10 */ -/* 3. double(10) = 20 */ -</code></pre> -<h2>Comparison with Left-Associative</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Right-associative (our via): */ -double via increment via square 3 -/* = double via (increment via square) 3 */ -/* = double(increment(square(3))) = 20 */ - -/* Left-associative (if it were): */ -double via increment via square 3 -/* = (double via increment) via square 3 */ -/* = square(double(increment(3))) = 64 */ -</code></pre> -<h2>Precedence Rules</h2> -<p>The <code>via</code> operator has <strong>higher precedence</strong> than function application:</p> -<pre class="prettyprint source lang-plaintext"><code>/* via binds tighter than juxtaposition */ -double via increment 5 - -/* This is parsed as: */ -(double via increment) 5 - -/* NOT as: */ -double via (increment 5) -</code></pre> -<h2>Complex Examples</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Data processing pipeline */ -data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; -is_even : x -> x % 2 = 0; -double : x -> x * 2; -sum : x -> reduce add 0 x; - -/* Pipeline using via */ -process_pipeline : sum via map double via filter is_even; -result : process_pipeline data; -/* Reads: sum via (map double via filter is_even) */ -/* Result: 60 */ -</code></pre> -<h2>Mathematical Notation Alignment</h2> -<p>The right-associative behavior aligns with mathematical function composition:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Mathematical: (f ∘ g ∘ h)(x) = f(g(h(x))) */ -/* Our language: f via g via h x = f(g(h(x))) */ - -/* Example: */ -complex_math : square via double via increment; -result : complex_math 3; -/* increment(3)=4, double(4)=8, square(8)=64 */ -/* Result: 64 */ -</code></pre> -<h2>When to Use <code>via</code></h2> -<p><strong>Use <code>via</code> when you want:</strong></p> -<ul> -<li><strong>Natural reading</strong>: <code>f via g via h</code> reads as "f then g then h"</li> -<li><strong>Mathematical notation</strong>: Matches <code>(f ∘ g ∘ h)</code> notation</li> -<li><strong>Concise syntax</strong>: Shorter than nested <code>compose</code> calls</li> -<li><strong>Right-to-left flow</strong>: When you think of data flowing right to left</li> -</ul> -<p><strong>Don't use <code>via</code> when:</strong></p> -<ul> -<li>You need left-to-right composition (use <code>pipe</code>)</li> -<li>You want explicit mathematical style (use <code>compose</code>)</li> -<li>You're working with simple function calls (use juxtaposition)</li> -</ul> -<h2>Common Patterns</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Pattern 1: Data transformation pipeline */ -data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; -is_even : x -> x % 2 = 0; -double : x -> x * 2; -sum : x -> reduce add 0 x; - -/* Pipeline: filter → map → reduce */ -process_pipeline : sum via map double via filter is_even; -result : process_pipeline data; -/* Result: 60 (filter evens: {2,4,6,8,10}, double: {4,8,12,16,20}, sum: 60) */ - -/* Pattern 2: Validation chain */ -validate_positive : x -> x > 0; -validate_even : x -> x % 2 = 0; -validate_small : x -> x < 10; - -/* Chain validations */ -all_validations : validate_small via validate_even via validate_positive; -result : all_validations 6; /* 6 > 0, 6 % 2 = 0, 6 < 10 */ -/* Result: true */ -</code></pre> -<h2>Debugging <code>via</code> Chains</h2> -<p>To understand execution order, break down the chain:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Complex chain: */ -result : square via double via increment via square 2; - -/* Break it down: */ -/* 1. square(2) = 4 */ -/* 2. increment(4) = 5 */ -/* 3. double(5) = 10 */ -/* 4. square(10) = 100 */ -/* Result: 100 */ -</code></pre> -<h2>Key Takeaways</h2> -<ol> -<li><strong>Right-associative</strong> - <code>f via g via h</code> = <code>f via (g via h)</code></li> -<li><strong>Mathematical alignment</strong> - matches <code>(f ∘ g ∘ h)</code> notation</li> -<li><strong>Higher precedence</strong> - binds tighter than function application</li> -<li><strong>Natural reading</strong> - reads from right to left</li> -<li><strong>Concise syntax</strong> - shorter than nested <code>compose</code> calls</li> -</ol> -<h2>Why This Matters</h2> -<p>The right-associative <code>via</code> operator makes function composition feel natural and mathematical:</p> -<ul> -<li><strong>Intuitive flow</strong> - data flows through the pipeline naturally</li> -<li><strong>Mathematical notation</strong> - matches standard mathematical conventions</li> -<li><strong>Concise composition</strong> - complex transformations in readable chains</li> -<li><strong>Functional thinking</strong> - encourages building complex operations from simple functions</li> -</ul> -<p>This is one of the most distinctive features that makes our language feel more like mathematical notation than traditional programming! 🚀</p> -</article> - -</section> - -</div> - -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - -<br class="clear"> - -<footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) -</footer> - -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> -</body> -</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-03_Automatic_Element_Wise_Table_Operations.html b/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-03_Automatic_Element_Wise_Table_Operations.html deleted file mode 100644 index 737ba8f..0000000 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-03_Automatic_Element_Wise_Table_Operations.html +++ /dev/null @@ -1,238 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>JSDoc: Tutorial: 03_Automatic_Element_Wise_Table_Operations</title> - - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> - <!--[if lt IE 9]> - <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> - <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> -</head> - -<body> - -<div id="main"> - - <h1 class="page-title">Tutorial: 03_Automatic_Element_Wise_Table_Operations</h1> - - <section> - -<header> - - - <h2>03_Automatic_Element_Wise_Table_Operations</h2> -</header> - -<article> - <h1>Automatic Element-Wise Table Operations</h1> -<h2>What are Element-Wise Operations?</h2> -<p>Element-wise operations automatically apply functions to every element in a table, <strong>without explicit loops or iteration syntax</strong>.</p> -<pre class="prettyprint source lang-plaintext"><code>/* Instead of: for each element in table, apply function */ -/* You write: function table */ -numbers : {1, 2, 3, 4, 5}; -doubled : map double numbers; /* {2, 4, 6, 8, 10} */ -</code></pre> -<h2>Why is This Esoteric?</h2> -<p>Most programming languages require explicit loops or iteration constructs. Our language automatically handles element-wise operations, making it feel more like mathematical notation or APL.</p> -<h2>Basic Examples</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Define a simple function */ -double : x -> x * 2; - -/* Apply to table elements automatically */ -numbers : {1, 2, 3, 4, 5}; -result : map double numbers; -/* Result: {2, 4, 6, 8, 10} */ - -/* Filter elements automatically */ -is_even : x -> x % 2 = 0; -evens : filter is_even numbers; -/* Result: {2, 4} */ - -/* Reduce all elements automatically */ -sum : reduce add 0 numbers; -/* Result: 15 (1+2+3+4+5) */ -</code></pre> -<h2>How It Works</h2> -<p>The language automatically detects when you're applying functions to tables and handles the iteration internally:</p> -<pre class="prettyprint source lang-plaintext"><code>/* map function table */ -/* The language automatically: */ -/* 1. Iterates through each element in the table */ -/* 2. Applies the function to each element */ -/* 3. Returns a new table with the results */ - -/* filter function table */ -/* The language automatically: */ -/* 1. Iterates through each element in the table */ -/* 2. Applies the function to each element */ -/* 3. Returns a new table with elements where function returns true */ - -/* reduce function initial_value table */ -/* The language automatically: */ -/* 1. Starts with the initial value */ -/* 2. Iterates through each element in the table */ -/* 3. Applies the function to the accumulator and current element */ -/* 4. Returns the final accumulated result */ -</code></pre> -<h2>Table-Specific Operations</h2> -<p>The <code>t.</code> namespace provides additional element-wise operations:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Table-specific operations */ -data : {a: 1, b: 2, c: 3}; - -/* Get all keys */ -keys : t.keys data; /* {"a", "b", "c"} */ - -/* Get all values */ -values : t.values data; /* {1, 2, 3} */ - -/* Get key-value pairs */ -pairs : t.pairs data; /* {{key: "a", value: 1}, {key: "b", value: 2}, {key: "c", value: 3}} */ - -/* Check if key exists */ -has_a : t.has data "a"; /* true */ -has_d : t.has data "d"; /* false */ - -/* Get value by key */ -value_a : t.get data "a"; /* 1 */ -</code></pre> -<h2>Complex Examples</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Data processing pipeline */ -data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - -/* Define helper functions */ -is_even : x -> x % 2 = 0; -double : x -> x * 2; -sum : x -> reduce add 0 x; - -/* Complete pipeline: filter → map → reduce */ -result : sum map double filter is_even data; -/* Step 1: filter is_even data → {2, 4, 6, 8, 10} */ -/* Step 2: map double {2, 4, 6, 8, 10} → {4, 8, 12, 16, 20} */ -/* Step 3: sum {4, 8, 12, 16, 20} → 60 */ -/* Result: 60 */ -</code></pre> -<h2>Nested Tables</h2> -<p>Element-wise operations work with nested table structures:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Nested table */ -people : { - alice: {name: "Alice", age: 30, scores: {85, 90, 88}}, - bob: {name: "Bob", age: 25, scores: {92, 87, 95}}, - charlie: {name: "Charlie", age: 35, scores: {78, 85, 82}} -}; - -/* Extract ages */ -ages : map (x -> x.age) people; -/* Result: {alice: 30, bob: 25, charlie: 35} */ - -/* Calculate average scores for each person */ -get_average : person -> reduce add 0 person.scores / 3; -averages : map get_average people; -/* Result: {alice: 87.67, bob: 91.33, charlie: 81.67} */ -</code></pre> -<h2>The <code>each</code> Combinator</h2> -<p>The <code>each</code> combinator provides multi-argument element-wise operations:</p> -<pre class="prettyprint source lang-plaintext"><code>/* each for multi-argument operations */ -numbers : {1, 2, 3, 4, 5}; -multipliers : {10, 20, 30, 40, 50}; - -/* Multiply corresponding elements */ -result : each multiply numbers multipliers; -/* Result: {10, 40, 90, 160, 250} */ - -/* Compare corresponding elements */ -is_greater : each greaterThan numbers {3, 3, 3, 3, 3}; -/* Result: {false, false, false, true, true} */ -</code></pre> -<h2>Immutability</h2> -<p>All element-wise operations return <strong>new tables</strong>, never modifying the original:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Original table */ -original : {a: 1, b: 2, c: 3}; - -/* Operations return new tables */ -doubled : map double original; /* {a: 2, b: 4, c: 6} */ -filtered : filter (x -> x > 1) original; /* {b: 2, c: 3} */ - -/* Original is unchanged */ -/* original is still {a: 1, b: 2, c: 3} */ -</code></pre> -<h2>When to Use Element-Wise Operations</h2> -<p><strong>Use element-wise operations when:</strong></p> -<ul> -<li>Processing collections of data</li> -<li>Applying the same transformation to multiple values</li> -<li>Filtering data based on conditions</li> -<li>Aggregating data (sum, average, etc.)</li> -<li>Working with table structures</li> -</ul> -<p><strong>Don't use element-wise operations when:</strong></p> -<ul> -<li>You need side effects (they're not supported)</li> -<li>You need to modify the original data (use immutable operations)</li> -<li>You need complex control flow (use <code>when</code> expressions)</li> -</ul> -<h2>Common Patterns</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Pattern 1: Data transformation */ -data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; -transform : x -> x * x + 1; /* Square and add 1 */ -result : map transform data; -/* Result: {2, 5, 10, 17, 26, 37, 50, 65, 82, 101} */ - -/* Pattern 2: Data validation */ -users : { - alice: {age: 25, email: "alice@test.com"}, - bob: {age: 17, email: "bob@test.com"}, - charlie: {age: 30, email: "invalid"} -}; - -/* Check if all users are adults */ -is_adult : user -> user.age >= 18; -all_adults : reduce logicalAnd true map is_adult users; -/* Result: false (bob is under 18) */ - -/* Pattern 3: Data aggregation */ -scores : {85, 92, 78, 96, 88, 91}; -average : reduce add 0 scores / 6; -max_score : reduce (max x y) 0 scores; -min_score : reduce (min x y) 1000 scores; -</code></pre> -<h2>Key Takeaways</h2> -<ol> -<li><strong>No explicit loops</strong> - iteration is automatic</li> -<li><strong>Mathematical notation</strong> - feels like mathematical operations</li> -<li><strong>Immutable</strong> - all operations return new tables</li> -<li><strong>Composable</strong> - operations can be chained together</li> -<li><strong>APL-inspired</strong> - similar to array programming languages</li> -</ol> -<h2>Why This Matters</h2> -<p>Automatic element-wise operations make data processing feel natural and mathematical:</p> -<ul> -<li><strong>Concise syntax</strong> - no boilerplate iteration code</li> -<li><strong>Mathematical thinking</strong> - operations on entire collections at once</li> -<li><strong>Functional style</strong> - emphasis on transformations over loops</li> -<li><strong>Composability</strong> - operations can be combined into pipelines</li> -<li><strong>Immutability</strong> - prevents bugs from shared mutable state</li> -</ul> -<p>This feature makes the language feel more like mathematical notation than traditional programming! 🚀</p> -</article> - -</section> - -</div> - -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - -<br class="clear"> - -<footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) -</footer> - -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> -</body> -</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-04_Partial_Application_by_Default.html b/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-04_Partial_Application_by_Default.html deleted file mode 100644 index 314f936..0000000 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-04_Partial_Application_by_Default.html +++ /dev/null @@ -1,243 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>JSDoc: Tutorial: 04_Partial_Application_by_Default</title> - - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> - <!--[if lt IE 9]> - <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> - <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> -</head> - -<body> - -<div id="main"> - - <h1 class="page-title">Tutorial: 04_Partial_Application_by_Default</h1> - - <section> - -<header> - - - <h2>04_Partial_Application_by_Default</h2> -</header> - -<article> - <h1>Partial Application by Default (Currying)</h1> -<h2>What is Partial Application?</h2> -<p>Partial application means that functions automatically return new functions when called with fewer arguments than they expect. This is also called <strong>currying</strong>.</p> -<pre class="prettyprint source lang-plaintext"><code>/* Functions automatically return new functions when partially applied */ -add : x y -> x + y; -add_five : add 5; /* Returns a function that adds 5 */ -result : add_five 3; /* 8 */ -</code></pre> -<h2>Why is This Esoteric?</h2> -<p>Most programming languages require explicit syntax for partial application or currying. In our language, <strong>every function is automatically curried</strong> - no special syntax needed.</p> -<h2>Basic Examples</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Define a two-argument function */ -add : x y -> x + y; - -/* Call with both arguments */ -result1 : add 5 3; /* 8 */ - -/* Call with one argument - returns a new function */ -add_five : add 5; /* Returns: y -> 5 + y */ - -/* Call the returned function */ -result2 : add_five 3; /* 8 */ - -/* Chain partial applications */ -add_ten : add 10; /* y -> 10 + y */ -add_ten_five : add_ten 5; /* 15 */ -</code></pre> -<h2>How It Works</h2> -<p>The language automatically handles partial application through nested function returns:</p> -<pre class="prettyprint source lang-plaintext"><code>/* When you define: add : x y -> x + y; */ -/* The language creates: add = x -> (y -> x + y) */ - -/* When you call: add 5 */ -/* It returns: y -> 5 + y */ - -/* When you call: add 5 3 */ -/* It calls: (y -> 5 + y)(3) = 5 + 3 = 8 */ -</code></pre> -<h2>Multi-Argument Functions</h2> -<p>Partial application works with any number of arguments:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Three-argument function */ -multiply_add : x y z -> x * y + z; - -/* Partial application examples */ -multiply_by_two : multiply_add 2; /* y z -> 2 * y + z */ -multiply_by_two_add_ten : multiply_add 2 5; /* z -> 2 * 5 + z */ - -/* Full application */ -result1 : multiply_add 2 5 3; /* 2 * 5 + 3 = 13 */ -result2 : multiply_by_two 5 3; /* 2 * 5 + 3 = 13 */ -result3 : multiply_by_two_add_ten 3; /* 2 * 5 + 3 = 13 */ -</code></pre> -<h2>Standard Library Functions</h2> -<p>All standard library functions support partial application:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Arithmetic functions */ -double : multiply 2; /* x -> 2 * x */ -increment : add 1; /* x -> x + 1 */ -decrement : subtract 1; /* x -> x - 1 */ - -/* Comparison functions */ -is_positive : greaterThan 0; /* x -> x > 0 */ -is_even : equals 0; /* This won't work as expected - see below */ - -/* Logical functions */ -always_true : logicalOr true; /* x -> true || x */ -always_false : logicalAnd false; /* x -> false && x */ -</code></pre> -<h2>Common Patterns</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Pattern 1: Creating specialized functions */ -numbers : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - -/* Create specialized filters */ -is_even : x -> x % 2 = 0; -is_odd : x -> x % 2 = 1; -is_greater_than_five : greaterThan 5; - -/* Use with map and filter */ -evens : filter is_even numbers; /* {2, 4, 6, 8, 10} */ -odds : filter is_odd numbers; /* {1, 3, 5, 7, 9} */ -large_numbers : filter is_greater_than_five numbers; /* {6, 7, 8, 9, 10} */ - -/* Pattern 2: Creating transformation functions */ -double : multiply 2; -triple : multiply 3; -add_ten : add 10; - -/* Apply transformations */ -doubled : map double numbers; /* {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} */ -tripled : map triple numbers; /* {3, 6, 9, 12, 15, 18, 21, 24, 27, 30} */ -plus_ten : map add_ten numbers; /* {11, 12, 13, 14, 15, 16, 17, 18, 19, 20} */ -</code></pre> -<h2>Function Composition with Partial Application</h2> -<p>Partial application works seamlessly with function composition:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Create specialized functions */ -double : multiply 2; -increment : add 1; -square : x -> x * x; - -/* Compose partially applied functions */ -double_then_increment : compose increment double; -increment_then_square : compose square increment; - -/* Use in pipelines */ -result1 : double_then_increment 5; /* double(5)=10, increment(10)=11 */ -result2 : increment_then_square 5; /* increment(5)=6, square(6)=36 */ -</code></pre> -<h2>Table Operations with Partial Application</h2> -<p>The <code>t.</code> namespace functions also support partial application:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Create specialized table operations */ -get_name : t.get "name"; -get_age : t.get "age"; -has_admin : t.has "admin"; - -/* Use with map */ -people : { - alice: {name: "Alice", age: 30, admin: true}, - bob: {name: "Bob", age: 25, admin: false}, - charlie: {name: "Charlie", age: 35, admin: true} -}; - -names : map get_name people; /* {alice: "Alice", bob: "Bob", charlie: "Charlie"} */ -ages : map get_age people; /* {alice: 30, bob: 25, charlie: 35} */ -admins : map has_admin people; /* {alice: true, bob: false, charlie: true} */ -</code></pre> -<h2>The <code>each</code> Combinator with Partial Application</h2> -<p>The <code>each</code> combinator works well with partial application:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Create specialized comparison functions */ -is_greater_than_three : greaterThan 3; -is_less_than_seven : lessThan 7; - -/* Use with each for element-wise comparison */ -numbers : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - -greater_than_three : each is_greater_than_three numbers; -/* Result: {false, false, false, true, true, true, true, true, true, true} */ - -less_than_seven : each is_less_than_seven numbers; -/* Result: {true, true, true, true, true, true, false, false, false, false} */ -</code></pre> -<h2>When to Use Partial Application</h2> -<p><strong>Use partial application when:</strong></p> -<ul> -<li>Creating specialized functions from general ones</li> -<li>Building function composition chains</li> -<li>Working with combinators like <code>map</code>, <code>filter</code>, <code>reduce</code></li> -<li>Creating reusable function components</li> -<li>Simplifying complex function calls</li> -</ul> -<p><strong>Don't use partial application when:</strong></p> -<ul> -<li>You need to call functions with all arguments immediately</li> -<li>You're working with simple, single-purpose functions</li> -<li>You need to modify the function behavior significantly</li> -</ul> -<h2>Common Patterns</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Pattern 1: Function factories */ -create_multiplier : factor -> multiply factor; -double : create_multiplier 2; -triple : create_multiplier 3; -quadruple : create_multiplier 4; - -/* Pattern 2: Specialized validators */ -create_range_validator : min max -> x -> x >= min && x <= max; -is_valid_age : create_range_validator 0 120; -is_valid_score : create_range_validator 0 100; - -/* Pattern 3: Configuration functions */ -create_formatter : prefix suffix -> x -> prefix + x + suffix; -format_name : create_formatter "Name: " "!"; -format_age : create_formatter "Age: " " years"; - -/* Usage */ -result1 : format_name "Alice"; /* "Name: Alice!" */ -result2 : format_age "30"; /* "Age: 30 years" */ -</code></pre> -<h2>Key Takeaways</h2> -<ol> -<li><strong>Automatic currying</strong> - every function is automatically curried</li> -<li><strong>No special syntax</strong> - just call with fewer arguments</li> -<li><strong>Nested functions</strong> - partial application creates nested function calls</li> -<li><strong>Composable</strong> - works seamlessly with function composition</li> -<li><strong>Reusable</strong> - create specialized functions from general ones</li> -</ol> -<h2>Why This Matters</h2> -<p>Partial application by default makes the language more functional and composable:</p> -<ul> -<li><strong>Function factories</strong> - create specialized functions easily</li> -<li><strong>Composition focus</strong> - encourages building complex functions from simple ones</li> -<li><strong>Reusability</strong> - general functions can be specialized for specific use cases</li> -<li><strong>Mathematical thinking</strong> - functions are treated as mathematical objects</li> -<li><strong>Concise syntax</strong> - no explicit currying syntax needed</li> -</ul> -<p>This feature makes the language feel more like mathematical function theory than traditional programming! 🚀</p> -</article> - -</section> - -</div> - -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - -<br class="clear"> - -<footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) -</footer> - -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> -</body> -</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-05_When_Expressions_Pattern_Matching.html b/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-05_When_Expressions_Pattern_Matching.html deleted file mode 100644 index ad46d06..0000000 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-05_When_Expressions_Pattern_Matching.html +++ /dev/null @@ -1,227 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>JSDoc: Tutorial: 05_When_Expressions_Pattern_Matching</title> - - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> - <!--[if lt IE 9]> - <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> - <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> -</head> - -<body> - -<div id="main"> - - <h1 class="page-title">Tutorial: 05_When_Expressions_Pattern_Matching</h1> - - <section> - -<header> - - - <h2>05_When_Expressions_Pattern_Matching</h2> -</header> - -<article> - <h1><code>when</code> Expressions (Pattern Matching)</h1> -<h2>What are <code>when</code> Expressions?</h2> -<p><code>when</code> expressions provide pattern matching functionality, allowing you to match values against patterns and execute different code based on the match.</p> -<pre class="prettyprint source lang-plaintext"><code>/* Pattern matching with when expressions */ -result : when x is - 0 then "zero" - 1 then "one" - _ then "other"; -</code></pre> -<h2>Why is This Esoteric?</h2> -<p>Pattern matching is common in functional languages but rare in imperative/OOP languages. The <code>when</code> syntax with <code>then</code> clauses and <code>_</code> wildcards is unique to our language.</p> -<h2>Basic Examples</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Simple pattern matching */ -x : 5; -result : when x is - 0 then "zero" - 1 then "one" - 2 then "two" - _ then "other"; -/* Result: "other" */ - -/* Pattern matching with numbers */ -grade : 85; -letter_grade : when grade is - 90 then "A" - 80 then "B" - 70 then "C" - 60 then "D" - _ then "F"; -/* Result: "B" */ -</code></pre> -<h2>Pattern Types</h2> -<h3>Literal Patterns</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Match exact values */ -result : when value is - true then "yes" - false then "no" - _ then "maybe"; -</code></pre> -<h3>Wildcard Pattern</h3> -<pre class="prettyprint source lang-plaintext"><code>/* _ matches anything */ -result : when x is - 0 then "zero" - _ then "not zero"; -</code></pre> -<h3>Function Reference Patterns</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Match function references */ -double : x -> x * 2; -square : x -> x * x; - -result : when function is - @double then "doubling function" - @square then "squaring function" - _ then "other function"; -</code></pre> -<h3>Boolean Patterns</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Match boolean values */ -result : when condition is - true then "condition is true" - false then "condition is false"; -</code></pre> -<h2>Complex Examples</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Grade classification with ranges */ -score : 85; -grade : when score is - when score >= 90 then "A" - when score >= 80 then "B" - when score >= 70 then "C" - when score >= 60 then "D" - _ then "F"; -/* Result: "B" */ - -/* Multiple conditions */ -x : 5; -y : 10; -result : when x is - when x = y then "equal" - when x > y then "x is greater" - when x < y then "x is less" - _ then "impossible"; -/* Result: "x is less" */ -</code></pre> -<h2>Nested <code>when</code> Expressions</h2> -<p>You can nest <code>when</code> expressions for complex logic:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Nested pattern matching */ -x : 5; -y : 10; -result : when x is - 0 then when y is - 0 then "both zero" - _ then "x is zero" - 1 then when y is - 1 then "both one" - _ then "x is one" - _ then when y is - 0 then "y is zero" - 1 then "y is one" - _ then "neither special"; -/* Result: "neither special" */ -</code></pre> -<h2>Using <code>when</code> with Functions</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Function that uses pattern matching */ -classify_number : x -> when x is - 0 then "zero" - when x % 2 = 0 then "even" - when x % 2 = 1 then "odd" - _ then "unknown"; - -/* Use the function */ -result1 : classify_number 0; /* "zero" */ -result2 : classify_number 4; /* "even" */ -result3 : classify_number 7; /* "odd" */ -</code></pre> -<h2>Common Patterns</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Pattern 1: Value classification */ -classify_age : age -> when age is - when age < 13 then "child" - when age < 20 then "teenager" - when age < 65 then "adult" - _ then "senior"; - -/* Pattern 2: Error handling */ -safe_divide : x y -> when y is - 0 then "error: division by zero" - _ then x / y; - -/* Pattern 3: Status mapping */ -status_code : 404; -status_message : when status_code is - 200 then "OK" - 404 then "Not Found" - 500 then "Internal Server Error" - _ then "Unknown Error"; -</code></pre> -<h2>When to Use <code>when</code> Expressions</h2> -<p><strong>Use <code>when</code> expressions when:</strong></p> -<ul> -<li>You need to match values against multiple patterns</li> -<li>You want to replace complex if/else chains</li> -<li>You're working with enumerated values</li> -<li>You need to handle different cases based on value types</li> -<li>You want to make conditional logic more readable</li> -</ul> -<p><strong>Don't use <code>when</code> expressions when:</strong></p> -<ul> -<li>You only have a simple true/false condition (use logical operators)</li> -<li>You need to perform side effects (use regular expressions)</li> -<li>You're working with complex nested conditions (consider breaking into functions)</li> -</ul> -<h2>Comparison with Traditional Conditionals</h2> -<pre class="prettyprint source lang-plaintext"><code>/* Traditional if/else approach (not available in our language) */ -/* if x = 0 then "zero" else if x = 1 then "one" else "other" */ - -/* Our when expression approach */ -result : when x is - 0 then "zero" - 1 then "one" - _ then "other"; -</code></pre> -<h2>Key Takeaways</h2> -<ol> -<li><strong>Pattern matching</strong> - match values against specific patterns</li> -<li><strong>Wildcard support</strong> - <code>_</code> matches anything</li> -<li><strong>Exhaustive matching</strong> - all cases must be covered</li> -<li><strong>Nested support</strong> - can nest <code>when</code> expressions</li> -<li><strong>Functional style</strong> - expressions return values</li> -</ol> -<h2>Why This Matters</h2> -<p><code>when</code> expressions make conditional logic more functional and readable:</p> -<ul> -<li><strong>Pattern-based thinking</strong> - focus on what values match, not how to test them</li> -<li><strong>Exhaustive coverage</strong> - ensures all cases are handled</li> -<li><strong>Functional style</strong> - expressions return values rather than performing actions</li> -<li><strong>Readable syntax</strong> - clear separation between patterns and results</li> -<li><strong>Composable</strong> - can be used in function composition</li> -</ul> -<p>This feature makes the language feel more like functional programming languages like Haskell or ML! 🚀</p> -</article> - -</section> - -</div> - -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - -<br class="clear"> - -<footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) -</footer> - -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> -</body> -</html> \ No newline at end of file diff --git a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-Combinators_Deep_Dive.html b/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-Combinators_Deep_Dive.html deleted file mode 100644 index b023a78..0000000 --- a/js/scripting-lang/docs/scripting-lang/0.0.1/tutorial-Combinators_Deep_Dive.html +++ /dev/null @@ -1,731 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>JSDoc: Tutorial: Combinators_Deep_Dive</title> - - <script src="scripts/prettify/prettify.js"> </script> - <script src="scripts/prettify/lang-css.js"> </script> - <!--[if lt IE 9]> - <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> - <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> -</head> - -<body> - -<div id="main"> - - <h1 class="page-title">Tutorial: Combinators_Deep_Dive</h1> - - <section> - -<header> - - - <h2>Combinators_Deep_Dive</h2> -</header> - -<article> - <h1>Problem Solving with Functional Programming</h1> -<p>This tutorial takes you deep into the world of combinators and functional programming patterns. We'll explore how to think about problems functionally and solve them using the language's combinator-based architecture.</p> -<h2>Prerequisites</h2> -<p>This tutorial assumes you've completed the Introduction tutorial and are comfortable with:</p> -<ul> -<li>Basic function definitions and application</li> -<li>Pattern matching with <code>when</code> expressions</li> -<li>Working with tables</li> -<li>Function references using <code>@</code></li> -</ul> -<h2>The Combinator Mindset</h2> -<h3>What Are Combinators?</h3> -<p>Combinators are functions that combine other functions to create new behaviors. In our language, <strong>everything is a function call</strong> - even operators like <code>+</code> and <code>*</code> are translated to combinator functions like <code>add</code> and <code>multiply</code>.</p> -<pre class="prettyprint source lang-plaintext"><code>/* Understanding the translation */ -x + y * z - -/* Becomes internally: */ -add(x, multiply(y, z)) -</code></pre> -<p>This approach gives us:</p> -<ul> -<li><strong>Zero ambiguity</strong>: Every expression has exactly one interpretation</li> -<li><strong>Functional foundation</strong>: Everything is a function call</li> -<li><strong>Composability</strong>: Functions can be combined in powerful ways</li> -<li><strong>Extensibility</strong>: New operations are just new functions</li> -</ul> -<h2>Core Combinators: Building Blocks</h2> -<h3>Map: Transform Everything</h3> -<p><code>map</code> applies a function to every element in a collection:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Basic map usage */ -double : x -> x * 2; -numbers : {1, 2, 3, 4, 5}; -doubled : map @double numbers; -/* Result: {2, 4, 6, 8, 10} */ - -/* Map with tables */ -person : {name: "Alice", age: 30, city: "NYC"}; -get_age : x -> x.age; -ages : map @get_age person; -/* Result: {name: 30, age: 30, city: 30} */ - -/* Map with complex transformations */ -format_person : person -> { - name: person.name, - age: person.age + " years old", - city: "📍 " + person.city -}; -formatted : map @format_person {alice: person}; -/* Result: {alice: {name: "Alice", age: "30 years old", city: "📍 NYC"}} */ -</code></pre> -<h3>Filter: Select What You Want</h3> -<p><code>filter</code> keeps only elements that satisfy a predicate:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Basic filtering */ -is_even : x -> x % 2 = 0; -numbers : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; -evens : filter @is_even numbers; -/* Result: {2, 4, 6, 8, 10} */ - -/* Filter with complex predicates */ -is_adult : person -> person.age >= 18; -people : { - alice: {name: "Alice", age: 25}, - bob: {name: "Bob", age: 16}, - charlie: {name: "Charlie", age: 30} -}; -adults : filter @is_adult people; -/* Result: {alice: {name: "Alice", age: 25}, charlie: {name: "Charlie", age: 30}} */ - -/* Chaining filter conditions */ -is_high_value : x -> x > 5; -is_low_value : x -> x < 15; -numbers : {1, 3, 7, 12, 18, 22}; -medium : filter @is_high_value (filter @is_low_value numbers); -/* Result: {7, 12} */ -</code></pre> -<h3>Reduce: Accumulate Results</h3> -<p><code>reduce</code> combines all elements into a single value:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Basic reduction */ -numbers : {1, 2, 3, 4, 5}; -sum : reduce @add 0 numbers; -/* Result: 15 */ - -/* Complex reduction */ -people : { - alice: {name: "Alice", salary: 50000}, - bob: {name: "Bob", salary: 60000}, - charlie: {name: "Charlie", salary: 45000} -}; -get_salary : person -> person.salary; -total_salary : reduce @add 0 (map @get_salary people); -/* Result: 155000 */ - -/* Building complex objects with reduce */ -entries : {name: "Alice", age: 30, city: "NYC"}; -to_list : key value -> {key: key, value: value}; -pairs : reduce @to_list {} entries; -/* This would create a list-like structure from key-value pairs */ -</code></pre> -<h2>Function Composition: The Power of Combination</h2> -<h3>Compose: Right-to-Left Composition</h3> -<p><code>compose</code> combines functions so the output of one becomes the input of another:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Basic composition */ -double : x -> x * 2; -increment : x -> x + 1; -square : x -> x * x; - -/* Mathematical style: g then f */ -double_then_increment : compose @increment @double; -result : double_then_increment 5; -/* Result: 11 (5*2=10, then 10+1=11) */ - -/* Complex composition chain */ -double_then_increment : compose @increment @double; -process_number : compose @double_then_increment @square; -result : process_number 3; -/* Result: 19 (3^2=9, 9*2=18, 18+1=19) */ - -/* Composition with different types */ -add_exclamation : x -> x + "!"; -format_number : compose @add_exclamation @double; -result : format_number 5; -/* Result: "10!" */ -</code></pre> -<h3>Pipe: Left-to-Right Composition</h3> -<p><code>pipe</code> is the opposite of <code>compose</code> - it flows left to right:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Pipeline style: f then g */ -increment_then_double : pipe @increment @double; -result : increment_then_double 5; -/* Result: 12 (5+1=6, then 6*2=12) */ - -/* Data processing pipeline */ -data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; -is_even : x -> x % 2 = 0; -double : x -> x * 2; -sum : x -> reduce @add 0 x; - -/* Pipeline: filter -> map -> reduce */ -filter_evens : filter @is_even; -double_evens : map @double; -sum_all : reduce @add 0; -process_pipeline : pipe @sum_all @double_evens @filter_evens; -result : process_pipeline data; -/* Result: 60 (filter evens: {2,4,6,8,10}, double: {4,8,12,16,20}, sum: 60) */ -</code></pre> -<h3>Via: Natural Composition Syntax</h3> -<p>The <code>via</code> operator provides a more natural composition syntax:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Using via for composition */ -double : x -> x * 2; -increment : x -> x + 1; -square : x -> x * x; - -/* Natural reading: double via increment via square */ -complex_transform : double via increment via square; -result : complex_transform 3; -/* Result: 19 (3^2=9, 9+1=10, 10*2=20) */ - -/* Via with multiple functions */ -format_pipeline : double via increment via square; -result : format_pipeline 2; -/* Result: 10 (2^2=4, 4+1=5, 5*2=10) */ -</code></pre> -<h4>Understanding the <code>via</code> Operator</h4> -<p>The <code>via</code> operator is a <strong>right-associative function composition operator</strong> that translates to <code>compose</code> calls:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Translation examples */ -f via g → compose(f, g) -f via g via h → compose(f, compose(g, h)) -f via g via h via i → compose(f, compose(g, compose(h, i))) -</code></pre> -<h4>Right-Associative Behavior</h4> -<p>The <code>via</code> operator is <strong>right-associative</strong>, meaning it groups from right to left:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Right-associative grouping */ -double via increment via square - -/* Groups as: */ -double via (increment via square) - -/* Which translates to: */ -compose(double, compose(increment, square)) - -/* Execution order: square → increment → double */ -</code></pre> -<p>This matches mathematical function composition notation where <code>(f ∘ g ∘ h)(x) = f(g(h(x)))</code>.</p> -<h4>Precedence Rules</h4> -<p>The <code>via</code> operator has <strong>higher precedence</strong> than function application:</p> -<pre class="prettyprint source lang-plaintext"><code>/* via binds tighter than function application */ -double via increment 5 - -/* This is parsed as: */ -(double via increment) 5 - -/* NOT as: */ -double via (increment 5) -</code></pre> -<h4>Comparison with Other Composition Methods</h4> -<pre class="prettyprint source lang-plaintext"><code>/* Three ways to compose functions */ - -/* 1. via operator (natural syntax) */ -result1 : double via increment via square 3; -/* Result: 20 (3^2=9, 9+1=10, 10*2=20) */ - -/* 2. compose function (mathematical style) */ -double_then_increment : compose @increment @double; -complex_transform : compose @double_then_increment @square; -result2 : complex_transform 3; -/* Result: 19 (3^2=9, 9*2=18, 18+1=19) */ - -/* 3. pipe function (pipeline style) */ -square_then_double : pipe @square @double; -pipeline_transform : pipe @square_then_double @increment; -result3 : pipeline_transform 3; -/* Result: 19 (3^2=9, 9*2=18, 18+1=19) */ -</code></pre> -<h4>When to Use <code>via</code></h4> -<p>Use the <code>via</code> operator when you want:</p> -<ol> -<li><strong>Natural reading</strong>: <code>f via g via h</code> reads as "f then g then h"</li> -<li><strong>Mathematical notation</strong>: Matches <code>(f ∘ g ∘ h)</code> notation</li> -<li><strong>Concise syntax</strong>: Shorter than nested <code>compose</code> calls</li> -<li><strong>Right-to-left flow</strong>: When you think of data flowing right to left</li> -</ol> -<pre class="prettyprint source lang-plaintext"><code>/* Good use cases for via */ - -/* Data transformation pipeline */ -process_data : filter @is_even via map @double via reduce @add 0; -result : process_data {1, 2, 3, 4, 5, 6}; -/* Reads: filter evens, then double each, then sum all */ - -/* String processing pipeline */ -format_text : to_upper via trim via replace_spaces; -result : format_text " hello world "; -/* Reads: replace spaces, then trim, then uppercase */ - -/* Mathematical composition */ -complex_math : square via double via increment; -result : complex_math 3; -/* Reads: increment, then double, then square */ -</code></pre> -<h4>Common Patterns</h4> -<pre class="prettyprint source lang-plaintext"><code>/* Pattern 1: Data processing pipeline */ -data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; -is_even : x -> x % 2 = 0; -double : x -> x * 2; -sum : x -> reduce @add 0 x; - -/* Pipeline: filter → map → reduce */ -process_pipeline : sum via map @double via filter @is_even; -result : process_pipeline data; -/* Result: 60 (filter evens: {2,4,6,8,10}, double: {4,8,12,16,20}, sum: 60) */ - -/* Pattern 2: Validation chain */ -validate_name : user -> user.name != ""; -validate_age : user -> user.age > 0; -validate_email : user -> user.email.contains "@"; - -/* Chain validations */ -all_validations : validate_email via validate_age via validate_name; -result : all_validations {name: "Alice", age: 25, email: "alice@test.com"}; -/* Result: true (all validations pass) */ - -/* Pattern 3: Formatting pipeline */ -to_upper : x -> x.toUpperCase(); -add_prefix : prefix -> x -> prefix + ": " + x; -format_label : add_prefix "Name" via to_upper; -result : format_label "alice"; -/* Result: "Name: ALICE" */ -</code></pre> -<h4>Debugging <code>via</code> Chains</h4> -<pre class="prettyprint source lang-plaintext"><code>/* Add tracing to understand execution order */ -trace : name value -> { - ..out "[" + name + "]: " + value; - value -}; - -/* Trace each step in the pipeline */ -traced_pipeline : trace "final" via trace "double" via trace "filter" via trace "input"; -result : traced_pipeline {1, 2, 3, 4, 5}; -/* Output: [input]: {1,2,3,4,5}, [filter]: {2,4}, [double]: {4,8}, [final]: 12 */ -</code></pre> -<h4>Best Practices</h4> -<ol> -<li><strong>Use <code>via</code> for natural reading</strong>: When you want <code>f via g via h</code> to read as "f then g then h"</li> -<li><strong>Use <code>compose</code> for mathematical style</strong>: When you want explicit mathematical notation</li> -<li><strong>Use <code>pipe</code> for pipeline style</strong>: When you want left-to-right data flow</li> -<li><strong>Keep chains readable</strong>: Break long chains into named intermediate functions</li> -<li><strong>Consider precedence</strong>: Remember that <code>via</code> binds tighter than function application</li> -</ol> -<pre class="prettyprint source lang-plaintext"><code>/* Good: Clear and readable */ -process_data : sum via map @double via filter @is_even; - -/* Better: Named intermediate steps */ -filter_evens : filter @is_even; -double_values : map @double; -sum_all : reduce @add 0; -process_data : sum_all via double_values via filter_evens; -</code></pre> -<h3>Advanced Composition Patterns</h3> -<p>Complex composition chains can also be built using nested <code>compose</code> and <code>pipe</code>:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Mathematical style: g then f then h */ -double_then_increment : compose @increment @double; -complex_transform : compose @double_then_increment @square; -result : complex_transform 3; -/* Result: 19 (3^2=9, 9*2=18, 18+1=19) */ - -/* Pipeline style: f then g then h */ -square_then_double : pipe @square @double; -pipeline_transform : pipe @square_then_double @increment; -result : pipeline_transform 3; -/* Result: 19 (3^2=9, 9*2=18, 18+1=19) */ -</code></pre> -<h2>Each: Multi-Argument Element-Wise Operations</h2> -<p><code>each</code> is designed for combining multiple collections element-wise:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Element-wise addition */ -table1 : {a: 1, b: 2, c: 3}; -table2 : {a: 10, b: 20, c: 30}; -sum : each @add table1 table2; -/* Result: {a: 11, b: 22, c: 33} */ - -/* Adding scalar to each element */ -numbers : {1, 2, 3, 4, 5}; -incremented : each @add numbers 10; -/* Result: {11, 12, 13, 14, 15} */ - -/* Complex element-wise operations */ -people : { - alice: {name: "Alice", age: 25}, - bob: {name: "Bob", age: 30} -}; -bonuses : { - alice: 1000, - bob: 1500 -}; -add_bonus : person bonus -> { - name: person.name, - age: person.age, - salary: person.age * 1000 + bonus -}; -with_bonuses : each @add_bonus people bonuses; -/* Result: {alice: {name: "Alice", age: 25, salary: 26000}, ...} */ -</code></pre> -<h2>Problem-Solving Patterns</h2> -<h3>Pattern 1: Data Transformation Pipeline</h3> -<p>Transform data through multiple stages:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Problem: Process a list of numbers */ -/* 1. Filter out negative numbers */ -/* 2. Double each remaining number */ -/* 3. Sum all results */ - -data : {-3, -1, 0, 2, 4, 6, -2, 8}; - -/* Step-by-step approach */ -is_positive : x -> x > 0; -double : x -> x * 2; -sum : x -> reduce @add 0 x; - -positive : filter @is_positive data; -doubled : map @double positive; -total : sum doubled; - -/* Or as a composition */ -process_data : compose @sum @map @double @filter @is_positive; -total : process_data data; -/* Result: 40 (positive: {2,4,6,8}, doubled: {4,8,12,16}, sum: 40) */ -</code></pre> -<h3>Pattern 2: Table Aggregation</h3> -<p>Extract and aggregate data from complex structures:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Problem: Calculate average salary by department */ -employees : { - alice: {name: "Alice", dept: "Engineering", salary: 80000}, - bob: {name: "Bob", dept: "Sales", salary: 60000}, - charlie: {name: "Charlie", dept: "Engineering", salary: 90000}, - diana: {name: "Diana", dept: "Sales", salary: 65000}, - eve: {name: "Eve", dept: "Engineering", salary: 85000} -}; - -/* Extract department and salary */ -get_dept_salary : emp -> {dept: emp.dept, salary: emp.salary}; -dept_salaries : map @get_dept_salary employees; - -/* Group by department (simplified) */ -engineering : filter @is_engineering dept_salaries; -sales : filter @is_sales dept_salaries; - -is_engineering : entry -> entry.dept = "Engineering"; -is_sales : entry -> entry.sales = "Sales"; - -/* Calculate averages */ -get_salary : entry -> entry.salary; -eng_salaries : map @get_salary engineering; -sales_salaries : map @get_salary sales; -eng_total : reduce @add 0 eng_salaries; -sales_total : reduce @add 0 sales_salaries; -/* Note: Division would require additional arithmetic functions */ -</code></pre> -<h3>Pattern 3: Conditional Transformation</h3> -<p>Apply different transformations based on conditions:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Problem: Format different types of data */ -data : { - user1: {type: "admin", name: "Alice", level: 5}, - user2: {type: "user", name: "Bob", level: 2}, - user3: {type: "guest", name: "Charlie", level: 1} -}; - -/* Define transformation based on type */ -format_user : user -> - when user.type is - "admin" then { - display: "👑 " + user.name, - access: "full", - level: user.level * 10 - } - "user" then { - display: "👤 " + user.name, - access: "limited", - level: user.level * 5 - } - _ then { - display: "👻 " + user.name, - access: "readonly", - level: 1 - }; - -/* Apply transformation to all users */ -formatted : map @format_user data; -</code></pre> -<h3>Pattern 4: Recursive Combinators</h3> -<p>Build recursive patterns using combinators:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Problem: Flatten nested tables */ -nested : { - level1: { - a: {value: 1}, - b: {value: 2} - }, - level2: { - c: {value: 3} - } -}; - -/* Recursive flattening function */ -flatten : table -> - when (t.has table "value") is - true then table - _ then reduce @t.merge {} (map @flatten_entry table); - -flatten_entry : entry -> - when (t.has entry "value") is - true then entry - _ then flatten entry; - -/* Apply flattening */ -flat : flatten nested; -/* Result: {a: {value: 1}, b: {value: 2}, c: {value: 3}} */ -</code></pre> -<h2>Advanced Combinator Patterns</h2> -<h3>Partial Application and Currying</h3> -<p>Create specialized functions from general ones:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Basic partial application */ -add : x y -> x + y; -add_ten : add 10; -result : add_ten 5; -/* Result: 15 */ - -/* Complex partial application */ -format_with_prefix : prefix value -> prefix + ": " + value; -format_name : format_with_prefix "Name"; -format_age : format_with_prefix "Age"; - -person : {name: "Alice", age: 30}; -formatted_name : format_name person.name; -formatted_age : format_age person.age; -/* Results: "Name: Alice", "Age: 30" */ - -/* Currying with combinators */ -multiply_by : x y -> x * y; -double : multiply_by 2; -triple : multiply_by 3; - -numbers : {1, 2, 3, 4, 5}; -doubled : map @double numbers; -tripled : map @triple numbers; -</code></pre> -<h3>Higher-Order Combinators</h3> -<p>Combinators that work with other combinators:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Apply a combinator to multiple collections */ -apply_to_all : combinator collections -> - reduce @t.merge {} (map @combinator collections); - -/* Example usage */ -add_one : x -> x + 1; -collections : {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; -all_incremented : apply_to_all @map @add_one collections; - -/* Compose multiple functions */ -compose_many : functions -> - reduce @compose @identity functions; - -/* Example usage */ -double_then_increment : compose @increment @double; -complex_transform : compose @double_then_increment @square; -result : complex_transform 3; -/* Result: 19 (3^2=9, 9*2=18, 18+1=19) */ -</code></pre> -<h3>Memoization Pattern</h3> -<p>Cache function results for performance:</p> -<pre class="prettyprint source lang-plaintext"><code>/* Simple memoization */ -memoize : f -> { - cache: {}, - compute: x -> - when (t.has cache x) is - true then t.get cache x "not_found" - _ then { - result: f x, - new_cache: t.set cache x (f x) - } -}; - -/* Using memoized function */ -expensive_calc : x -> { - /* Simulate expensive computation */ - x * x * x -}; - -memoized_calc : memoize @expensive_calc; -result1 : memoized_calc.compute 5; -result2 : memoized_calc.compute 5; /* Uses cached result */ -</code></pre> -<h2>Real-World Problem Solving</h2> -<h3>Example 1: E-commerce Order Processing</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Process customer orders */ -orders : { - order1: {customer: "Alice", items: {book: 2, pen: 5}, status: "pending"}, - order2: {customer: "Bob", items: {laptop: 1}, status: "shipped"}, - order3: {customer: "Charlie", items: {book: 1, pen: 3}, status: "pending"} -}; - -prices : {book: 15, pen: 2, laptop: 800}; - -/* Calculate order totals */ -calculate_total : order -> { - customer: order.customer, - total: reduce @add 0 (map @calculate_item_total order.items), - status: order.status -}; - -calculate_item_total : item quantity -> - when item is - "book" then 15 * quantity - "pen" then 2 * quantity - "laptop" then 800 * quantity - _ then 0; - -/* Process all orders */ -processed_orders : map @calculate_total orders; - -/* Filter pending orders */ -is_pending : order -> order.status = "pending"; -pending_orders : filter @is_pending processed_orders; - -/* Get total revenue from pending orders */ -get_total : order -> order.total; -total_revenue : reduce @add 0 (map @get_total pending_orders); -</code></pre> -<h3>Example 2: Data Validation Pipeline</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Validate user input data */ -users : { - user1: {name: "Alice", email: "alice@example.com", age: 25}, - user2: {name: "", email: "invalid-email", age: -5}, - user3: {name: "Charlie", email: "charlie@test.com", age: 30} -}; - -/* Simple validation example */ -is_valid_name : user -> - when user.name = "" is - true then false - _ then true; - -is_valid_age : user -> - when user.age > 0 is - true then true - _ then false; - -/* Apply validation to all users */ -valid_names : map @is_valid_name users; -valid_ages : map @is_valid_age users; -</code></pre> -<h2>Performance Considerations</h2> -<h3>Lazy Evaluation Patterns</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Process large datasets efficiently */ -large_dataset : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - -/* Process in chunks */ -chunk_size : 3; -process_chunk : chunk -> map @double chunk; - -/* Process data in smaller batches */ -batch1 : {1, 2, 3}; -batch2 : {4, 5, 6}; -batch3 : {7, 8, 9, 10}; - -processed_batch1 : process_chunk batch1; -processed_batch2 : process_chunk batch2; -processed_batch3 : process_chunk batch3; -/* Combine results manually since we don't have array operations */ -</code></pre> -<h3>Memory-Efficient Patterns</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Stream processing pattern */ -stream_process : data -> - compose @reduce @add 0 @map @double @filter @is_even data; - -/* This processes each element once through the pipeline */ -/* No intermediate results are stored */ -</code></pre> -<h2>Debugging Combinator Chains</h2> -<h3>Tracing Function Applications</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Add tracing to functions */ -trace : name value -> { - ..out "[" + name + "]: " + value; - value -}; - -/* Use in composition */ -traced_double : compose @trace "double" @double; -traced_increment : compose @trace "increment" @increment; -traced_square : compose @trace "square" @square; - -/* Trace the entire pipeline */ -traced_pipeline : compose @traced_increment @traced_double @traced_square; -result : traced_pipeline 3; -/* Output: [square]: 9, [double]: 18, [increment]: 19 */ -</code></pre> -<h3>Visualizing Data Flow</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Create visualization of data transformations */ -visualize_step : step_name data -> { - ..out "=== " + step_name + " ==="; - ..out "Input: " + data; - result: data -}; - -/* Use in pipeline */ -visualized_pipeline : compose - @visualize_step "Final Result" - @map @double - @visualize_step "After Filter" - @filter @is_even - @visualize_step "Initial Data"; - -result : visualized_pipeline {1, 2, 3, 4, 5, 6}; -</code></pre> -<h2>Best Practices Summary</h2> -<h3>1. Think in Transformations</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Instead of: "Loop through and modify" */ -/* Think: "Transform this into that" */ -</code></pre> -<h3>2. Compose, Don't Nest</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Good: Clear composition */ -pipeline : compose @step3 @step2 @step1; - -/* Avoid: Deep nesting */ -result : step3(step2(step1(data))); -</code></pre> -<h3>3. Use Partial Application</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Create specialized functions */ -specialized : general_function specific_value; -</code></pre> -<h3>4. Leverage Immutability</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Always return new data, never modify existing */ -new_data : transform_function old_data; -</code></pre> -<h3>5. Build Reusable Patterns</h3> -<pre class="prettyprint source lang-plaintext"><code>/* Create patterns you can reuse */ -validation_pipeline : compose @validate3 @validate2 @validate1; -</code></pre> -<h2>Next Steps</h2> -<p>You now have a deep understanding of combinators and functional problem-solving! To continue your journey:</p> -<ol> -<li><strong>Practice</strong>: Try implementing the examples above</li> -<li><strong>Experiment</strong>: Create your own combinator patterns</li> -<li><strong>Optimize</strong>: Look for opportunities to compose functions</li> -<li><strong>Extend</strong>: Build your own specialized combinators</li> -<li><strong>Share</strong>: Document patterns you discover</li> -</ol> -<p>The power of combinators comes from their composability. Start simple, build up complexity through composition, and always think in terms of data transformations rather than step-by-step instructions.</p> -</article> - -</section> - -</div> - -<nav> - <h2><a href="index.html">Home</a></h2><h3>Tutorials</h3><ul><li><a href="tutorial-01_Juxtaposition_Function_Application.html">01_Juxtaposition_Function_Application</a></li><li><a href="tutorial-02_Right_Associative_Via_Operator.html">02_Right_Associative_Via_Operator</a></li><li><a href="tutorial-03_Automatic_Element_Wise_Table_Operations.html">03_Automatic_Element_Wise_Table_Operations</a></li><li><a href="tutorial-04_Partial_Application_by_Default.html">04_Partial_Application_by_Default</a></li><li><a href="tutorial-05_When_Expressions_Pattern_Matching.html">05_When_Expressions_Pattern_Matching</a></li><li><a href="tutorial-06_Immutable_Tables_with_Functional_Operations.html">06_Immutable_Tables_with_Functional_Operations</a></li><li><a href="tutorial-07_Function_References_with_At_Symbol.html">07_Function_References_with_At_Symbol</a></li><li><a href="tutorial-08_Combinator_Based_Architecture.html">08_Combinator_Based_Architecture</a></li><li><a href="tutorial-09_No_Explicit_Return_Statements.html">09_No_Explicit_Return_Statements</a></li><li><a href="tutorial-10_Table_Literals_as_Primary_Data_Structure.html">10_Table_Literals_as_Primary_Data_Structure</a></li><li><a href="tutorial-Combinators_Deep_Dive.html">Combinators_Deep_Dive</a></li><li><a href="tutorial-Introduction.html">Introduction</a></li></ul><h3>Global</h3><ul><li><a href="global.html#TokenType">TokenType</a></li><li><a href="global.html#callStackTracker">callStackTracker</a></li><li><a href="global.html#debugError">debugError</a></li><li><a href="global.html#debugLog">debugLog</a></li><li><a href="global.html#executeFile">executeFile</a></li><li><a href="global.html#initializeStandardLibrary">initializeStandardLibrary</a></li><li><a href="global.html#interpreter">interpreter</a></li><li><a href="global.html#lexer">lexer</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#parser">parser</a></li><li><a href="global.html#readFile">readFile</a></li></ul> -</nav> - -<br class="clear"> - -<footer> - Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.3</a> on Mon Jul 28 2025 00:03:08 GMT-0400 (Eastern Daylight Time) -</footer> - -<script> prettyPrint(); </script> -<script src="scripts/linenumber.js"> </script> -</body> -</html> \ No newline at end of file |