From a0f37e72a21159607ae504add1978e7887f59353 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Sat, 19 Sep 2026 05:21:02 +0700 Subject: [PATCH] The ! suffix retires: a mutator is named for what it does, not marked MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The !-means-mutates convention distinguished nothing — there is no immutable counterpart to contrast with — so every mutating name drops the mark: sort, sort-by, sort-bytes, swap, reverse, append, append-i64, append-f64, encode-rune, split-next, map-remove, map-next, and the test helpers beside them. Two could not simply shed it: map! is map-in-place, because map is the into transform's word and means the non-mutating thing; put! is put-at, because put is the Map builtin. The ?-means-asks convention stays. Dated records keep the old spellings; watch.clj's reset-spies! and the other Clojure names are not ours to rename. --- FIX.org | 2 +- NEXT.md | 20 +++---- docs/BUILT.md | 26 ++++---- emacs/MANUAL.md | 2 +- emacs/flan-cnr.elc | Bin 0 -> 24911 bytes emacs/flan-dape.elc | Bin 0 -> 4197 bytes emacs/flan-inspect.elc | Bin 0 -> 25593 bytes emacs/flan-lower.elc | Bin 0 -> 22710 bytes emacs/flan-mode.elc | Bin 0 -> 12041 bytes emacs/flan-repl.elc | Bin 0 -> 9822 bytes emacs/flan-watch.elc | Bin 0 -> 16302 bytes emacs/flan.elc | Bin 0 -> 83978 bytes lib/check.ml | 51 ++++++++-------- lib/js.ml | 4 +- lib/parse.ml | 2 +- lib/prelude.ml | 96 +++++++++++++++--------------- lib/session.ml | 4 +- plan.org | 4 +- runtime/flan_rt.c | 4 +- spec-memory.md | 2 +- test/programs/algorithms.flan | 26 ++++---- test/programs/arena-edn.flan | 4 +- test/programs/edn-read.flan | 4 +- test/programs/fn-values.flan | 14 ++--- test/programs/format.flan | 8 +-- test/programs/generics.flan | 18 +++--- test/programs/higher-order.flan | 14 ++--- test/programs/json.flan | 8 +-- test/programs/map-iter.flan | 14 ++--- test/programs/map-remove.flan | 20 +++---- test/programs/reload-generic.flan | 14 ++--- test/programs/slices.flan | 18 +++--- test/programs/strings.flan | 12 ++-- test/programs/utf8.flan | 24 ++++---- test/test_acceptance.ml | 10 ++-- test/test_flan.ml | 12 ++-- test/test_session.ml | 28 ++++----- vendor/edn/read.flan | 4 +- vendor/json/json.flan | 10 ++-- web/index.html | 16 ++--- 40 files changed, 246 insertions(+), 249 deletions(-) create mode 100644 emacs/flan-cnr.elc create mode 100644 emacs/flan-dape.elc create mode 100644 emacs/flan-inspect.elc create mode 100644 emacs/flan-lower.elc create mode 100644 emacs/flan-mode.elc create mode 100644 emacs/flan-repl.elc create mode 100644 emacs/flan-watch.elc create mode 100644 emacs/flan.elc diff --git a/FIX.org b/FIX.org index 6fd894d..4bd2388 100644 --- a/FIX.org +++ b/FIX.org @@ -151,7 +151,7 @@ against 985ms on LLVM. ** Open, carried forward - A transient signal -11 on the globals daemon, seen once, not reproduced. Recorded below. -- [drop]'s handoff flags that the [clone] / [get] / [map-next!] refusals are +- [drop]'s handoff flags that the [clone] / [get] / [map-next] refusals are needed by the arena route too — they are about a copy of a header, which an arena does not make safe — and that a Map has no operation answering *where* a value lives, which is what reading an arena-parsed EDN document back would diff --git a/NEXT.md b/NEXT.md index 2066b4b..5e88e35 100644 --- a/NEXT.md +++ b/NEXT.md @@ -550,7 +550,7 @@ constant folding has to accept that a length can stay symbolic until instantiati ### The motivating case, and it is not `$n` on its own -`$n` alone buys little. `swap!` does not need it — it takes a slice and two indices, and the length is a runtime +`$n` alone buys little. `swap` does not need it — it takes a slice and two indices, and the length is a runtime field. Nor does a `pop` from a `Vec`. The case that wants both is **a fixed-capacity array with a count and no allocation**, which is Odin's `Small_Array` and a good fit for a game that refuses to allocate in a frame: @@ -600,7 +600,7 @@ so `a + b` over a `$T` compiles and fails only when someone instantiates at a ty write a second pass to get plan.org's rule. Both options were bad in the way the other was good. Rejecting abstractly gives the error at the definition and -makes every call site carry a comparison: `(sort! xs)` becomes `(sort-by! xs (fn [a b] (< a b)))` everywhere. +makes every call site carry a comparison: `(sort xs)` becomes `(sort-by xs (fn [a b] (< a b)))` everywhere. Checking per instantiation keeps the call short and moves the error into code the caller did not write, which is worse here than in most languages because a hot-reload session may have been running for an hour before the call site is reached. @@ -608,7 +608,7 @@ site is reached. **What dissolves it is the thing plan.org ruled out while citing Odin: Odin has constraints.** `core/slice/slice.odin:289` is `where intrinsics.type_is_ordered(T)`, and there are 41 such predicates. A `where` clause tells the abstract pass what it may assume, so the body checks at the definition *and* the call stays -`(sort! xs)`. +`(sort xs)`. ### What is being built @@ -648,7 +648,7 @@ Measured by the spike against the real sources, and worth knowing before the wor - **5 do not collapse and should not** — `sum-i32`/`sum-f32` widen to `i64`/`f64` with an explicit cast, and "the wider type `t` accumulates into" is a type-level function, which is a constraint system or an associated type. A generic `sum` would have to take its accumulator and its `add`, at which point it *is* `reduce`. - `append-i64!`/`append-f64!` are two different primitives, `I64ToBytes` and `F64ToBytes`, and choosing between + `append-i64`/`append-f64` are two different primitives, `I64ToBytes` and `F64ToBytes`, and choosing between them per instantiation is compile-time overloading, which is what multimethods are for. The prelude keeps a per-type layer for the numeric ones. That is the honest number. @@ -1690,10 +1690,10 @@ allocation-free functions because there was nothing to allocate from; there are name" block at the foot of `prelude.ml` is down from eight entries to four, each with a *different* reason rather than the one shared sentence. -What landed: `append!`/`append-i64!`/`append-f64!` (the builder), `concat`, `join`, `split` returning a +What landed: `append`/`append-i64`/`append-f64` (the builder), `concat`, `join`, `split` returning a `(Vec [u8])`, `repeat-bytes`, `replace-bytes`, `to-lower`, `to-upper`, `slices-new`; `format-f64` with a precision; `atan2-f32` and `pow-f32`; `clamp` as a `defmacro`; and the slice family at two more element types — -`sort-f32!`, `reverse-f32!`, `swap-f32!`, `min-f32`, `max-f32`, `sum-f32`, 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 literal 0 HcmV?d00001 diff --git a/emacs/flan-dape.elc b/emacs/flan-dape.elc new file mode 100644 index 0000000000000000000000000000000000000000..03c0ef35b44d111d339c4631995e282b26c78c66 GIT binary patch literal 4197 zcma)9QE%Hu5)M$@CFRQjeYuANt`qvMwhEIFNlT9Hm!`1|v`CvG?Oh)t0a=kNi3mk9 zyQF3HsXyX=;r){PW|kD?Bn1wzWQx0-o%v?IZ-!SlFJJuq(W6J+)zuZfs5W(8=uCd( zCEaXPYUxfJn^z?z<1h{~huO_gXbnmHLu&mNz(( zZeiR7(94(q{((~9 z4kWQdmhWs@WtxwQE-vWTwRU(_WSgoc#ERcN)<6zknjP>0>bj38^j?*;*a3p2YK!I) zu}VV7YAdN1%xt3!a)W(65C{_~s0+>6r?s+P13zh3wNzFD#i<0w9xQWXJA80&hXhbo zY0G)C8o|=SX!WkH@(#8*p_}^#$RN`|v{tq&A4$C{qGOa`1-$c2QxJ&Dp~n|@2vAlC zwSx>T#V1aQppojLu#E2(7yO?cEONLcm1?ixlJ@-9u%R-}IA>?@&-y*Ai>hg=4OL4i zP0o}?eM&`dxy%?hPr_siasgoA{7&+9ekNrRaxnuSR4v!<9(7!*1xhybeu00BcDd9B z8Dw(s=2HT3*z;1O7y&M0+Sar*a0%7%-{1d3wxS<``_4P&m?x`>zUIW`h4A+4&Nkaa z=5vGUvP}+XkW$2sKfBc?{L(vF>>3T)0dIenjK}yyPiJw&7co8wK4>uY>tUyOZm^v_{i%v-x{al+eT{Q7tsTj{rnwYamEj1R0O z(XcIv*;)cO*jjRiZR2yF-WdJ9Met1pPm>1n@s?YdU>4q7wr_2K`)=2>;p0J7IAv zauoFO5OrXy)}-2*e}Xbd{_+TAE2aEo=DQnwfBHARfA%@Pq_&T~+252J2MMHv97zMF zXHcpQG|owCz^qD}3exMG3M}ZH-v>4MLVsU)Cp+Y6XcE#oleO9G*yrwP0&NU9>i<~L zfo6!rL5fBHkfyUf+ZWT(e1r}ZPq-~ezhZ|_u}(f&w|;*0uh%bbXay+_y&qYdw8$yz ziUTJkdj8-k$WriXEd7+Oe|`S?79CLf6(kO85IB#YMzcWdDWu)0J$Ga29=zD~eyACv zbjmsf#oB;z{5(~dIkqNmw8xsZQP3N-owuAg=lU^5jgw{Bxj%w3eKNhS$s)b+!=8?CDP~!A$%{Z)!AQvvY|Xa;5KU2=_rcJJv2%AniWM!9rO*r%8u^h@^7Q+w1V=0Qyfk3zOB#*lv%YK9(z>H0}%NVmrs7zjQOepP`zdbL6;CL z%;}=XE4jFEg_@iTU~gGp5n8#-SN6D@SQw;-8hd&$(xKe&5YJUz9HIBKt`&wyOdi}1 zx#)~u2Ou7_5@@<~v-o^`HiD)_6rC~qsZNG18N2qA88Vl?qpYoq9K{Yz`~ziirG#?p8xv1HF?WH< zU!_wp`Ivi8Flmg>KYu#&zXk7jPCA>F{3DK{FFqn+U&I3nT{(0)6-J;{V!CjnNYA`3 z|ET_Y7g$bGiMEEB`90@O}uC@P<6> z6E2zP#3|4STDZ&8;Lv%K2~S#l3vEgkn|3@;^4aJmt=(Q9pkeCwS>k6 z@;)mL?n8tT89+Yv7<1D6KwtKO$W9iPeGLmv--~mArf(5wtavjD-szpQ!jA;#2jqYD XxYu@u8{yA6BX|5Zws&Jr$;kU3=%+tG literal 0 HcmV?d00001 diff --git a/emacs/flan-inspect.elc b/emacs/flan-inspect.elc new file mode 100644 index 0000000000000000000000000000000000000000..8633503abd1e5ac77075fa54afcc2d75c21a4c56 GIT binary patch literal 25593 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 literal 0 HcmV?d00001 diff --git a/emacs/flan-mode.elc b/emacs/flan-mode.elc new file mode 100644 index 0000000000000000000000000000000000000000..ac15f869dca78de940c0f9ff39f182d0ac8e3223 GIT binary patch literal 12041 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 literal 0 HcmV?d00001 diff --git a/emacs/flan-watch.elc b/emacs/flan-watch.elc new file mode 100644 index 0000000000000000000000000000000000000000..3143e5a8424d775c0eae86fee3b56ed90d03667b GIT binary patch literal 16302 zcmd5@`*R!Dbr$t-BzWwx(=?Mz-S`rWO+wLf_JIdQjbl_mVW#mYEt7%4-)#HCjlIzDPix0KPx@IpC`>OY&yplH zc_K|Y=HV$i;{P1(u6=&jBxW`pAUlG(qEjR$v9vI!%hg#OZ)*KOLnfCK(sW_J_5t-g%jL{cMn! zdN=ZY{0r8*VZaOi3*AkGnYP)D z^y;gVzK-*e@K&Xfn`4&t$)ZF2l0D7FOW#sf_f)^T=ybP!WCF9b@q4pvg2-LV~{_L9rzxk0U8c@>@15g`3FX5RUP=IgJaEi=N6+JRoyjGSf6k2iy{e z*PY)F?>8`Qt0^KhjxmEut`*yR21CbYJi?1?Xttj2e{}$YeYgMQ+k?gxv*g(smNTCs z@S8iFquJasFGOanJYgq8kuRMQ9EG#a^CT^?rL&k?W7iz(*>2u5$0w%{DO`Y)dJrVh z6O=TPBu#YPc#F$8pKzNK$X$GbTZo>tAfd4%+)grdEKk9Od~p_^n=-47v+R|LOVJTr z*g08rFzZvpe36ZXbkqlshN7R3pa{WZBJ5B@_|*ZSMsZVH;(pN*7Fq#wfDza0U7%5|NJi*Ez3tIqZFJ61vNTJ%_N4>;96{_yS?PD+*jA; zbkrHn5dBZNGpMvtiN&dM%~FsWYPgt@1xc8*Jj3i9d6G?V6le|d2zy;|+^+l5nFmeb ztNXt2l|4hu$xTxgJp1~^b5Ql`?+%_le)9DT995harofaYrJ5dQGtrk+t0hi)YnV!( zd5;FHNZ=d$rlI^Ek4ISQW<_E>Of~`GH(s`arm3$%xi#Oq2KDJv&8Zsop$&aevA4Q) z{8!PlH@fwkP?i1$|J*>A=y&KG1h@)6CbrVmi zYbNm<{G0Zn#5P`rtqv4y7zBHtTRI$>&?(hUGlW)U+YEZS#MLWUJMcAasp|_vwzdb7 z%Nc;oV(0uDd!PT4oI@9X+ui#0eMjf-d{T0n}9U zsU=2eBB<%s^7`uB8vc;w=T6ITHXiRT*b#QT%8#l-&|#EY7Xumxj0?|1PqUkTS;B`H z!@FrWL0U`zYtwNPx1kV^sCDm~XVBl=183JWpUVoU1_uQCLR_!IgTEYFIpF2h3@?hi zLf-H;y$Et_Yn_ZQjJ}@p*^lZG_$|YW>-`3Q@-_Fk{aZBetgYYehV77&Lq4y_mQ_8Y z^mNo4m0q6215XsnNm6?D<>J!oqd^Hz$5f24SLFS>b(7?Ak+?3U7&Q>ZK7fOygjgJ1 z*le~f1=}FuN%Ce2?tx?N&|=i zit|Y?8=DwDAoU`=UMS8fPC12Ar7Jui1|3DYHIyN^nU_aO#_MUH3V z5(<|dwmFsqr)8VV-Qs50Zf@SI**6$=Q?xT@EzdHqNKQmK$Nm0nG8@MwR4P~D2KC@_ zP>!XS8->p}tQZv-0?T&CcR$&rZ#_3)u{r+q6RboXTzGubDX9Z%l_s^*^C`OGAO~i? z2x#getB448k30H%m@>&nRy%PBC^--V(gDo}pE)T@9$7Ex$FoAE;4xi8p(vVgzfN(+ zv+^{{H;WpT;PG7ZZJORly&Bp|;Xn3zAKU>gKD1R$U@iY(3m7yn6`L+}P0VUU>A*?Ot)QokpuV zjN(6dWNgTs@ID>hzwY=7hjqJKpYD1uU+%_Z9L(;~(I2|q##MfB*lFK)p0G}HWZH0G zR~9HrwrX*8b^3T~t2DdN58wf+#(0pOH5z79UC$`O1ki%PPWyjJYs;Dt;m_coj^Oko z-h!#*k+?`h7E1 z>gX^)Rl-$HJhu)+6GtYp_Ols;2-mRcwy%Mt?!Bl)4`PPlO{ob#g96CT7#cwGEfDZ? zTXAD9LP!a@H7>`-q77~byNMdtctszkxwh^^`nvd$oln?cLmJ%tBd(kF`XNo~P5fzJ z-^b$+E-8tmCRTz!S+d8t%M0LHAf6c+*f4!;jjR69^@+#ueSmeq3jRx$d*oTw7`$3| z9!(sGP_EN9F9fC$wNWTwqF{#&!E9gwF1sxLJ9zq;_w{4%$(K*(QQ(zKp`$xG2Dix- ze;Bp(VTZ zx`ebqJqqx6|CE6RWEXbC`09IjYW%%4^PGnYgAyQiP7@D-w>Ql|3Wkh3uuW+hzwxHi zqBt`59bdNt^=iWV8jd57CJ!@K5_?L$Mrx{gWGF7dF!%*3@G&-n&?D}@qJD~DHU&!& zw`lI#z#=ocvI>&G0|Lzv?fWhjo4Tw~P$MuU;kkCWNBa&G0HGn=Ax6v^DE5_;u zrUz`TPh2i_VW2<|q{-DjupTeTXX8FFkAIyq8T##QvQ_|pR>jv-@x4wq+TyElZI5Cc zeUB%RJZY}&z4exK=DqZ5hlmCPUxfEgRe0l~$oj%6mK~IoQDEUD@CMJtn*t89=ic(8 zK%_G8L-7;EZM5uU9VwCSUBz8+8pL_vO+Eke@Zh=H1DLPphx<TOc-+?5pcS$6PB1jY{F~9Y9eAIe|KWzz;|B?3;yHLVq zfhj4m&dG7|fe5Z{%qM@u-+&th^YDRi7z6)%<|DY4)J~8~JYSgWx()pnK%t&_#m-(3 zcX0)v-U_&;{=Jt}l?Ee8^A&}gaYSP7Rf>VHe2-v}3w@KdH zbBgnsgmU~9R@_^ScFuwMdEIpP+ctzda*0S$bi)ffK-UgUzUY$xXqTzsSEO<)E%XQ!TG2)p1}=)fOmhytewT=2#q7M5TClJTjl zE{-jd2q{eAa6%k*MS(7X6m>;aoS$TWJxr;==Uj^{b|iuVw7Tuo&;6hy{EwW>H%!); zX9wRr`5utC(8tB5kkMC~*(c)~mu1IA>@NVm6FtzJI@;dAi zV(XMBy0F!wAhID0InlfZPLc z%oj7fgd=b)`(yZzsOS{1JKzTT0vJ07%pN0M=Mo<3RuEiLI6x+>NzMd*gyuisqcRzy zK#>&g)v)!`89x4T$i9ZmqgQnabpWDvbEwz4leH73@m&ei&I=3nJB#=Oo*>UyBZ2j z_}(3=N6G=Mtsfx@ao5e@13r?x;q~=(1-(VXLStTz>Ul0nBu7N>Eyc0ZZDm{n%iTv- z1%b)y#G9HeVW!3sFIth;?%Xg?3INAPrfC&U2VT7>oTk4sXDhmfV&3&c7YqafA?u6R zLVopR0U8RO3oqa()#TnZ31T}b6HOf6}%Ihs{D6`YQ0wp{{u=V|{GsgDeT zEHM#J+aRq6rjzs>9Siu^k{}1)efy=2l*vPK@H}H_35Mck=p}O`XikA2C&-<0Wmx-j zV*KEW5`Z|<$2KF)*xoUe6&bQ^tw8Xgyq_|CA{)Ya+=CMxzoxXoYnmW6CQ~}GfrCCA zOU}opkigagCZ%QVqV&OAN2G~KGV>})rdP9|h>VNn+PA5FqxZ;Sojc^ZCacBc8~>VzSL)cyvM2lE{!S1yYBQmrNBxrl$OMV z4ivMHD)oP50IovwwpFQyLxZ%9N@b<7XT^L;10Xhrn%&yPICas}^~Tbj*+uaLOlH}j z13uRWJ7ENUa9PHh@P*h1t_v+LDVTVQgKTz(I7xw4$$JEztly~lq?T~tZ(N&s8HM#W zH5s^k%8QvD1nUhlfbEDwrSyefovDApj4`Nck$$`c)Cq|^u2702Z6XQuG~?l+DrQ2n zRWK0%Ehmb=O+iz^W9u>7gf7SNV4&vF0R7Go9*w9{&IR(O&4V)8I@CfIQ|7>bXm8L0 zkvtaWhAp-mbse)>tsy9p2Zx1u3BXI#@sc>J@`U0?&8rWG{kJs9hV%%sIIog(JR_(W zHbe6j@hHJiWocB5msE#9fqw}a4gkl~(2!Sw({T@K*d_5oB?nmRxR|0&2Y{E*)l5Xk zoyM<|8qR@+0yLC{xK*twv{*e6=XF5ma#0`vJayy(VEu41BaoT}API;wlM@vJA$Zfm zCoH)8uPbLvQvUmeq8wSE<;3=+mc84M|5~FYdnz$BJaU>2Ds9~mcKDNBo;=4uVd&^W z0<0t_$pX+(y*znsL$XVbYc3&|$o3Rj>V7soH}yXWM+^V1a?$4Ym4amRyJMV7ZUtT&!H$BDgtrTRWm?QdsgtOBDdT~ z8z3{Q8sZ|lA)+{U7%cmcx%|#=$Yt;Wl-1tHUHD5r!oP@&8v%{bGBq*-4&1(Sr`~#7 zxOS7R+Hd1eXU_fLrXgN}Q!q@6egkW_ojvSucCIM0bNTQ5`U7kWk`T?S_&UG-Z3Fj^+bH5<$)rea#OF$4 z)o>NeUbt2u+RM0g_1O}Ot-f61ePJn=C$RN%$jDVR>8jGN7U3bRr8EJOMY@T0Pj&p9 zJHRN*PizjsW+rGN`ln!TVdi-+Mvy>;y`^1{=`Lwo6^81@JPE*+3E@0f#9bf|#Iuz( zaO|bYU@=*kf;NZ{C3RapmQ{j^8BrQmCt6e`+y|GS*bk{H7{4ZpJN9$UMXC@}Y#)97 z^!c}69Xyk8l!t;^GATsE1t>&6&BhQefeA~4VI-zz7-^$*ErVS|s5D^;%fQV?A#MT3 z;E=Y~79BCzU`-lJAP~GF)VAR{OfA6n5~V75I7xaLf>|_XB^>8u?7+xbQ{8E1-^=tY zw$KsPgz7Fe$M51}3?=a}x60)!S|9-y0u&}Gv}Sica&3_GW+y0hLsWxRAX?`1$Uk}7-`Xz=S5j_PC5env&YlCel+kKr`U zAA#sBICH0UHN0i3?LfjsJri^a^aA7aro`uJ=BXJ7eG%27B2(C_DMe&dZ#3-y&#C8N z@cg!fOD;5_o`DLJaH|RTfY%S-Lt`oP#VJAi9)(TagEbA~~(%Dy%_aF76cnXgpDx#=YHM|4~^T&a;?jO+EoVjdY;ERKftUK2J2gTXhf>1?B=b zfe1_{IH8&ZityzYh0IcnjiF#{Y{*9!lpel?YfaYQ> zV>mO18eNoDX-B?;+~n zrRG$ajF_~mdnzQqFCR#-uh@F*^SowL>tMV1Bv0H5W>S4*?2%=|p@51wRT2!7;2f>s zf>4JRX^73qIO`!^uCNO1@lf$j`P2tcEI{MeKw}Y-XD266!5FM|d?^EO3LDd;>-PY* zbRo`91aF~3qO}vRlY2GgbXgxcS}CcD7VUmYa#(v5LnbExOVFNjCe+}D*a7=ktW?PM z1d>=?r4_27*?;yq=RVdAY+`{2V#s7GBJY^jHiA&27-KRjQ5h*!8R!WAMoK-GWu<-xA3vcmh-k(! zzX)OdsVx=iesZyFkDF?2%26w|pr*y|#XJ-ra2h|oQ2urltuBIWZ9g)=*wNrJn``AyOBpiG)w#zDmNSCsH7h1B)F2VG$;Ry3voN7Ekcql-B?1=S96N z1Aw1mD*vkBxw2}y0d1+rKw*HwIRV^7zbSse`!xH6HG_4!0pa?!8{M$U3XI6$5?1kr zUgJ{gGFS=@YAUuOG_|-6!6I=+QK-f2s~wfS1xKReDQ@PsY#0S!@J9h9`lzH~_&uKa zo%ivgy|#w}H_U%f&)K!rsGT;35TLtm?U@FYfXx*r)r0=aWf01#>Z%8LtnL>943 z1h4o_gde`m>+lgSRg1{CXRbgC)(7FK)N0u(cB?n_yzrgN6*-Fv>4a`jC%^-OW^*}y zaA5;95f!P6gb|QS9)_Vh;|RW!FqKLfF-D=0g=k?H<1*T>crBjCBj2Q2W^ettO-H30 zp%=yzABL#mJ(m2?WRT6u=wriHx(M|J|#UVSKlwL{1jidr>-YUM7!Xs9uE%{vPZom0U`~m1H znw(EW@meebccB2ZE#@;|DKtTW%hpmI0;XDJg3IxU#VJ+UqKZm8QvyM9W#LdR(r)RCm=>2O-P6G?UIdK&q=s6h+BgmL;`F+f{9<3ke`e z!UT{s5)egq&06yi^9Xkhj>YXxr}ORyo1^Np>EW!JKdnxl&#J|I_r>g_+J1U4J*xI*Utg;Z z_7^9!qeV48x>X&_=Pzb^)zkTLb^5Y;dOSb$Lp!HWpU#eN|J!#z7*zbz-|APtdOoAM zcJ|pB^9WA3fvpKJR?` zv^t!=m@TSlwK%1n#p3DdLA#;-qdoe^1E>3o=hK~oS@ddtH0zu^pPp2|J>8$39K5df z_V=ozIgK7YyH&k}kpvv7KFa*g?#p3I;y zuTDpE0j-?O={oDp7+FiEdS1=B=V1D>`hWh<|I1yi=aClXbU)^DcYb=XS3R3oGw5@6 z+=+hc8PP8w zV<0=TYVUaZ>gcX}`sIT!KE1`8VyLD?)5p$q_eIAWk_L`v&$L%}W)Q$0By_7{XPNR( z*amDFHh}1Ib5Q-1ejiScpx0P5emr7)?z}$G2y_Vjv7jCU@6o{M+mZH%I(4YF#+%iL z-mmWF@#&Gb8zl7XczOt(i?|`Zmr$R`P$S;sWvns}4=26$(|gm|p*KhCp=Wb#?!Nc9?j{3Q{gN zM(ca(fhZ)~(yy^Uj^>?YaIB^%Kj?~1<~HGzY3~S@0pHTxX|KX3pofPsBPP2TQ>Qg1 z9zA5BJh(Vut#;X8P{gb0$?o&n-V)E@-FgZ8jhkV}Gp3s%>ZzCW{UgRUJux@xZB>tE zyK{}0m3%d2{9?Ug8S!w1+YHc^|Qh z&E$du9iK3Qd@GMWn;p&I2aAs0yv%kydHc_vN3W*U)BWQ`GwDp*v^tm`KdYCKj>FJ) z=TO0X=Qp!maZDzsH8(N$Gp@6fO(_TL5T*#W!(2hE3uF*O6O&lXJ4^^&WLUEk)A;d} z7PN!t=#=HxRyjIh7CtF6QhDKy%*5bo(Dp(r8^SMV@dPQCE97Z1mF(>!X>)!(`MIas zeE4t*yPAot4#Z$y!!W*{CD#xQXu|YL9#z+;&!#ZxSLT9+6|+s|JQ(bX8E42|w!K+* zhLGL$FdMnl@s01ZpbYjXe=ck)d#mZ;#d>*+d;0W*NrH;JqkD)QxGmdU6XrG~>UsCk z{=w~k+qu5;`efGKog?fvo(y|E{_9_TGU)4r{u{Kv4BKBu?Jwi@mr47}X6sA8mtXq* zC&T`L|AzcG;=gfzpYV6{$KQ(%4CugsI|tl3;LgG5qmTHPdk5S%*nF?KZKzxGwqakl z4fT!NhQs!4ysN%#?Az4RncFs-+eSUzHc~gZZ8T`LHd3GRr6c!kw61R>y`tQJn(I5pWDVGUfSE-sD7=Ty$`!xobDWVzhUKnTfOvddU-0`uzS!w*x#wX zIi5WQNbJpbD*?Ukp;mYI6d`!n-J9*QYiHeO?0PVsa3F+GZ9JYHyfDoJ9YmHE8z1ZE zmj^4HVj{eWtEcQE9xW!Tfxqg}CO{S`*7-u-nisV;`M zaobG-OmFMCjjyVHb^YBRRky4DWO(DN{Jb@}QQbXx{gP=oIaZ(jPz%YNY4>D(L;cO( z4L0N)oNyG4>>nXrX9B4+)bIa z+Rnz!)=f9hnWBF0&N%xNT<=?2W5&;Isz2V$rpy?-Dbmi&&aijR2*-oLjRb06Ra-YY z*Y{>mA(9v@tfz1#6Jjj)pg$blxB;4(RA0dKC8Q-hQo3(@23k*Elbpzg63nc;C7%?j z#~X&j(H*^^zqz%fA<@bnA_?Nu3zPQMyddOD8gIB~wf{8Li`*}_JC6X&mfDg)NVLEJ zG?cQ(5~(E-1FjmKS{@>>r7U!&3n^luB=Bx7gKxQDSR<~zG=-&WtR^`rrJh zt6vOj+k=ui@pS(P%}Pxhp)NFH>0w58Ad+MWFbu}HetZbNMQRh>?1|SyEech5;RIn3 znu|I3dDXU`oe$2z}$Ju^&KuWrbc&kF}t!1)9KnM1ETn3+OTHrS zf=;5J$po%3O;UPa&5vIMwq;gA_2fbRKbH#N@x|-81YUdzq};ca0lIxb15nnPVdnBQ zYdHeKXrQA(e;v1a^OEx7Fu{n3+iRNSm;%&0DpW1CceCM|HyKW|Q)HBY*aD|ZpXBb& z;rwuhrn53b(~}e7b1NSU?l9-E{edkCv=Aq37$B1`=7b*KUIOIi{20JHh1tdPY)({u z(Uq)8aIEMX(_iat$?n*^G50$&jeT|cThqqF2UFMre2U%tv)SyW9*`QZrSvKu%uW_L zV<04K8E6z3#Ms%X{iHeT6?*Q<-b?{`Mna6nBh&9-IBfAy(YOo@p*raG$tA_=q_~>r z-!7{sMFBX0Dp*)b*vqt$v<12$?5~ww2OD8QP#TX}R8*kC7`;<8B`@cU%QwIkWne)q zlQqcZs$8PFds+tdz*JC#5iFu~U;L!i|1(pwbGmrl+R@`)Kcz~q`uOuNe;yn$L|sBL z{RuHC*~n04-<*huUe1nB_GcI+@73Ra2SdxJUIOE!7cZ)Juiw6X`$n~ReRMMYrc6ph z3K%dn9#LV~4W%CL$o{r?eYi6RS~5NJSG2r?hOg$47usLB`7xmE1B_9W57-e>=8@_P z6h9G^@8<(FR!k`B{q*>F|7*5M8HM_NU0sq5hz=o~=sin-O{F6uzg5)u8#Z6))>m4j zgXwD^o@a<*v~<~%W3ah;5K}3PtP#%9Y_C5(@>Jgls+}I}GfCG1|9IT*{(6APX9G>B z|2|5>@cS2}xLrig>TT-cU0wVOUF=`{;Hv&yx_9-%_|+-}szj_p_h>Gv%$2H|cYIZi z5;TnmcLq1Ug4K;>x`4P$1#I~*zWn^YmQNe*DTXGd2;5TZ(!4%w`JhKN%?=r#(&N@_c&mR1E~jhJQ3n#3H_Cr8@_x zNw+$Smk01jy|n-?8>WI!h?@t)@Uy0_y=r?sAL@j?0+}l|Lsx$BFsTv*`l4(|*xu}$ z>8>`A?m1+Gu^s*S{=xh=r^mC-{CNMF1+_tutTl%gLdLWV_t9*Y!*f@=s1>^}uC=IT z9iiwg!A;RVg6`8~aS2ix^u~h=$IwUr;?>{EG%(u<13?evJIIK?<9BsqUpvCIgu$VA z_3Ac%`g@RDzkliKf4uY$y5}d{(;r;CEJ~Y9xH7oGKT^YEMbWjto^@Y}F_@52VFN2K zFg))*@3I)LrpJ2_^^@%f4elZ8?;VsBw|RQYq=0euf-lP0Iy1`gYxiCj`qftN^QM*%qwkfFYqHEXH)9~Va&9tJLRPYZ#;!I0nMqCh%p>ac)<#tL19Rm z>Fa~Jr5~ezB|Ip|sMqmCM<#2SepqV_Z7MiH1EqEk_K^|n-`~u4^ajSpjPV+Edw#S# zyX&UZu`rFs*1?#7RSuce->Maj6}~+pM+PY|x{pZnpOfhAl_JK`I;!7d#eP$L-F2VDTwJ zPFj}m2I6#gzL0dMEw@~jPk;i2454}S8dWVi=o#_N9SD0i#hZ2n<eW5zZTJcwvHt%Z3ei)k`TFk_0p3kk|8w%c>67OGfY6c-!kRN#_ZBRC7am1c=dy_ z!(|m^Tb2#Dx)U*@ofSH3B~kK<^TceCMq1ylOb5C7v6Pg3y*ccs=$TZH_Mb`n@kCjs zN{JU$PmdO_(1oDibdiM@G`En{0%IN+RqQ&Z_oErc!WlqB#`oA6up>3W`h?TYrh4|$ zw_DIVvY;0)m1zQcxn&AzxiV`L`jY89?EP%MBry|r?t@}Ehw^L;4>9^?vw7TkyYuC@ zn$2;MSO_;Z^PoCS?K)}$BE?Q>#Lv)JYxw69C|H+!<99?`--nJS|C_F1|33PWs49N9 zVLg8SOUW0E?FGn~ySw??#uf}eRTFMvTV_#50KJZF4Z z>;sX&;J9@*Fu?2_&%WM=;<_>xgjIM$TqOFk(e8V58E&h7$kYRkEiYXP~U_*l%vl#aBORy>-kI|1sPlM{>ulO?bm(5F%P)`)ZzW|gcM;Fd% zK+lg&aF>b?2BsMPmw-QG!=JI>k6-Z1c-!UX%jR3lZ+lZ)qD642VWK3b1_TX`d8Iv za_p_~W~fP6U+>w&UOj&B_m6`cLWbwMxpB97~5To<44CD7M zFz5YGAejCyF4AxAV#~vuIt!reE;FcE40~|wQ<>`$h)9&kRw@HAjxl+B z%+|K=cXzA%-JNUp&chQP$vm(7+MPi<28M%N6;mMu73?#O-)@U{==$_2P!K)-OPO`d zd{Y;@B`{n|-@8TAo9-;;$2-@=(=hnQOxRo&FuZfPzqc2_SR6%jQDA(r?mEB=I3`e;U|Wr*lXfS~ zkvgQwl8>ARK@!jKXbBT=C7s}y4ig@OM*yLUW{YSwSiG@ngG?d*$25!455CM?mI0nX zYD?CW{6Qd=_d{$8846Dofg(`^digNSpi+W;DUAE-v>y_L+L?ue9Goiv6f;-P5K4fw zn{CsFLSbN|QHznSu26 z^0jELEAHfFr?2O!i`r`1{Z_YcZvXY}!#kq^4$|=VUME^jfnL`k6O@d*C(~!uhIi@y z$p%4y<{~%N{_I_eWts&!o^1pRS-JCb`2@6JHCymtZ{T>Igx7M({HB@e24}F3_8qa= z&o6vG{yaJQyZite{1Y1|K9@k6eOI-FVSaqz-C5v|K6#Y^4 zef}N)jT-%Fh*&r3&nPa1dwladoed+?rnQm36bV!8Tz3 z+H$yJ{+aEb%4XSpv9s4DH1!w`PgH4{IVTF7LAD!HF(QM&A|8@Yxb{1^qN z+YJ*zcY!jE>=#d;?RE2R#f)}^1~D|%ZfK$>dI~SG#QJ5AeZ~H9QwH~ITl%URd=(?F z3EeU!4zC+NSy3rnZ?ZaWi0*&Q961a!NrT(d!rxeigdXQathEi z)a78SZb$p>5*yZyv6ZFbjVF3kt%JICVWJB}KheaWUA*{YK*SO+_z&w}pv!*2ICz3s zxcGu1mAtDlYx29^ODi>M>!#;9HgG{G@ogDDVnSY=bRqTXZV*{@H=ngtd6#V~i-+T5 zPG9b6{nNxB!Xd&ui>xbg1;nu%RQ;T2CHuAn(-as-G*RizUATG1Tx>Y3FTSKQc(<%> zYJn1x3DiVgNCa8hL^ifpZRj=KqB!(yXU*Z({JKHv{r&)#mW-x%CX))32DPH@ieg`T zj~c~UwREo$IuZ~KN|7a%A@OR38U|!x4o>F8K?Z8kHk1a8UxiO$q+=I_`=Err#D+F{ zfz@4!AD; z$x$gDSTg|yuf9b=E=-YoG(UR3s2hRJJ2hCX?Xwsy6zpzax>QVhvfOD0xJarr)}ZuS zJ_B?6{YSG`qDYpFJz(`z&^c|re5ifwEFBx}1q+*CJB>rLgQqsn@8LkS?xnbLQ5SoU zHE4S~5jl2tN}&@W92}%V;`J`3FR~HRu}&8uB#MViO5cVD5y z7@FMYCSrqKKXLfY|uSx z31OCS!~O_Uvm-#H8ijVE)CL8B(uB7G8(pFEfk8~~sSt}q3mS1m97L|U=TB;X+8lL8 z0y_g)!jB>{??z29PzYs7#uNR7O}iD%-0F$KA?lc+Z&!vCRU1>zUj^SFBz`f7A@nEcKFd`tGc&{$oACZ zi}|9^u>ytan8mbBh|yH&>V)~DQ0Deo(sLYf5*m(Gl^X&mgYQGdxWrL+z%(N5QQy$W z^js)>^P)jZ(sl%WL*F)4V!t%S_lIX~O+oWPvn`5d9Coy(HgQrFwLv0ZTm0O;VZy(D z7v8k7H(Tr;V|m%gpw`sd&uj~kY!ms=A8u{k@zxj(st?IpAhKVg)hsT(SY?_``~0wO zG9mWk6TC{1#ZzK?2R4vef&6Eh-60<}TZ(%SI&34l6?(Le7BrE296g|ZfhI=Kz+AON z+^U7v$VLNVMZM|S^E_M+Y<>S*t=DSr@E!HK|4vzVfGmi)-RtZCfr-1bgZ$zN9;DjT zAB`rVH%-RX$I6!yO9?_o?@9hIk)46+?F_};)8k`6TB>d9`VAf>$RmVEnRU%_Z*m0^ zJ~I2Y-PDMG^yJ7W+uR{F)y83go;xL9uDeH2&+f^b&^OO~v>rYUoC)xQCIb zPXBQhNF$L(S}%-5M_Rmby?Bm_xO%K5bQFcQaBaZn%RutUstER_I(cIv-$1R5T!Af= zl!t+GF2+B8^7IE6A!I*j`uO3WbA6I65A^8xs#c`YU0Pc|X*(9MA@tgEQS_V@77-B# zCD`t)&AQsCBAng<@Jr@=AWm)IK4iJ~WoNS-v-#l&sYq~X-Sk~&IN0@uYLhOEyHBTw z`}TgJY@_fXLu9@};W0KM+f9L!caP>^8bweh6Ix~xAgndY7sj&U#_Er@GV%jB^O#-Z zb#5jP_|q zy#34@gD`P}Nwp`b=<;O(%lbVGrH=9$YEwK_U+I~WjiS+_TE~#|lhkj$kKClUuEMBM zy}uj%t`KQ@Z9j8Lqcy_W-rY(Xvk2YrM=JwINC{)WQ+_X2Ic%D8sfLzFRFV+FdeVW; zmR!WOqT3Ec#^L(D)LP!V?QXC`%KM$AgWDkV__a>mBAH{WnjqsNU6MHs9=fQ-w|^n0 z2$kk}{IXGZ!vJ&GA<=o&#;@=1e$}Lp&;s%PdmCYE>Sh}ym@2(}4zOyEAICBZ z4%Q`t_mz}fL`}Eb08%GdrkzdNlrr)TxmlN_9DJvFYRx%fFybw8lg5DVYEVtcVShXt zq+lKmDF;Es`pDA6)gb@4W3r{Pc}?5NS=U-A|I9}) zu#_l2R$+m;;!e($EoC5*E|UmH6-RJ1sv+S!jfNv*wVaFWIqmG;@Zkj{aQqeQ;d7Y6 zxDIRh6MmY2Esxk~iq6xn<3Hsh_J;S&Ao!|%I(h4@cXf62iFU89Y-aG@Wv&j?oURUf zmoK-hWuzF|d@eRZ!vh+IDHOS+`?b+=UGqsEa8eC7@T(3s-{y0l&p&!1Q+_SB+BhI+ zK3Q%1OTi+!DHK&69~-t^LCnY9nmH%};;FSSLMR|&D%fuJLGGN?AazR zieTrYH?YPW+k3fTo6K#3uvz2%nj02w*Y2gfHW0bf8A>NGS&#q#Pc%Mm@t>lYuU7`X zjS1!I6c$une-C{+O<5>ce9PRR8ynPVs12%5v4-ExUl82Af_W#SKB;l59y~~|Hwi=y z!49t8Z&MfGu|cx3x;1FBnd;RofF{amvoe_Y=vdXv`h|;FhVh0fsGcWCM2nLwQ?1&X$v$yuYqdF z+com6nL9*Q6Fbr091~}3Gl_lxbl| z3YW;bE@({5)V5rAz~z(Y*WMST;DZF9B&XV?xWLTCQU-Unst1ZRuEmG=Pf8BIn0{oi zDa=b8OrkLD=iA){!QA&E_X0anNME*yT~D&r7NK;vy1vov9vpmq$i%acbCf33%-snO z(WjsO^5<-O0!Iln$hgLDNS_lhkwpmdz2&y{W(4+1y{ES_LA&}v+8FnyFK5?qeG!0) zr^EivEXuG?dZV0e?2$0esx!@Q2$OGK${iu`4=W@SP8PFKZ8766885Q~$^FkRk-3(u z=g`fD@89k`lqO3xjWi>tSuG9W5!V@GbFl?F<7x{m;-NxsJvBQ4$9uag<8}YL% zb>OJ53}6zST#NvvlTItQ06Xx5Uq1NkvFvWHsggjz5Be9Wm){b2aK_dqpstz%{%cF9 zcD-(sKo=J8mt1|{rfAA?n{)N$@bYcn&2k4NQBoxs^c!t<*Z}lc5W?#p`Nyt?0iZn!-K#KYMOp}xI%!*sX$ySqIy)IB8 zdx{MVOT_Gerc03Y@X}SA^r{ON-*IF?C5U8?r1)}JO5wR)F)M9aF@dSc|1RJ~afl<3 zREs4ig#~LYFK%h=c`5bd71sPlm1PYJZFVOB2uC(~S??`wptd+}bt9*@ODNJ|wE>SU z@p=8Nar)@Du>UXXIM>7@KYsY>1GBD~VGdUU_=dA5lX&#@96)XlKXxueMiG(iFK4J( z1X*4n>wv-$GVITTAIP}c?_JcKU%B!CT+EDLx$=?X*0mEhuUxr$^)HVv6)Vl~uehNA z*N~TTHg9r2`te}Wzm$fX=IKAb!EYEE8(YnlD|{RKU)~|Jj7n=r6oYjss(~GcR+<%G zUQn-lz3(J4^LKBPvxc+%qv!iO`$}a2$k;L2inWNa!cc1^%321uGk7i z91`Ww3eF^+>Ln}|t6W80FE#>YaJUgo-0m1D0 z%BOev)EnwwvkfOsy{$(!FIzbqi*s1>)9-2eX)Hg!bx>VW)auajP|Nok6his$d_N-F zc%vTaD?1PYQCpC>*do(q=IS+BrQAB&SZrt+C0c)IG6vKCknv_EB(|-t=>-BNOSP|( zM-T48~E!)DKJJcVL(SN)(Jf8(h zdM1qstfm(IOykM_3bx1|RYeH!)j#375$K@+q_tObm;lU$J$TE|ng zUL!*ZA&Edf?mJen0kr*4{ps#l4!Ez?69RLI4h8Iy2PSn!Lt_si2^wjqt5)D6bFOF+_&3=%u0rE*mN%Rh98IvSaOLG z41*CA7Qo-3tjLppq1}wy7y94$%J;5bwN+;*`!PoE!e`W4@i^q8KgmaHCQ#pl>_Udg z$~5^KZW@4GidS-c>FPyYH?JB02|o^DRCIeVQmRC6^!MdOuoypNKSuwbbI0Toexe`n zVe?{b;F7!?lGcN;jJ{HWiZ7tq;rMM`maAmAX(Q5bf)QyXgVK+dO~<((LU@?o;$vIG zZEdjBf0L!66?A!xXrEz1>uq!K;B!z+m-URu5`6+0IpZxD+a7Hp49Z);zSddl`aLZ zQmSuvK@Cf;;IB6yUqeRc*}gD(tzC3wt`<^gPnt?nNf2(rT1@W3^|}4dGUt#Ex+S@8 zWLhXtciYyZYrKX8*_M!N+QW~nxHi==a_|$IN_9)b(N9%)j64Ubn8fal6ukmT5eX_s zg8(x~jv$V@3V@UE)rHRI7*L@DYyFBsX2c5l94cI{*RGm4Y>8zZ-(Hw z;?u<``m}IorYD!V5Sz&C4`l?&phU=_%gu7H^6?nEOtZ&quQFe+z{FS`G%+gN>jWP40ZBvq%2q*w?k2cv7tHEl>nfaLy&@}WL!}$Z5Wjn4xW@XYyMQRm4|6Ml9=WpRn>95N8t(fa$kP%=R5`j9m+3d#l}KEzeIn} z-XoP-r866Sy4VMnq|7-M?qzWwPl(CYQY$Lft>A#QvfB?gCh2tsYm?y~n#lXoMj+S7 zdMo0}P+qabwPV^8XD6{Y1Kb5N-8e_;qwVCbE>OL(Wg7{!M18BDwa-GE@b&!E{3&+{ z{O4p27}!|R=9VS&A8hk)(o_d3DoiQ15)@KWGb8!*Jl{YIe~2X%-sY4!aRhhJY`Ecf zL%q9SrU9v}JJ`)oOkjh-hHED&2qZxDDYH^4x!|ktJMD4R;K34&e zWb=wYi;hMYsU3nS2!CEBw0D@!2k7HfsE{nklvv zh+XD^s-y}`&?UPAiX1;|{g8WGE92n)BK-ZDLn>uSGH6$-$0Dy>2oDJnO|dq5Z-=b< z5Y7cAhFd9$t|Ba|^ie+z=&JJ(xJx3HBoVb!q~%hicd07Z$<*3i&=IpuctMmehhiSn zCu#Rd_B1Nj30qelj#Pcs?~G7qAyDLzj3sBO#!ivkkg5;s=mg*v(u&lh+K5mPm)aKZ z(Cv8!!Tgvg`@QNn6y=JnSt#bAOMTWgWSTvxU}tEHjTcBHWwv&lXOU7!OH-omizZjm z2%VrEJaiO(qC2^MO=X5o*-2VV8(07}GBU)3Xqmks<<9X!x9dEvfdjc2#HyUdT#$j| z0C530D6r`2mVe{0P~S?Na4T?vzScN_FIMm^{|Mv|Lg)uxxB*_kRlqM#9ndjQGuX2W zei%xV{-X=R+#V&7Z@r1`O`=C@n^U#KQQIO0aoE~93F0IpizJh1Y>BUYR!y^Nsj{9g zl|!+Gmp3_vgHfMoqps zYAuS)+0+@|uU{uM41+zjnDAW1aUC~qRM)a%?|3rC50xdN{V+<^Wc1y-rfw$((1wbP z6?BDf=^U)7yQXvK0rK0lJGVuc`D*7jhu^((Wt%W_DNL0|iQN&7_~OmI%=_1MG_qb> zb119qYBwi5~)3bQ9<{sLnqY8QmT1Hdz}I33v{KCWYAigUsT z7u5ZRuht#cgVTg*<5;2LAQ3N7zdW|J~ zQ{@%b69uCPsGzfJFWBSj{yK)TqZygsepDhUP> z(0iL!F3J5+6o7BBHR(+;JxIkfVcwzZthaNP{h8UTCMnT7qV*}^P#JrLJ9HR^9}We2 z%yND#w48Jz99T2YDCfD|WWPf3yF|@Bol_{p*=Fr@nfkVR?lOcyImV25tcXQw(I5&@ z{;-A*CYqPQR?Lv51(_)$oTDO&^4uRgS;?~)iN7>k{}}NQ@uO5`#Z$*#!`%Y*Mf z*=RMO!xVfEM(O&V@yb02f8Qg&zl_&C8d#|bvs^u(#5Af}9}qtBh2xBYID){drsS^H z*QB$>b@)DMDlTzHy+XXV9BlyD-<`h%$Riw1rq%VbwEZ!0ORlJmV($eWj)-#NsnHm& z&(3re)8APpI&RS_amhGVlmJFT%S=|ij3PMn^Vz{mAB#j~i6lL!VLiJk+08qWKP2rEA5C4US18U9PL z9|C`RgYfSEsNC@(*TkKvsPW6bAZCOCQ;7S$MNnCVH^HYH*#a zRMU~x7>8p|@jXz>74$RAn*4(|5-tx(*xnnSRucG91Qm;>q(u~A#)BEL7QM-PlI6r0 zS(ukRoZbWyBdACcZ(=iRl)PxP6tb#I|4_jVyqG zgls*_-kJozx?%=47-~|Ky^~?Jk^*cKkfU*?6iVz*iiV2vzA)qI-q*_E1gNUs;hU)t z5-dDvi3H#JScEqg;mP`MWEg}eFJiwZ!V`KaXHNyr5z`ur@S--$P7p zMZ$qTCOo+T=fTL~2#-0ADEptkdt5o^?*-ii+ZJ8IMvhpX(1co@-j z9NkrIK%!DQ>?0NO$*l%wRDM1Nh6qF>Eb>cgp@`Eak$G z%1nc>?yFCUNGF=iUyjQThT7uI<%Trvnn~9O#wZXAs-C7R?Uqgc>6noHGW!@2nm#S! zag4#8M9g+10(?M4hWtpeh3C7NhzFcDS)%OK@6t;#`XwcgA7zpQXmI9>8gVIS#-UVm zyL6*eLiR{8));2kscK1%3RT)EM{3lL!G~6$U2Q`=LQ3lPb+bTij*e4D;L@3?A{?)k_*hP+ z2uK}WqqO?Wqgr7#GZBX#ibG3ng{>B7@YnFvvq`+cuJs698g^~=`&VMnq4i3KBn`-M z{=UUt-`?c9ZV~thkQrbgRl8+m5cyi}D5)KP6xLirfSmP`(AvTQ>x6$vyCy+q$iZ)l z^;f3Oq*r~)miDZ#fL2Ol%L2>hhc*-VN?7T%5W)G1D3`MgxZB4QhtJ*wk^p2E^u zS8Yh>O)M?USw4PB!3oD$(M*%Puc&!zmYqaG*g>)J{LfzY^@uRm-97!Iue)1aL4I#q zaZrhKEn>wp**=+QIj)!eTn5tG*9Fr_ZgSwN^K{Jh)~re`lgq+bz-vD$XBG*s{fMd- zp&7QeIm1pj2qVRInnCARwQe+)*Ww zFi)R}c#Rj^+Ag_j>uK3$^>NN>ml_ZYpGB_9apt;mW-iJpQ*Fzjr}sPUwo#f;wU)_J zy^y_F)C^8h+}_BBRa@#(Ni)+n2e#EN7_ty^C~R$0DTBS?zlUBFrqUZY zK$glgZXixueOnC>KNHPh3&cJ!?5oK4J!n#t82DYGI~uU05rmSuD1~E|xI?v0l?)p3q!Vq*;oU@h$ zrVEpc6pZWPP_vm- z%MsNU&!l?epi;T<^3<7>qb3`7$bna!ews3VJV3|y2{1MDTA7LxsYq}n2@z!5l~WSi zjG&GcDWh!|ytX_4u~h`Q#H@#<1Zi&|JQY6$iy!&`35+)Jll=)JDahDeRQO${9&rK+ z6tv;hxzkb`Iz*fiI3&;Zdyzq@3J~!v@#Ip5dt$bY_{)}Iz<`jAoF6DUvS0XRIT^m_ zwy+b9i!3wEp{$R&WaD3$xE(^MNN;7B?_ZLG}3P^u#$AugB{bwRQ>C=+AEhQxCDPAvb% z)dxA(8OMyZ6oX720CoE&hdb6l@GKKs_b9B`uCby>kd9I1zN>0`0j;Em;Y1ACe-3~fy2$KighXvzv{(c zT8Hv9_T%Aji{g5kh|%Vq>Wj}GNf8u_zg`atkI{a_M`WNuD55|O=xZA%4fsaE+Z+!F zQWcZ+$w$!!s~W}$0^7Uy9^HTV5YR+i7DcnU zZ+c8MMV$zrZ2xF>CXhN$l7wIi%As2pk%g#2t45o^)lw!Xf=psi5!)XI%3?L&r006ONEj z(T0flG{4ZnnsHPl`E_ex+an!s^kHDbTI-NYL zW|-dF;~$EPN|w1Mdwd;9e+eX;E~V^=%H_wQ3a-7Y( z7`jyvzqKjWI2@044yt2wG-855TB`1N+>0W*cLu;kmkIk=fNEuy92eD^Cw~{GTq~Q; z&eWO66PYiwUX(n^uEVu(-OqOa%cM`J)RflfFf! zjf-tWrDfmA2@Oq$bQnn9(w-`cYt)zzEiukZ2tTsf0PNZ5Z$HM=T~x|&W_sDq!ItYWC3bigm-0E@2`D#KvNcB^H5R1UZLq*~qtai@C)Qy*b2#MT2R zj`_Prn>ugSp@=BZ1W0RX1MM|x3ZPI@_)eCd8*ElTCm^Hx`J+!Xp~mBQy7`+HFLfQp zrr{?0)#Mi0B8yF&1|eu7RoS7apb7LvS@6qz=y}^n8`!RQuHyk#7=tVd8bz!qt0zRy zLZZi~9p{DLaw;qz3umY^cd(TdtI6ony$`ej-m*yo4T}2?D>kv@fl?DyZ3 zk_FGOW3m@v&3VN>@}(=2EAK3Qmo2>Cz7kIJr7LI~iqRU3t~@#Vg8ON8Fn%|0Q9Zi4 zFb8tir7Qcr%P&>JWq5euk~_{Wp2!PNkI#f{HOf!y)Kx&>t8LNevON z6IW-9v;^P{70LorUz*j=Z(Xf^i=Q;HSYFrFNG!G&YPb9{oa@ZV!W8f5qixvQP;@1X z5hdtrqsmaJsGe6>g7jOadwap8R=G!xs6Ff@uGKH6U=JsS!(#%j1+_T*H?(Pw5`4>O z1{Bwp*32ef3xI{*^%?Oa z>zAq`*R8)v1Zjiv-ycIZ$7{cX-LE{l$YcNY-5Ho*dHWNu<5wJO!iEd4Sa)O}il4b_S2mNO^`W zETYFkXJI}RS73jEm{8MG+FwH!5s&f!D7=_aP0U*RrTEP-jvYv-`M(8yyd1lq-!v~+J)AT3w$~RMY7~1sA`T_V%RqCr^PDX^) z@!XN#Xjgon&*4FkeQY4^X3LnE*0As_UlGqzXssX9mEdj_U*k*_7a+NSXqS@OujZdbFY>?|BfsJvghOA z$RmWIzg2Hr`q&gER&oNaJO2A;1W8wq9)9xKy~n@!@`1J0kMINC?nrMHjndf6GCuq? z5}oMny4*@bL}ld~fo|yN2wGauvw9cTsrUi+EA_%o=6lLD)(N62Mz+s+5l0Taanyp{ z3GN}!3n}=<76T2td1%zJv9cRc*Dz0tEcxOjM&}!BIG$D>E}L*8uWuAj?9wZ2QkEs5 zvyH4jns&*lcJ<(l@inePfpf5Lv5&N&kEVlFB!dT61UD=?f+2Eqk`7RPmJr7?xp+C- z-N&Z8J0*fr^LpqY$!2aek!Vb$U2r(O^6>B!$9Zz$Tk(*%DI5qS@;k84vGny~VUNK4 zjVZ5qS({Um=vD-^h9DdDB*^R@0v#fz+$_yUTytXzYFye1ASvy(y|-Q1gFME5Lour0 z&RRY2ru3jmIUDt;{u)Gmr#`A_m87F%gmQ-aI3@$`HapxgvRh;FAp{&Do+l?XJxUgH zRqVw@%52`#v6a2yp9_7-5Yc<*6PfsR@@0!x#Ne7BJ0qJj{`98{f`#sSoDtBD9hAi= zW%*W0$rmGbi5}Nj8I@x+Zb`^!DDSxlL(WZ@$kiYvbMhU>>J+B9*o$k z3hjKK%_+8N+(QU?ghGAngdu^nC}c zLk07LueIOoGoy%eP6u}qY$6vSC5~uqdbqRy>~u~7g*1ydeT zcB&c{u}z{zL@CbEQE;pBqf~yXNeLhzvbdnuNqHRa%D}OideaiV9|iP!6Gu4=E`sJG z6oS91yBFp4e4zd07trcBDv^C4l+ITScI_HE+Wi?2^An;4?7Onf{|(-&-lY#}Zx`84 z>A)|A$Ql?nA_x#&v+6g7Y@C0?Fe?zaP>5FPWKr0}i{nU7go5OgNPyA}P)CdmN`%M&$H4b?Fvg+u3Rav;2CzuT;++1?j#oSJImC+y;4 z9cxWbITCr)zca|Qy+)oMyqY_lk4j{^&q2}-YQ;rLxrlgeHWUgenR>>lForeUkC*`^ z06@N7wbz&p`u|n~SO5DJ#@*CAgKQq#L|SIeN+>^wQ9^B3WjY;PRA7zb@0`j^2HbU< zCT~=W*GDH)O4Ge$M~IB|W;Q7?9@qblc#g%ZCr|!~KmSOq$G=;S=ja~IRd2&)N{GXU z)3zpVFrY|*V|-#DJ#)l*H=W!?as$$ zT=u8K8FY&w?wL8RtG}4_m8f-SRR;d>c65}hS*oEb$o@-*^Q+BWQjZjNeDIn>Sr7Jz ztf311igXFjSgW|A{Ut-MwdS**t{?#xV-6um;q@@N%_TmzCybpXOlM;N+FARkm^6t z5DHm(QI9w(TNTg*eOyOJZH!8q zWuiT{sH1hUNtvgyv?YEru$6NwKzc^ok>4GHMZ+}o>uliGqM!(86@dsizrUgoAgB5Ki{Kkcqx@mAF4UFXIU$w4Puq+2udEG28o z{8MqI!Nq$YKxC`0OaX_pqs2ss%_Y!UN6Zmha`c)b2zS|3X9aDH{!gO$t@9cmtZ8}n z&F;bJLhR{i-U=5Tu}$Kv8SD>_;RN4+OKoM8N+Cd1!>`m@3ZME|zKH^|>geh-NNQQ56l*UY&LiT3a%<|F`$TJ%~cID{I6f>zHN zb{+(vS<(#DmYP~DjC`Q2g2sYZ3;`6eRzsp}11mT%-fL)?;R2WeND%~v4_?O1-d98N zGfR9#!2BSa><V*#ZXjxKGL-i>~dw{g6gUNL%m zEAQldGcJU6+h-jPMmBEKj^h1?RJio82II>gSb(Yd!Q|ox!bPM1Tz=hb{W|RBuZ*Y+ zVd?QWEaLK(d#s!Q{^RV5EuuoR6!u$hz18$$InAe+k0FBf04!>h5_NOI-E7E zG7b@8Tu{EbE)$Va{um`o%yY|bmybUqFiqL^ZkVfq7~va(xuW{O@ny{96Yq zi=Qk7Ip?X8CDS0LY)>*{0KQ9gW#I4j3kl1?>J^lc6$4G=)pL+#xqD>>MfJ5UCT%xHMq9Zut-P(_}rQyZ8N z04053BTtZ>@7^SBCV2ER=~iALI$NM9%JLDLS&GBdQGvsL?ME0Z^Y8h zwcAgQKAVebY38tY0K5DJt59AbLKS#3FyfKz;*KJd`SfIt;f~sLsv^xPxK5ZxnYjKq z$`4dj+q9D6NGi`)X?Ag&6d1Rem4!;Tx`>9bnwjgzIm}BPM`E0}Bzl%SYa&}0u}NOc zUUN+r!@-aUD8*n2!f3yxFSeeP0tC=n9x`=%QHe}881NT~em7Re4j|+Aj7{ zeWMVYqb^l7L^?Uk*{H`_9WErY!+0Z=y3;V0P7CLD@nD{dBx1IauH|D%BgCq zvlE#aELFerlGEKM|9NSCG=u*K4*F%Hv@AAJx<3d)FG@y@V-<+XtI^yE@AOC4N`$Pygj#64@9~ zO+6C@QaY5(IPo4w$*CgNZ#Vt?kf5}1QRh5OKZ3E zbhYs@7_Ix!d=~_#KJFf%1v{2BICj1KP{Q(+l2{XO6T?@EOi*0?)Cndk4iV@s^{5Zzmwy~46=fSp6>RG&hE;L2>~MpHO?FqDqx5mLw+38Kru|XmfHWQs<~q z`|yaG2`WP_d;CX2F2R;4F%HwJk63Fee=Mf^<%l)h8!czYIwPfLD%x&O6-F0ra-=DG zp3hfHW6#xyMMgG-{%4#w+SMcx0ucA}#iBE?-&@S(hHpp~GSZ<3{!J%f$1gA{>4D}= zgE;ek*l1v|jgNT--80m_pJxO8u@uwN!h{dzcap@wPU)JwoLq6qyHGJnCntAkAU251 zj{NZ-e=nXJY`P`*jJ2B81+V?r)y7BRSFTnysB~hd;{;{L(dSU1BhGb}A5;wVX|>QI z^WwT*Rg$Dp>DlJBw6LVMG?eH2zC{zVK2hr(O{?Fo3@!I!gW-!b(KSv^P?xCNc=tU@ zmC47-SF=xfKU5XJp)FCBL5>(YuB@7gc)vE;%_IELBt|h~2M6R}<0*ZCPo^$^8N9<- zwBZTN5nV(@D#x3WaH-TQA>}Qyc2$nH_MF1ZlrL8_+@-(*`M1^v87y#b}mD~mGn zKQ!I4u9b#bZLOSiOSDl{cR)4S z{(1NIHEWi4Yu~84^hW<^u{|uiMb{yYvT&~F;Iwz^b1AHQn^AT>%6atvh4yH_0#14x zMk<4BpCccuGHi@hcghBKN;pmSm7mNXwr*h6Wn-0s9l@w-#yfjpn-y1&xu2ucuKqT+ z@aQkKs}lz4V3mL(n_@0;_8IIzoQnfT%Wqs5Uc#v5-&I;->GvVM8&1Ua#ApmrHcMv4 zsE08OX7^+;kfF(6Nw!ShNEwv4Jn)0txC094W^P+2o=N;`k+G_sj{W@CM>y zoZh>pm=5#rD)yQ)p5B3z}`eQ{U1hf5(M(dTn)Y>n0Be}-Z0 zOeqG?;L%S~qm>DSWY87cp7S2Le#dxj!3VA*7``j!>1{`I>`udJ?{D(ey8wpyn> z=0VWc&wB{CQ^HclJtFdgD6#Pgk35P1;Fr&Ja6@d>u&<6&=Jq|YLWS|F*1oHij zi*%&X!j6rj*}h(mf$}iz0}}hY^CRNn=dm7?fxLkT2qr)7p@pq zHb#7KtnUc{((tEW9W@iF8$`|Yd-u3F_#Thgm{3f{DGt+IwVP{|{=193coZi;U;N}96&)G=^9!Lgh2?N)&|^cQchY4Q%9*?!PXBsm zE+eDHF%_>ATLy~XTJJ?FlH|P%aMYRfw}|Tdzp+~@_kbj(@3ByFmwH49g2kxh1EVwqGf6juf@z@HW)RCCGVQ#UMU2MKCBo7 zhn6!RB`2Gk&~U`X!?C5|5fr0vVAmq)O!E!;u2O~tAEEKdva#c02ubFiwwS6W*Vjkn+BCy>8xx0+7%HLgrvT*wgbtcKG6mE zC_Cg}#5nN}7yX9v7_>ChHJ!9fw*<`fmAOtGhzj@U1Nq~o@7;WhTkS7UuLbCFJ*!iW zrI2Z4sHE*?UyBo$oUSJ7nUWn%k?|;7Wd@Ly!|z5`oOxL!S2#eBaDxmK^e;=ud+C=* z6d|-tX{R=zgWd^7t~N;cvX@y6*qy2vDqV4lHpDLq<7@DG?xPSQ@7?Y_tqxtG|1Lf{ z!dYQGrO zsAD4frS=y^Q2Lqe(Hm5c-vGjf_k>6eq7EUJ@L zN>;no0PZ|rXJQjWi8)z^7J=yVgsa<~FYf)~QHj`X*zI*?0Nr*DP=pLb0GQ&l)w+2n zD?)HVj)khmIRNE^D`uhO%T?9q${SIGK8=r;s|i&#s@ZaS=~*)r2Kf^^c}jtAl}XqJ zp%|F!O_3O(fJ|VjW)UXtE=4rno|By{H28ssI?55V-P6KAiEd8eVXi-G0{R#awx}R5 zy(wh(`_L9q2*jEFxHa^z_lhTHM#q5^2#)d#q zYVO@qd@o_D&pXga*?KPYao769#=nop|CY;{hh;m%a-pl>1}Vv2o^r-8o`XXK==At? zw@xoE8fwGW;yIxhZ0$-@^MzJ^7+bTP7e3}Zjyxu56qN*`XU=SnkmFcOsEklL5OPyx zOppK?!&Vu`MVFYE`4N=y82YIrS4u_jd_o|A-BC_T?54LHNQ2TZ%XMd}07)5Q&7J{!IJ7x>R_}UZ zd~UU?w{V7LBA@48ai?bJP?YDW4Q#GYGXkDWEVUF$gSr%%mK24_cqHzdp`yOnC%2B@ z51a5G_aKUw!53oo1EM9Ti%YR=5yQ)iAG7Df2E{uMq`?E}=u-=s!8l%a4}fjN2?_~% zLAYBcRM!*i=LWAg^SW*95?ih4I^m4VS0C{w!PaH4%NMz6!iDS;;JxPE<)Un0tK3$L z)18bxS_-Le+&kmpok7(6+Cqh4v?XlA{qZ`UPq+6-9?UTY2^Y$x9vBC-#r{!4S+y>f zP8OP27C~HAPzM`#{n6*%C(6Y8$)Gk-|n0vnpnQogD2NqUzN9G4uQ492||pVk2J2osd9S zJW%0I4kV5u0!7vn{mOB9RPZBkMUP?s@ySZ6+WY%E)QEIZ zDl#VATe_hsmoA^YQ6K5WDg2WkOQKj~BA7>n!Z1dq; zSJ~Bq-J|O2f8A2K;? z$YNPp-iO%MNwTxciUp*Y&o0J5wC~KYLH)cQTqA(r8dIO5vhm<27>s1hNJ0v|aGQDQ zS3(inH!gmdlLFvX;(#AzCzL9a^uinU+WTZEH~iD#znesC7K(tt^J63^*dNXs|2o>6n)fV^^^#DwTHc%TH{LLvMnZ zA9E}QvjFBqz;SvBcog)2GXYD33cQ+`2!s(5!e0HHO~Z-Qrv%=)G{Q~&?zelPJ8Yfc zmH`O7?{!O7+h9{{U;lSi|DUQp$Fk^$8rVDc-Fzu;x_$fhjcXn8!8*B04`|!g`Bl&x z{iOmdWJwsNmQyyJVj|If3eSwbg_);*mg$lshe3Ve{31CRz!3q`gW=~vI-V|{AEJ>j zZW;0i-(HbMK%3dYQzg}hsDOnZsa<&Vt7CC?n<@3{95I6S$cP%*5oKH%zKm70>>7EX zLNFbv-puO>{52WShg!#Vs3D3C)Vru~AQ>b_SAg4u;K5I1hq%j!p}eBdsQAx7IgeZr zl-CW4(;N10>xNP6yGtK9E%N4tZLWnMbNfTJH^4GrvkPUk_&OO!BY=5n=RtTvB+kAF zVuYBA;6hiPdb&~*d9`UE{F3ztAf*wz(9-|1_$v6kuoC2@d zYe&R0RwT2i0vJOqaVtDtYSAe(P?tGe9;n!?54SS8$#xnj*$dFtJXA_L#Vq?$H$P%MRLSBccmiyE3x@{y#eB#=i(O4I>9Dmp ztLL0$p;D!pmJ8G~(eNqFgW-q|59HZAp!YRZ2#nWh_$6)tUan3h#&p3a~$qD5;5`-cD@l@$)WC&uJ=bZ+kWRJof#zXTR;{b;^3M^CUBHh7G% z5=$rplOZBwFuY^R90VdK8|mgU@{+XFqTOV$4UcilsXR6$j-QkvGtYS9a*aB5&SbFc z)$Nj#G!B$tcPc$CJ{812%uX4+{Hi6#dcEIz_A0zjiO>NAYQeBW%JyNepcWAJlU z^h@dz?>p4m3)v=Sz1Lmxy#+8k?_1Q%i9Jv{85l*DznaUAF7T10p#~&1^jC3lOuDK< zvo0-0T~L36^-1$oi4Vudh^r7M=kR#F2&a*!B4{u7px_RGpC#4XBE*GJ%~Vw(j!Hyt zM2}EEat~8*jGgNccF5KWg>+l&cy4EjXQ^$;WjznDCLiTE^GXqavVNBN_o@{DE1J@d z;hmJiNQB0`WvD%`H`S?6WgAFf)zc8VqGI`^g&fL8atqbmuDc@SXaq6NR@O$;)9vY6 z+JWvGcR0^=ijdM#p;HROW?`&0Y1CcF*P86)>C#s2p{_*blggS9L;RdckGxs$&RZ}U z&X}cLssL%;(HII;VdD6B{t7CJA4>nr z4z6*87t4mJdcQYZCM_AiQW}+rN1SW%q8%Jn%+4D2F7c=+M4q)^5eS8Es{37KLHIcO zbv;W8wNj&{vF9E76xy2uWL{|ZWr6sru`-$;uY(t@ZEqP;^c;c`6EcwXcWK9H0F3d0 zaD|Ib$oD{jx-C0m{DoY-=1U3O>W%%I{4Kq!mxLv5Ua+g4kL{m|R&HS61&D}m-* zt6&Tm>IjjAIJQNuXq#=n zEem3e;UWys>>)}OSS(5Y(iCqfT%pclwpbL;n#{ldNkcwS7p*L~a6l7mIgY9Um)_#E7fL_)A2bMm>a;vccDD3DOGA z0q){RV9J(3^G>gyr?XPp@j+nYSq%R6ZPl)WIyCt!-ZJgZB?%l`CcOqeSwk|XMC{bk zPn1Gzoiye~72WXavRAoEjC_!@BV|JvinF&h6vCH-?!r zVq#Ml(poI2b%jawnYIB(wkX(QTgpIJxKLs*j&%|RW_=?WxVV`^mvrVfMVNHVsU2j< z1yoFR18O{&K3mc-sMngA0V&^Gz|%g6oBNBKLD9A*NOG!E#c?5R7*m0O2F-6@x7LbD zAX$h*`wE^iG8Sw)CCJ)mnJp55@I1R7J}16c^N|8xU}3af`Y9G-X28xb{6S;Ghf8a5 zHVoSl%Z5;lX4Xg7tIw@vvdCUCWSbke@oI8y8@T~C?L`e9#QZiwqGQyhR~AEbT4kZ) zf|65_XxW>~G#34%oV(71oG}`oZyfgeqyvX#{34CDVc8WkWqwR`*ieEP!&9BbJYk7$ zp*b%{>&cV~*DW#Dd;kLAXIY>Hk&Bx+@y?P#TkzP2F9&PWj;amU_S&3rpqyt8si|MU zj+ZKIr5|A{f+oTw{AaHye;q@3<@@+Y9gkuU=?~#)is!;Zs^ADQFjXNS_$1wwxrnhMEWd^Dd35lDX=h-AvquF+f3Mlcc<2!doQ8lW+i50SDc_QWp zo&@Ekh&+b}iU};qGRw=x5#mo6MC=p^ok%U^9=adw-T1(G z!n>mLDS^uXcG%O;yWb>`((OkC*{CjEh!CRy%^ga=70XiTI%WiGqgYIALQN!W?0$E* z;=kZ|rFl6&wd16Bi81NF(8}4@Mh-Z{Pb`M$#9{2;PH;=urotKQht&A(Cp%RQEUC9q ziZQxV@E#Kizj*fC_4D>m?mC#*CJiKC_*_;N*v1VPy%)##TiejcFk3Rtm} zhq$IRQ42vK&H;&DG>?1sLO|4-XW%S&8r3>a=9F0ijwL460pHpSS_W?;EnHXA6h~T5U*67kUXk(_V835K$NDntyzF!IUiHM3_zi{N%+iV8X zlPtfz14+F(MoG}HLN6QQ={;0n!x6U}!HA+HnTE`qAtjrE+j`C@qDfAY=l4#1&kDZ@ z3whb>p|_r~btk4s-8yYBQNBH#e(7%Ir6)QxHtZ2~kGL$#BiMgm-b!6JN)p!4DVw&Q zuuUyjwOPRJB@8H`pjCEj6xn#}=HMX z5S$J34r5)p!$LGLm&Vcf5Q^E!hEvR^f#Fc>jHKcqJSmmF)X(&Kb+(>36U)~ges2xN`jc`j7ac{AGq34L|iLBJOsLuD<#A^m*#`F?@6>@ z`JTkOt3k;nC!@qrF^`VzjGRANFfQH;<3(nBej`i9Ho4yY;pGo5UAf{gD85mz&PTSL z@#=+Py_h9h9?f#8(WG>%YPpPMfY3TXEYnkjF~UAh_69r zj}3=RHZL{uNO<&Zu~4n>>q%cl7psjgHcE2JmqoPmMs2E%|u(nuPWW<<6^07nvFOZ_t2WNN$_(i6~81O)KFY1bQ+7sh! z$B+-r?rP0g?3d|Lr{VdeJTq#olRF{c(&7nX&Vs6ljevq4D_sfv>O)i7_*HFbOTGcS z*6MMqUrSaa5G>YgQZxecW3kFW0~4$FUP%z{SYWk5v+fOfpI}WszPk673?wP@z1uZh zYC{9}@ipjKOmq9D(rZCA1lW(C21X9!1D0A*Sr zu@;OYE-I3EhO+kxxs7BA9+5qC?iZvgl6CMl;pPCjD{o(+rVkkK#}`Pf`QC>{bvzv* zD@s!#WCgRbp&N~E8}0p#t`|p>g50SJvK{F?M5>&{XG@mu1~0Wi+8eCXYf+l1ZAl!r zcyR%H#ud%31alQ{(`2|gp46C&{Hq3Xd8;kO=MM7&_*%G zS_qe*Ttzf7M}c1Baja4$mT)rO+~Ua6jbr1*5g}|#WnuRhX}-ptDGQ8nT$YCoF&WcN z4tL)7y3`3MRRo(~>S}@$iuw%BR1<7&Z0ZFGLH&=aD!BIj0D=G3>Vhln{jXMKaHV^1 zs5ZEAXPvw%yl>iSufB6)RS4?5>Vrgx{ao=D;)~iHiPX1OTB_-djqwm|_J2SX!j*Bl zIF&4@*2_EK2sA-D{d-pY87u>a{??Z>?gu=K23V)eKi&1bB&D zXE}&uD+=`RzkXH2zdBRZ@UPxj)sR|0a)J%}^%(!8r_kZbM4I`p zFyO42xKzt;{VhvGvaW;$T3Vi-CF!t!Yn4KX>KXPmixE_d|8LboEM+lNnG7U_Wu}2T zSz6?bEOmVe8Nv^ic4HIkG?|RInlo)FS@tlB|4kjAiG9wlSc|C2Ed0`N&@*{x-(M_f|QB4U3adDI%~Q*>)M^jyBb{D-@eF33}5csZ@;^nyVE7B z{8@SdNpo^tZOAwi#U3sKC_!?bSj8nK~D7G zF{7}#6DvZTtflZLF3N}#rR4ImLu@%Kr+sFb6>{)ffT*=6enpsjR2OO43<@%=jV~Dw zpL$4VJCgOj^Vw!e(q4=)Q#aKyd3@^vh3KID zI~UOM_BQDS#frjpMzI2iMi!G!V<3XLFvWS|{-8-i~4~85ch1X-n4&U#^MK+DhbmB zc`^8x1{3GI(BgR0mW6VK<|dvny;vRN7L~)}aYeYb8lRN;m}oxQKWJ(-Q4=Kr<`14) zmW{7+Zw*v#Pko=LBB5{AZ+Y`(FQ>v!ZBi}7-|KpOn*-NHtczx!t-)6lWvyfHpQ*(M z&-x?O%sXo&c~72(Ki0VvDD|Y=C|$?0-l&4C{)mEe1%Z}mA^67J=dO)3P165TF_XGz z2zO`Py()L8VkX5!zhe=;*8B!esbvVGm%5rIRg=XkN2qz^_mmr}AgGa`8+Exn#!`Q- zHWu^K<6RPyT+w91XXZEnfh)}yBJekQ)pc=a3lQ_^;s}x?IG9qHO92y#t|y$D`m6ji z-}%i{bJh*jNk1dlxCZ|L{Di?r)x%HZ^7X53TFIY;`(kqI5N_&k8 zOX`OTCpH6 zw=*xhAxl|NmcmgAfQYz8(TQ#4o}CO+k1D?r8Jf;7@Wk`!0fFf30|MAx{XWB-mqMrP z%HoHq@cX_FB5DcUH_O>Bfw5&)nNMUEre#q{y|k@SRjt#SHhXt;kopRxK}8uxXiEEY zQ5wW^mf8xXnKb{PdXZ(N;1ny>BL7gr!CGs=7!El(S{|k_mN^F!gEWpHe0Pf9^l5Ti zlj^4tK8$aJf(pLFQI=_Hv+oo2L#rPlJK@_mZ-v6bhZ0`bxQ3enkIy}M_-zd}H;hi~ z9vv6fT~|H4hAV@YP$+;yS|g^K?MMv*6a?HV%DW}5Svhdd@sUsU8$#x0a^{~`$1fSj zM<2Bpu|7nMSo!&3#>3B=%KP4E%ac&d(~1vQ;8q7e}y zRig9rCaITr0Pd=^DNZS+%$+@Ar)g^M%#>BvmZe~1oYL%QokShG~6C@cTP?nN{?7!j&IN-SVbxmj-d~i3K>}1 z%L`-r_5hbl6@+5q+uEL+62r#ih`v+R!xNo(J`_eHCl2Rf?R}qh?sGQYm#KHPIxPQh zl>8_+`)xO;Cz)#^zbOa(#W|RYpkNmH(@{Dq6o3&eGg3>Znr_GkN_dcpsW`L5y`j%? zM0%^a9}bXHymy8NE@jU1w)f9u^TdWCK~5R5KC*#;vKO)0Dc3dodS8bmE18ZCmTvKa z$i{YbgZ)kJq=i8| zCP|oGkjzs21Uk5mHqzQ3Eht=6$XB5+-q%w3JCUOmL`g7}iOdDgg4Uz*O~he%hpKAL zN)UGhyomRy{t|4NG*P@O(4i1r%4?T6(^x9HzeaE`EvPcsGJu~7y;*k^evJ;wB2t!- zMZ5CO-;q@~-b97Ql&RIt;*trRMxRJR>j!Y2lx>Q)OIJ1s?7OJhC<-Q8n??zPPg_aG zF4}jU$cfai{@A4w@AI*gi!_QDe55Nno@g?;+(s4ck)#Sz%Q5iq%W9)_2e7wQ)J$wO z)+SC!0hyh!xi;n;0QZKvgDceqQ%6~+a=AicDj`v0kZRqngo4e%onAslQmE4GCu5z= zE$*lo7wEPC2Gxv)D=ErHjEZ|yz-WPN_?Xw+hCiH~yru?JNi4DD&_N(Vo*7vUCWK)` zX$6EfteKZ6@Ce5+0v^srH7Mdu#Ag-x;0OwCQLKik+J(Xb$cSvS6J!*sUB`l>u}C2S zMj&ed@>X;Tw^GEayOSu$gHj(90F^eiG_w`>d5!_IwX)qV$Xe%8c-j((ZbOItzYwuv zG^vaKlP()o_YD(@3SP8MY>rZoqTh&l6;p3)wVT87R#froBk?|B>z2~Enu!Lf5ozWv zXm%bv#qoW*tLb$M)aAa7g0a8X?hRzd2JZI;TPV$p7DLx>lNpcxHQ&qG2)$smT#<33 z-=oxNpQ5ocH2sjd3e%Q$7seB|Tc5)W#G?7cezmoOj}sY!;>?C(2x@FtZ(r4J)xP#M z+q1+*sCjA}ukx}3agO>P9l)R$$DvPGZ1Ebal43qG{3VZI-J&PI(kISpC{M#GFmSoy z;cwJ1O2ZI#LRnZ|>0k2Jp-y>GuT-1W7B);s8#3_qW;^){eZcgE(TnNfB{oR)RQ+`n zmTmPww_b=RZt}y#2E|&zSzg!zR11MgJMCJ*T0ymYMecq_JIBgvZ0b0})`WDze!hJB ztzrZb?-Mm*1eO6I#n&It3Nn96b!h|XF8>}T8>W3>+~BwFnT!&=yhP18?bpc|@Djr{ zfg49g`gZzSk_u$_h=}MTd8KfApf!~|z4sQ02UY9(WcutG^3j@fy#pCN69lK)JEf== zjLzAP|8I9^`y0nqg>kiRlgfy%sHjM|OCpqjk=MKHU0ZyJrKEt8hKfcAA==c5)6^uS zinmVG0{=U|=Q-!j+}WA6>w=)-i(h8$yxn`x`*Y5TGLos?HBXX?XZ?`OPjRYzCzut0 zS;Zvqs_3WP0A#fTQ6wP?)brQ8uH5swDEK5VUGQ~CnVwswzc*^W7ET-V_2rYJ)5l+I zGeJ^`3sq^nz8k}QTJm*g)A>qUoLC9lQ?)MM(Sr;hmx@#PxS4&a0m4+u{;;QS zWr|OaUZ53q;vfLXpSss)Ck}$DQdBRYH+7pv*OK2v?wx@1#rsk&eDmcQ{;ij1@@`Q{ z!<$-#YMkH|oVGeP-nEKrzDR! zos$at>9EPNv@p>(Hk8lxAqH*iWRgy>EzVZ%oL(F(*?j(}r(JFQu$|LcOUvs+< zNBpKfu4ED8cJ>Z*!aSclgrOhS^mapk;hOcT#d>a+>UUKY+pyLhCS>dOsZKg^|7gnE zeB!zkgNw2~Y983^xT1g5p74e{xUfqZDh(1J@z2!PcRr&ce1lvZ?@zbx*xokrtfOj$ zF4>-iwu;xWnz4V=>j(`%2vQ~2_#BJ2H{fsV2lJ};+7^Mgjvll-`H}|&Fvid)G}g&U z+QZG;By(Uu)RSb=mmshgK%&Sskb=>{;Bk*XR#KRCzq%q)X@qd=xUx4R=ZXOkyY0zBtKK3miSmBVY#q4cF6F z(xSZe4hnO?^OH6EbzyW#Z?%jrAEA|1C=?xI2kY^I!rce{3}?wh$OPzWhO|c$n}#9H zChJLUg$udQT@c%aETGw$fgY16S<47=Y|Relllgwj4hTXWGNZBC;Ra@%E#Z1`lkg=^ zBe3=>^Mgu+xAk?@#Kd`WJ>P0b_q4Yw&uun5F(a@7LGG=iL)J)0Z_gwrMUHR>0jcs! zMG2G7pD0^hwkLWuXH=$51!o2l>+0Q?UgBV;Ep0pOV%nA`$k99eI9WJ%3NdAW5w-A> z2M7wc+}`m4$z|kz+lB-HL5xGY5rd^T<2SbGza0p#M5 zMq2bVZxO1!sSOfN<0$9a&TehipTCze6-eW7V0c)pt)G@iOA6P2q^IS5q#+{$*gHtC z6iu<`Bnc3payl{~bVkZsE5l0Kvvqe1G*4RAR(yS`m~kac7dwkKGZGld-PL~H-H9+j z?&rB12f_-PtN_s&biNWk+G6{R!-2zg#45MY@e$eS-6P6D=^hcTbY5TO%ezM$ukMUt z+mGb|Xr2`ypEwfxII2dwTwr!}#x19L)PGx}jg29OUoG}%;|Cam@4n5CjUNt-4Q@12 zmD8i4(_rOt2r>TNo-V{adO4zq*~wSgd>A)YDLFb{O!^rd0}B@op3yJcxSt`fSM~fJ|qg))b0*wz0?k98% z3^GJ`O-{#*zV06y*_+}o<=yH85~hwEB9zJ7(ZN2{*Boe1ZmAMoEKs;mu%i!9NC+nj z1!FT<#%%B+MaZnKqFHCQXrvWZ-eX^)K@E=6_3|w*WpGO*s-KPg&gj3oxr^MOJ^z8f z?Rg6}s7sktsGtV$2~NQXRBauf znMj;nOBv;FOi=v@zBPjTQvQvbluF=3{5Brr{lX~CYh{j2Z=zdUcW59%IYt(}6#OU% zrLhJI3mxPlb+Fwww_oETp=43r&(TF5Jf3wP>_QXMKb3)Kgks*~as6PaiF!$ooqWXD zc(5GI>O!Uz7LM4O_+RF=3=wY!qJQ3AYakxohL&cO=VZ4GJaaX{Wnjp+$Z;9CN_-7= ze(5xqfm>ZR(`C&q3a$%;3$dx=P)9%~(~Su2u(*fBAUh-CtfXoWfIRS^M!_q4Fm#dc zf3nMay=0g7&P{fq8~4uqM?X=13!GxID>|2reTn>*f$3{gT!v2evs{Kob*N}K(Isfh zvaoBgHw-otT|ShV|Noljf~@H!whT?EMNvPuB^_l3WLof60o47;q&2>=uG%;TJqWD1l8KBy_xJMha18iIbmF%YT0r*dZJK_aFI6XH`g`Q&oCNUOwcz_2738 z?%hdm7{mOp5E3hv2b;LaIh(=X0l3zF(6R&rzb$I5x^x|6Z2@F$z6P>Zx23IawQcAE zj40Yyq{DvW_WOLS`pc!APfyFpGH@^56yiIw{*CRx3;(V}raft9V(v{R$;oYS7uZ+N zpSl2-z$w3olx9SFJSQSer&#Su8uCfI7O7?*pgzBu60wYqK5W$<= z>anmMiR#$fStLLk8&6?fAIi0<=c5L(C?6Sv`_a^h|?hg1SLb9f;1B7l*n#8Hecg%H%rv zCPH;6?BL#=4yMemM=Dn50|vH7)C98_2aTX^&%lJV3155@RkS`=tk}hah43IwO{LmA ztX|k~9M#>2&oJ=IQ$onx6pufZJ$S61LfF+1K|$*6RaF7bQ=FkXIl8`BlD0P9)la|Y zD88Ok{(OEb@x*Mwpr5`#Ehb-7x50|K4kzTIIKKmob;N}C0Q{wb73^Ui z71RM4W!X!=gxP7k7mTp<1e7oM<nA-aT!0r12utS-jB|nKZ_8$Eigq%!I*Q>HezXqk%OyOdoAUwj$KBnr6|(l z80pszk*b#JE1p8eT~uR=C^2DKK+Jl)PQ>RKOrQk|ThPy5emUSQZC|569c>__Q0T-B zs-ekYN7W(L`mm8~?4+DjTxuoPVzIkev@&rv-Y-yL=DfMGT_+5}sC1+_lniJAssDsZv>KPmgv>NPT6k^>yNYuad-_2vfB~?$omrxg z%h<}VkN6h>ta5T?J3PZqj?F}yxRa-{M_C`LL(>jkZc1f7wxdfPD<`tZ>)A58bsFlZ zm9-^|XOn`X^w^|A6TN5EC&f^8t`oU)icfP#5`laba(92LEHA5iWseEkYx@2Q_?*}s zZ|xRXKnfJW<38S<5mXQKC(%JZ|FHQoyAHtIot assert false) - (* (map-remove! m k) -> (Option V): the value that was there, or None when + (* (map-remove m k) -> (Option V): the value that was there, or None when the key was not. The same answer [get] gives, for the same reason — a key that is not in the map is an answer and not a failure — and the value comes back rather than being dropped on the floor, which is what makes @@ -4108,21 +4108,18 @@ and named_call ctx ~want loc name args = the one block the map allocated, and removal moves entries within that block. That is what makes it mean the same thing on a map backed by an arena — or by any allocator that refuses can-free — as on a heap-backed - one. Nothing is freed per entry because nothing was allocated per entry. - - The [!] is the mutation the naming rule asks for ([map-next!], and the - note below on the two suffixes). *) - | "map-remove!" -> + one. Nothing is freed per entry because nothing was allocated per entry. *) + | "map-remove" -> arity loc name 2 args; (match args with | [ target; k ] -> let target = check ctx target in - let kt, vt = map_kv loc "map-remove!" target.Tast.ty in + let kt, vt = map_kv loc "map-remove" target.Tast.ty in let k = check ctx ~want:kt k in (* Deferred exactly as [get] is, and with [None] for the same reason: the abstract pass still has to check whatever the body does with the answer. *) - if deferred_key ctx.env loc "map-remove!" kt then + if deferred_key ctx.env loc "map-remove" kt then expect loc ~want (mk loc (Types.Option vt) Tast.None_) else let hash, eq = key_fns ctx.env loc kt in @@ -4152,7 +4149,7 @@ and named_call ctx ~want loc name args = [ mk loc oty (Tast.If (cond, some, none)) ]))) | _ -> assert false) - (* (map-next! m (addr cur) (addr k) (addr v)) -> bool, and the whole of map + (* (map-next m (addr cur) (addr k) (addr v)) -> bool, and the whole of map iteration. Before it there was no way to read a map's keys or its values at all: every other map operation addresses one entry by hashing it, and nothing walked the block. @@ -4163,7 +4160,7 @@ and named_call ctx ~want loc name args = i64 the caller owns and the loop reads as one: (let [cur 0 k 0 v 0] - (while (map-next! m (addr cur) (addr k) (addr v)) + (while (map-next m (addr cur) (addr k) (addr v)) ...)) It is *not* a generic (map-keys m): a Vec of them needs a signature naming @@ -4173,12 +4170,12 @@ and named_call ctx ~want loc name args = No hash and no equality pair go with it — walking asks nothing about a key — so this is the one map entry point whose signature carries neither, and the sizes are still needed because the runtime is type-erased. *) - | "map-next!" -> + | "map-next" -> arity loc name 4 args; (match args with | [ target; cur; k; v ] -> let target = check ctx target in - let kt, vt = map_kv loc "map-next!" target.Tast.ty in + let kt, vt = map_kv loc "map-next" target.Tast.ty in let cur = check ctx ~want:(Types.Ptr (Types.Int Types.I64)) cur in let k = check ctx ~want:(Types.Ptr kt) k in let v = check ctx ~want:(Types.Ptr vt) v in @@ -4549,9 +4546,9 @@ and named_call ctx ~want loc name args = same trust [declare-c] already extends, written at the one site where somebody had to know the answer anyway. - No marker on the name. A [!] in this language means *mutates* - ([map-next!]) and a [?] means *asks* ([font-valid?]), and this does - neither; [zeroed], the nearest neighbour — a value conjured rather than + No marker on the name. A [?] in this language means *asks* + ([font-valid?]), and this does not ask; [zeroed], the nearest + neighbour — a value conjured rather than derived — carries no marker either. [ptr] is the marker: a (Ptr T) only ever arrives from a [declare-c], so the word already names the C boundary, and a reader who sees it has already been told where the promise comes @@ -4732,7 +4729,7 @@ and named_call ctx ~want loc name args = call site these can be refused at. They are deferred and then always succeed. That is the cheapest possible membership. - The map operations — [put], [get], [has-key?], [map-remove!], [reserve], [clone], + The map operations — [put], [get], [has-key?], [map-remove], [reserve], [clone], through [deferred_key] beside [key_fns] — are the other kind, and they are here on a different argument. They *can* fail at a concrete type, so deferring them does move a refusal. But [{:where (hashable? $t)}] is @@ -4962,7 +4959,7 @@ and generic_call ctx ~want loc name vars pats pret args = generic call site is weaker than at a monomorphic one. A variable already bound by an earlier argument is substituted back into - the parameters still to come, so [(sort-by! (slice ns 0 4) (fn [a b] (< a + the parameters still to come, so [(sort-by (slice ns 0 4) (fn [a b] (< a b)))] works: by the time the [fn] is reached, [(Fn [$t $t] bool)] has become [(Fn [i32 i32] bool)] and the literal has the position it needs to take its types from. Left to right, which is the order Odin's operands @@ -4995,7 +4992,7 @@ and generic_call ctx ~want loc name vars pats pret args = let cret = subst_ty !subst pret in if List.exists generic_ty cparams || generic_ty cret then begin (* One generic function calling another at its *own* variable, seen from - the abstract pass over the caller's body — [sort-by!] calling [swap!] + the abstract pass over the caller's body — [sort-by] calling [swap] at [t]. There is no copy to make yet: [t] is not a type. The node is built so the call still type-checks and is thrown away with the rest of the abstract pass; the real copy is generated when the caller is @@ -5004,7 +5001,7 @@ and generic_call ctx ~want loc name vars pats pret args = But the callee's [where] clause is answerable here, and has to be. The whole promise of the abstract pass is that a generic's refusals arrive at its definition; if the predicate were left to the instantiation, - [(defn f [x $t] () (sort! [x]))] would be accepted at its definition + [(defn f [x $t] () (sort [x]))] would be accepted at its definition and refused at whichever call site first instantiated it — a refusal in code the caller did not write, which is the thing the pass exists to avoid. So the caller has to declare at least what the callee asks for, @@ -5313,12 +5310,12 @@ let builtins : (string * string * string) list = "The value at the key, or None. Nothing signals here — a lookup that \ finds nothing is an answer — and the value comes back as a copy of \ its bytes."); - ("map-remove!", "map-remove! [(Map K V) K] (Option V)", + ("map-remove", "map-remove [(Map K V) K] (Option V)", "Removes the entry and answers the value it held, or None if there was \ none."); - ("map-next!", "map-next! [(Map K V) (Ptr i64) (Ptr K) (Ptr V)] bool", + ("map-next", "map-next [(Map K V) (Ptr i64) (Ptr K) (Ptr V)] bool", "Walks the map one entry per call through a cursor the caller owns, and \ - is the whole of map iteration: (while (map-next! m (addr cur) (addr k) \ + is the whole of map iteration: (while (map-next m (addr cur) (addr k) \ (addr v)) ...)."); ("has-key?", "has-key? [(Map K V) K] bool", "Whether the key is present, copying no value — the form a condition \ @@ -6569,8 +6566,8 @@ let instantiations env gname = | Some l -> List.rev_map (fun (_, _, sym) -> sym) !l (* The generic a symbol came from, and the types it was asked for — [None] for - an ordinary function. What a refusal about [sort!-i32] needs in order to - say which line the programmer should look at, since [sort!-i32] appears + an ordinary function. What a refusal about [sort-i32] needs in order to + say which line the programmer should look at, since [sort-i32] appears nowhere in the source. *) let instantiation_origin env sym = Hashtbl.fold diff --git a/lib/js.ml b/lib/js.ml index d828e63..c2c8922 100644 --- a/lib/js.ml +++ b/lib/js.ml @@ -170,8 +170,8 @@ let at loc fmt = (* ── Names ────────────────────────────────────────────────────────── - A Flan name is not a JS identifier: [rand-u32], [bytes=?], [append!] and - [fn/sort-bytes!/0] are all ordinary. The rule below is injective, which is + A Flan name is not a JS identifier: [rand-u32], [bytes=?], [append] and + [fn/sort-bytes/0] are all ordinary. The rule below is injective, which is what matters — two Flan names must never land on one JS name — and readable second: [-] is the common case and becomes [_], so [rand-u32] reads as [rand_u32], and an underscore that was actually written becomes [$_] so diff --git a/lib/parse.ml b/lib/parse.ml index 2569ec6..b1007c8 100644 --- a/lib/parse.ml +++ b/lib/parse.ml @@ -112,7 +112,7 @@ let rec fields (f : Form.t) (items : Form.t list) : Ast.field list = (Form.to_string odd) (* ── The constraint map at the head of a defn body ────────────────────── - [(defn sort! [s [$t]] () {:where (ordered? $t)} body ...)]. Clojure's + [(defn sort [s [$t]] () {:where (ordered? $t)} body ...)]. Clojure's [{:pre [...] :post [...]}] is the precedent and the reason it is a map rather than a bare keyword: it leaves room for further keys without new syntax. diff --git a/lib/prelude.ml b/lib/prelude.ml index ea4c42b..95b5759 100644 --- a/lib/prelude.ml +++ b/lib/prelude.ml @@ -219,7 +219,7 @@ let source = {flan| ;; ;; What used to be a copy per element type. A [$t] binds a type variable in ;; the signature and every call site instantiates the body at the types it -;; passes, so [(sort! xs)] over a [i32] and over a [f32] are two emitted +;; passes, so [(sort xs)] over a [i32] and over a [f32] are two emitted ;; bodies from one written one. ;; ;; **Two things in the signatures are not decoration.** @@ -243,22 +243,22 @@ let source = {flan| ;; widen their element into [i64] and [f64]; "the wider type $t accumulates ;; into" is a type-level function, which is a constraint system of a different ;; kind, and a generic [sum] that took its accumulator and its [+] would just -;; be [reduce]. [append-i64!] and [append-f64!] are two different primitives. -;; [sort-bytes!] needs [bytes j 0) (> (at s (- j 1)) (at s j))) - (swap! s (- j 1) j) + (swap s (- j 1) j) (set j (- j 1)))) (set i (+ i 1))))) @@ -291,7 +291,7 @@ let source = {flan| ;; (fn [a b] (< a b)) is ascending and reversing it is descending — and a ;; caller wanting a key rather than an order writes the comparison. ;; -;; It is stable exactly as sort! is: the loop stops the moment before? says +;; It is stable exactly as sort is: the loop stops the moment before? says ;; no, so equal elements never swap past each other. A before? that is not a ;; strict weak ordering — one answering true for both (a b) and (b a) — is the ;; caller's mistake and shows up as an order, not as a loop: the inner while @@ -301,12 +301,12 @@ let source = {flan| ;; comparison it is given. It is the shape every generic had to take before ;; predicates existed, and it stays because passing a comparison is a real ;; thing to want and not only a workaround. -(defn sort-by! [s [$t] before? (Fn [$t $t] bool)] () +(defn sort-by [s [$t] before? (Fn [$t $t] bool)] () (let [i 1] (while (< i (len s)) (let [j i] (while (and (> j 0) (before? (at s j) (at s (- j 1)))) - (swap! s (- j 1) j) + (swap s (- j 1) j) (set j (- j 1)))) (set i (+ i 1))))) @@ -359,7 +359,7 @@ let source = {flan| ;; ;; **Neither takes a {:where}, and that is a decision rather than an ;; oversight.** A predicate buys an *operation* on the variable — [ordered?] -;; is what lets sort! write `<` — and these perform no operation on their +;; is what lets sort write `<` — and these perform no operation on their ;; payload at all: they move it out of the Option, or they look at the tag and ;; never touch the payload. That is the one move [ident] in ;; test/programs/generics.flan makes, which needs nothing declared, so these @@ -377,7 +377,7 @@ let source = {flan| ;; ordinary path. Whether an empty Option is an error is the ;; *caller's* question, and the caller has handler-bind if ;; the answer is yes. -;; a lazy or-else Would need a (Fn [] $t) — sort-by!'s shape, available the +;; a lazy or-else Would need a (Fn [] $t) — sort-by's shape, available the ;; day something wants it. A macro would get laziness for ;; free and need no generics, and costs more than it buys ;; here: a prelude macro drops every prelude defn that @@ -411,12 +411,12 @@ let source = {flan| (defn some? [o (Option $t)] bool (match o (Some _v) true None false)) -;; map! writes back into the slice it was handed, for the same reason sort! +;; map-in-place writes back into the slice it was handed, for the same reason sort ;; does — a slice is non-owning, and transforming a thing you already own ;; should not allocate. A map that produces a *different* element type is not ;; here: it is two type variables and a second signature, and nothing has ;; wanted it. -(defn map! [s [$t] f (Fn [$t] $t)] () +(defn map-in-place [s [$t] f (Fn [$t] $t)] () (dotimes [i (len s)] (set (at s i) (f (at s i))))) @@ -1248,7 +1248,7 @@ let source = {flan| ;; replacement character and reports success; the caller then finds three ;; bytes of U+FFFD in its buffer and no indication that it asked for something ;; else. Nothing is written at all when this answers None. -(defn encode-rune! [dst [u8] code i32] (Option i32) +(defn encode-rune [dst [u8] code i32] (Option i32) (match (rune-size code) None None (Some w) @@ -1295,7 +1295,7 @@ let source = {flan| (defn split-on-byte [s [u8] sep u8] Split (Split {.rest s .sep sep .more true})) -(defn split-next! [it (Ptr Split)] (Option [u8]) +(defn split-next [it (Ptr Split)] (Option [u8]) (when (not (.more it)) (return None)) (match (index-of (.rest it) (.sep it)) @@ -1320,7 +1320,7 @@ let source = {flan| ;; saying why rather than shipping it. A string ;; literal is emitted `private unnamed_addr constant` (emit.ml), so (bytes ;; "Hello") is a [u8] pointing straight into read-only memory. An in-place -;; lower-ascii! type checks against that slice, and what happens next depends +;; lower-ascii type checks against that slice, and what happens next depends ;; on the optimiser — which is the worst of the available answers. Measured, ;; with (set (at (bytes "Hi") 0) \h): ;; @@ -1384,20 +1384,20 @@ let source = {flan| (return (< (at a i) (at b i))))) (< (len a) (len b)))) -;; sort-by! with the comparison written in, over the same in-place contract: +;; sort-by with the comparison written in, over the same in-place contract: ;; the *slices* move, never the bytes they point at, so this sorts a [[u8]] of ;; fields borrowed from one buffer without touching the buffer. Stable, and ;; here that is observable — two equal fields are two distinct slices of ;; different parts of the input, and a caller can see which one came first. ;; -;; It keeps a name of its own rather than collapsing into sort!, and the +;; It keeps a name of its own rather than collapsing into sort, and the ;; reason is the point of the predicates: a [u8] is not ordered? and cannot ;; be, because < is defined on machine numbers and comparing two slices ;; lexicographically is a loop and not an instruction. bytesbytes n))) +(defn append-i64 [b (Ptr (Vec u8)) n i64] () + (append b (i64->bytes n))) -(defn append-f64! [b (Ptr (Vec u8)) x f64] () - (append! b (f64->bytes x))) +(defn append-f64 [b (Ptr (Vec u8)) x f64] () + (append b (f64->bytes x))) ;; concat and join. Both take a slice of slices, which is the shape a caller ;; already has: an array literal of them, [(bytes "a") (bytes b)], slices to a @@ -1462,7 +1462,7 @@ let source = {flan| (defn concat [parts [[u8]]] (Vec u8) (let [b (vec-new u8)] (dotimes [i (len parts)] - (append! (addr b) (at parts i))) + (append (addr b) (at parts i))) b)) ;; n parts yield n-1 separators, and the empty slice of parts yields the empty @@ -1473,14 +1473,14 @@ let source = {flan| (let [b (vec-new u8)] (dotimes [i (len parts)] (when (> i 0) - (append! (addr b) sep)) - (append! (addr b) (at parts i))) + (append (addr b) sep)) + (append (addr b) (at parts i))) b)) (defn repeat-bytes [s [u8] n i32] (Vec u8) (let [b (vec-new u8)] (dotimes [i n] - (append! (addr b) s)) + (append (addr b) s)) b)) ;; The allocating halves of the ASCII case pair. The note above lower-ascii @@ -1517,17 +1517,17 @@ let source = {flan| (let [b (vec-new u8) i 0] (if (= (len from) 0) - (append! (addr b) s) + (append (addr b) s) (while (< i (len s)) (match (index-of-bytes (slice s i (len s)) from) (Some k) (do - (append! (addr b) (slice s i (+ i k))) - (append! (addr b) to) + (append (addr b) (slice s i (+ i k))) + (append (addr b) to) (set i (+ i k (len from)))) None (do - (append! (addr b) (slice s i (len s))) + (append (addr b) (slice s i (len s))) (set i (len s)))))) b)) @@ -1554,7 +1554,7 @@ let source = {flan| it (split-on-byte s sep) going true] (while going - (match (split-next! (addr it)) + (match (split-next (addr it)) (Some f) (push v f) None (set going false))) v)) @@ -1572,7 +1572,7 @@ let source = {flan| ;; This returns a Vec, so neither problem is inherited. It uses i64->bytes ;; twice and the two calls are strictly sequential — the integer part is copied ;; into the Vec before the fraction is rendered — which is the discipline the -;; shared buffer requires and the one append-i64! exists to make automatic. +;; shared buffer requires and the one append-i64 exists to make automatic. ;; ;; Half away from zero, the same rule round-f32 follows, applied at the last ;; digit kept. That is not bit-for-bit printf: printf rounds the *binary* value @@ -1610,16 +1610,16 @@ let source = {flan| p (clamp prec 0 9)] (cond (not (= x x)) - (append! (addr b) (bytes "nan")) + (append (addr b) (bytes "nan")) (and (= x (* x 2.0)) (!= x 0.0)) - (append! (addr b) (bytes (if (< x 0.0) "-inf" "inf"))) + (append (addr b) (bytes (if (< x 0.0) "-inf" "inf"))) :else (let [neg (< x 0.0) m (if neg (- 0.0 x) x)] (if (>= m 9.0e18) - (append! (addr b) (f64->bytes x)) + (append (addr b) (f64->bytes x)) (let [scale (i64 1)] (dotimes [i p] (set scale (* scale 10))) @@ -1642,7 +1642,7 @@ let source = {flan| ;; i64->bytes of 0 has no sign to carry. (when neg (push b \-)) - (append-i64! (addr b) ip) + (append-i64 (addr b) ip) (when (> p 0) (push b \.) ;; Left-padded with zeros to exactly p digits. fr is under @@ -1651,7 +1651,7 @@ let source = {flan| (let [d (i64->bytes fr)] (dotimes [i (- p (len d))] (push b \0)) - (append! (addr b) d)))))))) + (append (addr b) d)))))))) b)) ;; ── Still refused, and what the reason is now ───────────────────────── @@ -1676,8 +1676,8 @@ let source = {flan| ;; allocation one. format-f64 above is the piece of it ;; that was actually wanted, and `print`/`println` are ;; already the structural walk over any one value. -;; map that changes the Generics, and only that. map!, filter, reduce and -;; element type sort-by! landed the day function values did — see +;; map that changes the Generics, and only that. map-in-place, filter, reduce and +;; element type sort-by landed the day function values did — see ;; "The ones that take a function" above — at i32 and ;; f32, the two element types the rest of that family ;; covers. A map from [i32] to [f32] is the one shape @@ -1686,7 +1686,7 @@ let source = {flan| ;; which is where a per-type family stops being honest. ;; map-keys, map-values Generics — and the reason changed, which is the ;; point of naming them separately. It used to be the -;; missing Map iterator; `map-next!` is that iterator +;; missing Map iterator; `map-next` is that iterator ;; and walking a map is expressible now. What a defn ;; still cannot say is (defn map-keys [m {K V}] (Vec K)): ;; a prelude function has to name its types, and there @@ -1699,7 +1699,7 @@ let source = {flan| ;; already has push, so the struct would be a move-only ;; wrapper whose only method is the one it wraps. What ;; was missing was appending a run of bytes, and -;; `append!` above is that. +;; `append` above is that. ;; ── Files: embedding, slurp and barf ────────────────────────────────── ;; ;; One entry per file in an (embed-dir "...") — Odin's Load_Directory_File diff --git a/lib/session.ml b/lib/session.ml index abff502..230158c 100644 --- a/lib/session.ml +++ b/lib/session.ml @@ -206,11 +206,11 @@ let compatible ?(origin = fun _ -> None) ~loc (old_ : Tast.program) plan.org, Hot reload, and open decision #6. *) if not same then (* ── When the name is not one the programmer wrote ────────────── - A generic's instantiations are named [sort!-i32], [sort!-f32] + A generic's instantiations are named [sort-i32], [sort-f32] and so on, and the mangling carries only the *type variables* — so editing the generic's other parameters changes every copy's signature at once, under the same names. The refusal then - arrives about [sort!-i32], which appears nowhere in the file + arrives about [sort-i32], which appears nowhere in the file being edited, for a reason invisible at the edited line. So the refusal says where the name came from: which generic, at diff --git a/plan.org b/plan.org index 84c6f41..d94df05 100644 --- a/plan.org +++ b/plan.org @@ -230,7 +230,7 @@ and on a managed ~class~ instance. An ordinary ~struct~ never carries one. return type, or nested as ~[$t]~ or ~(Vec $t)~ — and bare ~t~ wherever a type's *name* is an argument in expression position: ~(vec-new t)~, ~(map-new t i32)~, ~(pool-new t)~, and the cast ~(t x)~. This is what makes - ~map!~/~filter~/~reduce~ and the monomorphic containers work; it collapsed the + ~map-in-place~/~filter~/~reduce~ and the monomorphic containers work; it collapsed the prelude's per-type families into one function each. A generic body is checked *abstractly*, with nothing substituted, so ~=~, ~<~, ~+~ and ~hash~ over an unconstrained variable are rejected at the definition @@ -243,7 +243,7 @@ and on a managed ~class~ instance. An ordinary ~struct~ never carries one. the head of the body — ~{:where (ordered? $t)}~, or a vector for more than one, ~{:where [(copyable? $t) (copyable? $u)]}~ — on the precedent of Clojure's ~{:pre ... :post ...}~, and because a bare ~{}~ in expression position is - already refused so nothing else it could be. ~sort!~ declares ~ordered?~ of its + already refused so nothing else it could be. ~sort~ declares ~ordered?~ of its variable, the abstract pass then allows ~<~ in the body, and each instantiation checks the concrete type satisfies the predicate and refuses the call site if it does not. There are *five* predicates — ~ordered?~, ~equal?~, ~hashable?~, diff --git a/runtime/flan_rt.c b/runtime/flan_rt.c index d1a7e5d..53b4bfc 100644 --- a/runtime/flan_rt.c +++ b/runtime/flan_rt.c @@ -975,7 +975,7 @@ struct flan_allocator { * * Every size this file computes is a signed 64-bit count of bytes, and every * one of them is a product or a sum of numbers a Flan program chose: a - * capacity from (vec-reserve!), an element size from the checker. Signed + * capacity from (reserve), an element size from the checker. Signed * overflow is undefined, and the defined-in-practice outcome is worse than * the undefined one — a product that wraps to a small positive allocates a * block that fits while the container records the unwrapped capacity, and the @@ -1566,7 +1566,7 @@ static int8_t flan_vec_grow(flan_vec *v, int64_t want, int64_t size, if (cap > (int64_t)1 << 40) { cap = want; break; } cap *= 2; } - /* [want] arrives from (vec-reserve!) unfiltered, and the doubling loop above + /* [want] arrives from (reserve) unfiltered, and the doubling loop above * hands a want past 1<<40 straight through as the capacity, so this product * is the one the program picked times the one the checker did. See the note * on flan_mul_bytes. */ diff --git a/spec-memory.md b/spec-memory.md index e3dfa8d..5345170 100644 --- a/spec-memory.md +++ b/spec-memory.md @@ -263,7 +263,7 @@ move concept it opted out of.) plan.org's Types section has the full account. ``` -(defn sort! [s [$t]] () +(defn sort [s [$t]] () {:where (ordered? $t)} ...) ``` diff --git a/test/programs/algorithms.flan b/test/programs/algorithms.flan index 847a055..052cdc9 100644 --- a/test/programs/algorithms.flan +++ b/test/programs/algorithms.flan @@ -1,6 +1,6 @@ ;;;; The slice family at its second and third element types. ;;;; -;;;; sort! was the only sort in the language. These are the other two, and +;;;; sort was the only sort in the language. These are the other two, and ;;;; they are copies rather than an abstraction: map, filter, reduce and a sort ;;;; taking a comparator all need a *function value*, which check.ml refuses ;;;; with "a function type is not implemented yet -- milestone 5". So the @@ -22,41 +22,41 @@ (defn main [] i32 ;; Every float literal is cast. A literal defaults to f64 and an array ;; literal has no context to say otherwise -- a let has no type annotation -- - ;; so [3.5 -1.0] is an [f64] and (sort!) refuses it by type. The cast is + ;; so [3.5 -1.0] is an [f64] and (sort) refuses it by type. The cast is ;; the only spelling available today. ;; - ;; sort!: duplicates, negatives, a zero and an odd length, which is the + ;; sort: duplicates, negatives, a zero and an odd length, which is the ;; input shape the i32 sort is tested on for the same reasons. (let [xs [(f32 3.5) (f32 -1.0) (f32 0.0) (f32 3.5) (f32 -2.25) (f32 10.0) (f32 0.5)]] - (sort! (slice xs 0 7)) + (sort (slice xs 0 7)) (show-f32 (slice xs 0 7))) ; -2.25 -1 0 0.5 3.5 3.5 10 ;; In place and ptr+len: sorting a subslice leaves its neighbours alone. That ;; is the whole content of the in-place claim, and a version that copied ;; would pass every test above and fail this one. (let [xs [(f32 9.0) (f32 4.0) (f32 3.0) (f32 2.0) (f32 1.0) (f32 9.0)]] - (sort! (slice xs 1 5)) + (sort (slice xs 1 5)) (show-f32 (slice xs 0 6))) ; 9 1 2 3 4 9 ;; Already sorted, reverse sorted, and a single element -- the three inputs ;; where an insertion loop with the comparison the wrong way round still ;; looks plausible. (let [xs [(f32 1.0) (f32 2.0) (f32 3.0)]] - (sort! (slice xs 0 3)) + (sort (slice xs 0 3)) (show-f32 (slice xs 0 3))) ; 1 2 3 (let [xs [(f32 3.0) (f32 2.0) (f32 1.0)]] - (sort! (slice xs 0 3)) + (sort (slice xs 0 3)) (show-f32 (slice xs 0 3))) ; 1 2 3 (let [xs [(f32 7.0)]] - (sort! (slice xs 0 1)) + (sort (slice xs 0 1)) (show-f32 (slice xs 0 1))) ; 7 ;; The empty slice must not read (at s -1). (let [xs [(f32 7.0)]] - (sort! (slice xs 0 0)) + (sort (slice xs 0 0)) (show-f32 (slice xs 0 0))) ; (let [xs [(f32 1.0) (f32 2.0) (f32 3.0) (f32 4.0)]] - (reverse! (slice xs 0 4)) + (reverse (slice xs 0 4)) (show-f32 (slice xs 0 4))) ; 4 3 2 1 ;; min, max and sum. The empty slice is None for the first two -- there is no @@ -102,17 +102,17 @@ (print (bytes j 0) (before? (at xs j) (at xs (- j 1)))) - (swap! xs j (- j 1)) + (swap xs j (- j 1)) (set j (- j 1)))))) (defn ascending [a i32 b i32] bool (< a b)) @@ -62,7 +62,7 @@ (defn main [] i32 (let [xs [1 2 3 4]] ;; A name in value position, passed down. - (each! (slice xs 0 4) double) + (each (slice xs 0 4) double) (print (at xs 0)) (print " ") (print (at xs 3)) (println "") ;; 2 + 4 + 6 + 8 negated (println (fold (slice xs 0 4) negate)) @@ -75,12 +75,12 @@ ;; A comparator, and the same slice sorted both ways. (let [ys [3 1 4 1 5 9 2 6] s (slice ys 0 8)] - (insertion-by! s ascending) + (insertion-by s ascending) (print (at s 0)) (print " ") (print (at s 7)) (println "") - (insertion-by! s descending) + (insertion-by s descending) (print (at s 0)) (print " ") (print (at s 7)) (println "") ;; A returned function value, and a computed head calling it. - (insertion-by! s (pick true)) + (insertion-by s (pick true)) (print (at s 0)) (println "") (println ((pick false) 1 2))) diff --git a/test/programs/format.flan b/test/programs/format.flan index 4fac218..5005c41 100644 --- a/test/programs/format.flan +++ b/test/programs/format.flan @@ -87,13 +87,13 @@ ;; needs the integer part copied out before the fraction is rendered, because ;; both come through the runtime's one shared scratch buffer. (let [b (vec-new u8)] - (append! (addr b) (bytes "fps ")) + (append (addr b) (bytes "fps ")) (let [f (format-f64 59.94 1)] - (append! (addr b) (as-slice f)) + (append (addr b) (as-slice f)) (free f)) - (append! (addr b) (bytes " / frame ")) + (append (addr b) (bytes " / frame ")) (let [f (format-f64 0.0166667 4)] - (append! (addr b) (as-slice f)) + (append (addr b) (as-slice f)) (free f)) (println (string (as-slice b))) ; fps 59.9 / frame 0.0167 (free b)) diff --git a/test/programs/generics.flan b/test/programs/generics.flan index 7fb2f1c..87ed185 100644 --- a/test/programs/generics.flan +++ b/test/programs/generics.flan @@ -25,11 +25,11 @@ (defn first-or [s [$t] d $t] $t (if (= (len s) 0) d (at s 0))) -;; A generic calling a generic at its own variable: the copy of [swap!] is -;; generated when [rotate!] is instantiated and not before. -(defn rotate! [s [$t]] () +;; A generic calling a generic at its own variable: the copy of [swap] is +;; generated when [rotate] is instantiated and not before. +(defn rotate [s [$t]] () (dotimes [i (- (len s) 1)] - (swap! s i (+ i 1)))) + (swap s i (+ i 1)))) ;; numeric? admits + - * / %. (defn twice [x $t] $t @@ -121,7 +121,7 @@ fs [2.5 0.5 1.5]] (println (first-or (slice ns 0 4) -1)) (println (first-or (slice ns 0 0) -1)) - (rotate! (slice ns 0 4)) + (rotate (slice ns 0 4)) (println (at ns 3)) (println (twice 21)) @@ -136,13 +136,13 @@ (show "text") ;; The collapsed prelude family, at both element types. - (sort! (slice ns 0 4)) + (sort (slice ns 0 4)) (println (at ns 0)) - (sort-by! (slice fs 0 3) (fn [a b] (> a b))) + (sort-by (slice fs 0 3) (fn [a b] (> a b))) (println (at fs 0)) - (reverse! (slice ns 0 4)) + (reverse (slice ns 0 4)) (println (at ns 0)) - (map! (slice ns 0 4) (fn [x] (* x 2))) + (map-in-place (slice ns 0 4) (fn [x] (* x 2))) (println (reduce (slice ns 0 4) 0 (fn [a b] (+ a b)))) (match (min-of (slice ns 0 4)) (Some m) (println m) _ (println -1)) (match (max-of (slice fs 0 3)) (Some m) (println m) _ (println -1.0)) diff --git a/test/programs/higher-order.flan b/test/programs/higher-order.flan index e0cea10..6d64cd2 100644 --- a/test/programs/higher-order.flan +++ b/test/programs/higher-order.flan @@ -1,4 +1,4 @@ -;; The prelude's function-taking family: map!, filter, reduce and a comparator +;; The prelude's function-taking family: map-in-place, filter, reduce and a comparator ;; sort. These were the four the second tier could not write, and they arrived ;; the day function values did — so what this checks is that they are ordinary ;; prelude functions, called the ordinary way, with the function passed by @@ -12,10 +12,10 @@ (defn big? [x f32] bool (> x 1.0)) (defn main [] i32 - ;; map! writes back into the slice it was handed. + ;; map-in-place writes back into the slice it was handed. (let [xs [1 2 3 4] s (slice xs 0 4)] - (map! s triple) + (map-in-place s triple) (print (at s 0)) (print " ") (print (at s 3)) (println "") ;; reduce, with the accumulator first in the step. The prelude's own @@ -30,21 +30,21 @@ (free v)) ;; A comparator sort, both directions off the same slice. - (sort-by! s longer-first) + (sort-by s longer-first) (print (at s 0)) (print " ") (print (at s 3)) (println "") - (sort-by! s (fn [a b] (< a b))) + (sort-by s (fn [a b] (< a b))) (print (at s 0)) (print " ") (print (at s 3)) (println "")) ;; The f32 half of the family, which is the same code at the other element ;; type — the copy that generics would remove. (let [ys [(f32 4.0) (f32 1.0) (f32 8.0) (f32 2.0)] t (slice ys 0 4)] - (map! t halve) + (map-in-place t halve) (print (at t 0)) (print " ") (print (at t 2)) (println "") (print (reduce t 0.0 (fn [a b] (+ a b)))) (println "") (let [w (filter t big?)] (print (len w)) (println "") (free w)) - (sort-by! t (fn [a b] (> a b))) + (sort-by t (fn [a b] (> a b))) (print (at t 0)) (print " ") (print (at t 3)) (println "")) 0) diff --git a/test/programs/json.flan b/test/programs/json.flan index 8b51ac6..b171568 100644 --- a/test/programs/json.flan +++ b/test/programs/json.flan @@ -208,7 +208,7 @@ (dotimes [i (len items)] (set n (+ n (count-leaves (at items i))))) n) - ;; map-next! fills an out-parameter with a copy of the value's bytes, which + ;; map-next fills an out-parameter with a copy of the value's bytes, which ;; for a Value holding a container is a second header over the same block. ;; In a region that is an alias and not a second owner, so walking a map is ;; the ordinary iteration and needs no accessor of its own. @@ -217,7 +217,7 @@ cur (i64 0) k "" e Value.Null] - (while (map-next! entries (addr cur) (addr k) (addr e)) + (while (map-next entries (addr cur) (addr k) (addr e)) (set n (+ n (count-leaves e)))) n) _ 1)) @@ -347,7 +347,7 @@ ;; Strings: the escape grammar, and the two surrogate halves. A lone ;; surrogate is refused because rune-size answers None for the whole - ;; D800-DFFF block, so encode-rune! would write nothing and the character + ;; D800-DFFF block, so encode-rune would write nothing and the character ;; would vanish — the refusal is forced by the prelude rather than chosen. (refusal "\"a\\vb\"") ; \v is JSON5's (refusal "\"a\\x41b\"") ; so is \x @@ -405,7 +405,7 @@ ;; two lifetimes have to be separable for the scribble below to mean ;; anything. (let [buf (vec-new u8)] - (append! (addr buf) (bytes doc)) + (append (addr buf) (bytes doc)) (with-allocator frame (let [v (read-doc (as-slice buf))] (println (describe v)) ; object diff --git a/test/programs/map-iter.flan b/test/programs/map-iter.flan index 9b69829..913b18e 100644 --- a/test/programs/map-iter.flan +++ b/test/programs/map-iter.flan @@ -19,7 +19,7 @@ keys 0 vals 0 n 0] - (while (map-next! m (addr cur) (addr k) (addr v)) + (while (map-next m (addr cur) (addr k) (addr v)) (set keys (+ keys k)) (set vals (+ vals v)) (set n (+ n 1))) @@ -35,12 +35,12 @@ k 0 v 0 n 0] - (while (map-next! m (addr cur) (addr k) (addr v)) + (while (map-next m (addr cur) (addr k) (addr v)) (set n (+ n 1))) (print "never allocated: ") (print n) (println "") (reserve m 64) (set cur (i64 0)) - (while (map-next! m (addr cur) (addr k) (addr v)) + (while (map-next m (addr cur) (addr k) (addr v)) (set n (+ n 1))) (print "allocated and empty: ") (print n) (println "") (free m))) @@ -52,9 +52,9 @@ (put m 5 50) (put m 6 60) (let [cur (i64 0) k 0 v 0 n 0] - (while (map-next! m (addr cur) (addr k) (addr v)) + (while (map-next m (addr cur) (addr k) (addr v)) (set n (+ n 1))) - (while (map-next! m (addr cur) (addr k) (addr v)) + (while (map-next m (addr cur) (addr k) (addr v)) (set n (+ n 1))) (print "spent: ") (print n) (println "")) (free m))) @@ -75,7 +75,7 @@ chars 0 xs 0 ys 0] - (while (map-next! m (addr cur) (addr k) (addr v)) + (while (map-next m (addr cur) (addr k) (addr v)) (set chars (+ chars (len k))) (set xs (+ xs (.x v))) (set ys (+ ys (.y v)))) @@ -94,7 +94,7 @@ v (i64 0) n 0 doubled 0] - (while (map-next! m (addr cur) (addr k) (addr v)) + (while (map-next m (addr cur) (addr k) (addr v)) (set n (+ n 1)) (when (= v (* k 2)) (set doubled (+ doubled 1)))) (print n) (print " ") (print doubled) (print " ") (print (len m)) (println "")) diff --git a/test/programs/map-remove.flan b/test/programs/map-remove.flan index 85223c8..20f2e78 100644 --- a/test/programs/map-remove.flan +++ b/test/programs/map-remove.flan @@ -1,4 +1,4 @@ -;;;; (map-remove! m k) — the operation a Map has been missing. +;;;; (map-remove m k) — the operation a Map has been missing. ;;;; ;;;; Removal is the one map operation that can break the *other* ones: Robin ;;;; Hood lookups stop at the first empty slot, so a hole punched in the middle @@ -19,12 +19,12 @@ (let [m (map-new i32 i64)] (put m 1 100) (put m 2 200) - (match (map-remove! m 1) + (match (map-remove m 1) (Some v) (do (print v) (println "")) ; 100 None (println "missing")) (print (len m)) (println "") ; 1 (print (has-key? m 1)) (println "") ; false - (match (map-remove! m 1) (Some v) (do (print v) (println "")) None (println "gone")) + (match (map-remove m 1) (Some v) (do (print v) (println "")) None (println "gone")) (println (len m)) ; gone, then 1 (free m)) @@ -32,7 +32,7 @@ ;; the block is still there and the slots are empty rather than poisoned. (let [m (map-new i32 i32)] (dotimes [i 64] (put m i i)) - (dotimes [i 64] (map-remove! m i)) + (dotimes [i 64] (map-remove m i)) (print (len m)) (println "") ; 0 (put m 7 77) (match (get m 7) (Some v) (do (print v) (println "")) None (println "?")) ; 77 @@ -49,7 +49,7 @@ (let [taken 0] (dotimes [i 2000] (if (= 0 (% i 2)) - (match (map-remove! m i) + (match (map-remove m i) (Some v) (if (= v (* (i64 i) 3)) (set taken (+ taken 1))) None (set taken taken)))) (print taken) (println "")) ; 1000 @@ -72,7 +72,7 @@ ;; on the removal path too and not only on get's. (let [g (map-new Cell i32)] (dotimes [i 20] (dotimes [j 20] (put g (Cell {.x i .y j}) (+ (* i 100) j)))) - (match (map-remove! g (Cell {.x 7 .y 9})) + (match (map-remove g (Cell {.x 7 .y 9})) (Some v) (do (print v) (println "")) ; 709 None (println "?")) (print (has-key? g (Cell {.x 7 .y 9}))) (println "") ; false @@ -83,7 +83,7 @@ (let [s (map-new string i32)] (put s "alpha" 1) (put s "beta" 2) - (match (map-remove! s "alpha") + (match (map-remove s "alpha") (Some v) (do (print v) (println "")) ; 1 None (println "?")) (print (has-key? s "beta")) (println "") ; true @@ -95,9 +95,9 @@ ;; shift, the same way a put that grows invalidates one. (let [m (map-new i32 i32)] (dotimes [i 100] (put m i i)) - (dotimes [i 100] (if (= 0 (% i 3)) (map-remove! m i))) + (dotimes [i 100] (if (= 0 (% i 3)) (map-remove m i))) (let [cur (i64 0) k 0 v 0 seen 0 sum 0] - (while (map-next! m (addr cur) (addr k) (addr v)) + (while (map-next m (addr cur) (addr k) (addr v)) (set seen (+ seen 1)) (if (not (= k v)) (set sum (+ sum 1)))) (print seen) (println "") ; 66 @@ -113,7 +113,7 @@ (with-allocator ar (let [t (map-new i32 i32)] (dotimes [i 300] (put t i (* i 2))) - (dotimes [i 300] (if (= 0 (% i 2)) (map-remove! t i))) + (dotimes [i 300] (if (= 0 (% i 2)) (map-remove t i))) (print (len t)) (println "") ; 150 (match (get t 299) (Some v) (do (print v) (println "")) None (println "?")) ; 598 (print (has-key? t 298)) (println ""))) ; false diff --git a/test/programs/reload-generic.flan b/test/programs/reload-generic.flan index c3131fb..4a8e083 100644 --- a/test/programs/reload-generic.flan +++ b/test/programs/reload-generic.flan @@ -10,13 +10,13 @@ (defvar counter i64) -(defn put! [xs [$t] i i32 v $t] () +(defn put-at [xs [$t] i i32 v $t] () (set (at xs i) v)) -;;; Calls [put!] at its own variable, so the copy of [put!] is generated when -;;; [hold!] is instantiated and not before. -(defn hold! [xs [$t] v $t] () - (put! xs 0 v)) +;;; Calls [put-at] at its own variable, so the copy of [put-at] is generated when +;;; [hold] is instantiated and not before. +(defn hold [xs [$t] v $t] () + (put-at xs 0 v)) (defn pick [xs [$t]] $t {:where (ordered? $t)} @@ -28,8 +28,8 @@ (defn step [] () (let [ns [5 3 9 1] fs [2.5 0.5 1.5]] - (hold! (slice ns 0 4) 7) - (hold! (slice fs 0 3) 0.25) + (hold (slice ns 0 4) 7) + (hold (slice fs 0 3) 0.25) (set counter (+ counter (i64 (pick (slice ns 0 4))))))) (defn main [] () diff --git a/test/programs/slices.flan b/test/programs/slices.flan index f96ada3..c2a5f57 100644 --- a/test/programs/slices.flan +++ b/test/programs/slices.flan @@ -50,33 +50,33 @@ (println "") ; 99 ;; Reverse of an odd-length slice: the middle element stays put. - (reverse! (slice xs 0 (len xs))) + (reverse (slice xs 0 (len xs))) (show (slice xs 0 (len xs))) ; 7 -3 12 0 5 -3 5 ;; And of a two-element one, the smallest case that can actually move. - (reverse! (slice xs 0 2)) + (reverse (slice xs 0 2)) (show (slice xs 0 (len xs))) ; -3 7 12 0 5 -3 5 (load-xs) - (sort! (slice xs 0 (len xs))) + (sort (slice xs 0 (len xs))) (show (slice xs 0 (len xs))) ; -3 -3 0 5 5 7 12 ;; Reverse-sorted: the case a comparison that never fires would pass. (set (at ys 0) 5) (set (at ys 1) 4) (set (at ys 2) 3) (set (at ys 3) 2) (set (at ys 4) 1) - (sort! (slice ys 0 (len ys))) + (sort (slice ys 0 (len ys))) (show (slice ys 0 (len ys))) ; 1 2 3 4 5 ;; A subslice, with the elements on both sides left alone. (set (at zs 0) 100) (set (at zs 1) 9) (set (at zs 2) -1) (set (at zs 3) 9) (set (at zs 4) 4) (set (at zs 5) 0) (set (at zs 6) 200) (set (at zs 7) 300) - (sort! (slice zs 1 6)) + (sort (slice zs 1 6)) (show (slice zs 0 (len zs))) ; 100 -1 0 4 9 9 200 300 ;; Degenerate lengths must do nothing rather than run off an end. - (sort! (slice zs 0 0)) - (reverse! (slice zs 0 0)) - (sort! (slice zs 2 3)) - (reverse! (slice zs 2 3)) + (sort (slice zs 0 0)) + (reverse (slice zs 0 0)) + (sort (slice zs 2 3)) + (reverse (slice zs 2 3)) (show (slice zs 0 (len zs))) ; 100 -1 0 4 9 9 200 300 0) diff --git a/test/programs/strings.flan b/test/programs/strings.flan index 7e2e989..70d3767 100644 --- a/test/programs/strings.flan +++ b/test/programs/strings.flan @@ -20,12 +20,12 @@ ;; i64->bytes on its own: two of its results cannot be held at once, and ;; these two numbers are both in the answer. (let [b (vec-new u8)] - (append! (addr b) (bytes "x=")) - (append-i64! (addr b) 42) - (append! (addr b) (bytes " y=")) - (append-i64! (addr b) -7) - (append! (addr b) (bytes " r=")) - (append-f64! (addr b) 1.5) + (append (addr b) (bytes "x=")) + (append-i64 (addr b) 42) + (append (addr b) (bytes " y=")) + (append-i64 (addr b) -7) + (append (addr b) (bytes " r=")) + (append-f64 (addr b) 1.5) (show (addr b)) ; x=42 y=-7 r=1.5 (free b)) diff --git a/test/programs/utf8.flan b/test/programs/utf8.flan index 6ad4d8f..a99bcab 100644 --- a/test/programs/utf8.flan +++ b/test/programs/utf8.flan @@ -68,7 +68,7 @@ ;; trip is the only check that catches an encoder and a decoder that are ;; wrong in the same direction — printing the bytes would not. (defn round-trip [code i32] i32 - (match (encode-rune! (slice scratch 0 4) code) + (match (encode-rune (slice scratch 0 4) code) None -1 (Some w) (let [r (decode-rune (slice scratch 0 w))] @@ -82,7 +82,7 @@ (let [it (split-on-byte s sep) going true] (while going - (match (split-next! (addr it)) + (match (split-next (addr it)) (Some f) (do (print "[") (print f) (print "]")) None (set going false))) (print " "))) @@ -181,13 +181,13 @@ (show-i32 (round-trip 0x10ffff)) (println "") - ;; Refused by encode-rune!, and nothing is written when it refuses. - (show-opt (encode-rune! (slice scratch 0 4) 0xd800)) ; -1, surrogate - (show-opt (encode-rune! (slice scratch 0 4) 0x110000)) ; -1, past the end - (show-opt (encode-rune! (slice scratch 0 4) -1)) ; -1, negative - (show-opt (encode-rune! (slice scratch 0 2) 0x65e5)) ; -1, buffer short - (show-opt (encode-rune! (slice scratch 0 0) 0x41)) ; -1, no room at all - (show-opt (encode-rune! (slice scratch 0 1) 0x41)) ; 1, exactly enough + ;; Refused by encode-rune, and nothing is written when it refuses. + (show-opt (encode-rune (slice scratch 0 4) 0xd800)) ; -1, surrogate + (show-opt (encode-rune (slice scratch 0 4) 0x110000)) ; -1, past the end + (show-opt (encode-rune (slice scratch 0 4) -1)) ; -1, negative + (show-opt (encode-rune (slice scratch 0 2) 0x65e5)) ; -1, buffer short + (show-opt (encode-rune (slice scratch 0 0) 0x41)) ; -1, no room at all + (show-opt (encode-rune (slice scratch 0 1) 0x41)) ; 1, exactly enough (println "") ;; "Nothing is written when it refuses" is a claim about the buffer, not @@ -197,9 +197,9 @@ ;; passes. So put a known byte in scratch, ask for an encoding that must be ;; refused, and read the byte back. (show-i32 (round-trip 0x41)) ; 65, scratch[0] = A - (show-opt (encode-rune! (slice scratch 0 2) 0x65e5)) ; -1, needs 3 bytes + (show-opt (encode-rune (slice scratch 0 2) 0x65e5)) ; -1, needs 3 bytes (show-i32 (i32 (at scratch 0))) ; 65 still - (show-opt (encode-rune! (slice scratch 0 4) 0xd800)) ; -1, surrogate + (show-opt (encode-rune (slice scratch 0 4) 0xd800)) ; -1, surrogate (show-i32 (i32 (at scratch 0))) ; 65 still (println "") @@ -224,7 +224,7 @@ total (i64 0) going true] (while going - (match (split-next! (addr it)) + (match (split-next (addr it)) (Some f) (set total (+ total (match (parse-i64 (trim f)) (Some v) v None 0))) None (set going false))) (print total) diff --git a/test/test_acceptance.ml b/test/test_acceptance.ml index 2b1c5e9..78aab49 100644 --- a/test/test_acceptance.ml +++ b/test/test_acceptance.ml @@ -797,7 +797,7 @@ let () = outputs "a number with a precision" "programs/format.flan" format_out; outputs ~opt:"-O0" "a number with a precision, -O0" "programs/format.flan" format_out; - (* The slice family at its second and third element types. sort-i32! was + (* The slice family at its second and third element types. sort-i32 was the only sort in the language; these are copies rather than an abstraction, because map/filter/reduce and a comparator sort all need a function value and check.ml refuses one outright. @@ -2760,9 +2760,9 @@ level "1" and it is named because it is the natural spelling of a set. *) (* Removal is a map's operation and says so, rather than reaching for a [len] that a Vec would also answer. *) - refuses_src "map-remove! wants a map" - "(defn main [] i32 (let [v (vec-new i32)] (map-remove! v 1) (free v)) 0)" - "map-remove! takes a (Map K V)"; + refuses_src "map-remove wants a map" + "(defn main [] i32 (let [v (vec-new i32)] (map-remove v 1) (free v)) 0)" + "map-remove takes a (Map K V)"; refuses_src "a float is not a map key" "(defn f [m (Map f32 i32)] () 0)" "is not a map key"; refuses_src "a Ptr is not a map key" @@ -2860,7 +2860,7 @@ level "1" outputs ~dev:true "function values, dev" "programs/fn-values.flan" fn_values_out; - (* The prelude's four, which is the point of the whole lane: map!, filter, + (* The prelude's four, which is the point of the whole lane: map-in-place, filter, reduce and a comparator sort were blocked on function values and not on generics, so they arrived without generics — and are still one copy per element type, which is the generics half. The f32 rows are that copy. diff --git a/test/test_flan.ml b/test/test_flan.ml index 2719c6c..5d46e1e 100644 --- a/test/test_flan.ml +++ b/test/test_flan.ml @@ -1925,13 +1925,13 @@ let () = let lines, _ = with_config - { Cimport.no_config with Cimport.renames = [ ("set_seed", "seed!") ] } + { Cimport.no_config with Cimport.renames = [ ("set_seed", "seed") ] } in (* The C symbol is kept verbatim, so an override changes the Flan face and nothing else — which is what makes it safe to spell a predicate the way Lisp spells one. *) check "a name override is the Flan name, and the C symbol is untouched" - (List.mem "(declare-c seed! [seed u32] \"set_seed\")" lines); + (List.mem "(declare-c seed [seed u32] \"set_seed\")" lines); (* The collision above is refused because neither Spin2D nor spin2d may take [spin-2d] by an accident of header order. Naming one of them is the way @@ -2696,9 +2696,9 @@ let () = write. *) rejects_check "a predicate is not carried through a generic call" ~needle:"has to be carried by every signature" - "(defn outer [s [$t]] () {:where (equal? $t)} (sort! s))"; + "(defn outer [s [$t]] () {:where (equal? $t)} (sort s))"; accepts "and is accepted when it is" - "(defn outer [s [$t]] () {:where (ordered? $t)} (sort! s))"; + "(defn outer [s [$t]] () {:where (ordered? $t)} (sort s))"; (* A map key that is a type variable has no hash and no equality to emit: they are chosen from the concrete type, which does not exist yet. So the @@ -2719,9 +2719,9 @@ let () = (* And so does the removal, whose placeholder is [get]'s for the same reason: it answers an (Option V), so the match around it still has to check while the key is a variable. *) - accepts "map-remove! over a type-variable key answers an (Option V)" + accepts "map-remove over a type-variable key answers an (Option V)" "(defn f [m (Map $t i32) k $t] i32 {:where (hashable? $t)} \ - (match (map-remove! m k) (Some v) v _ 0))"; + (match (map-remove m k) (Some v) v _ 0))"; accepts "and so do has-key?, reserve and clone" "(defn f [m (Map $t i32) k $t] bool {:where (hashable? $t)} \ (do (reserve m 8) (let [c (clone m)] (free c) (has-key? m k))))"; diff --git a/test/test_session.ml b/test/test_session.ml index fa8688a..8cc38fb 100644 --- a/test/test_session.ml +++ b/test/test_session.ml @@ -801,9 +801,9 @@ let () = (* 1. [C-c C-c] on a generic used to report [installs=false, fns=[]]: it installed nothing and did not say anything had gone wrong. Both copies - have to be named, and the copy of [put!] that [hold!] pulls in has to be + have to be named, and the copy of [put-at] that [hold] pulls in has to be there too, which is transitivity. *) - (match Session.eval (gen ()) "(defn hold! [xs [$t] v $t] () (put! xs 0 v) (put! xs 0 v))" with + (match Session.eval (gen ()) "(defn hold [xs [$t] v $t] () (put-at xs 0 v) (put-at xs 0 v))" with | c -> if not c.Session.installs then fail "redefining a generic installed nothing"; @@ -812,28 +812,28 @@ let () = if not (List.mem want c.Session.fns) then fail "redefining a generic did not install %s; it installed %s" want (String.concat " " c.Session.fns)) - [ "hold!-i32"; "hold!-f64" ]; - (* And only its own copies: [put!] did not change, and its copies are + [ "hold-i32"; "hold-f64" ]; + (* And only its own copies: [put-at] did not change, and its copies are reached through their cells, so reinstalling them would be work with no effect. *) - if List.mem "put!-i32" c.Session.fns then + if List.mem "put-at-i32" c.Session.fns then fail "redefining a generic reinstalled an unchanged generic's copies" | exception Loc.Error { Loc.dmsg = m; _ } -> fail "redefining a generic: %s" m); - (* The callee side of the same rule: redefining [put!] reinstalls the copies - of [put!], which exist only because [hold!] asked for them — the + (* The callee side of the same rule: redefining [put-at] reinstalls the copies + of [put-at], which exist only because [hold] asked for them — the instantiation that generated them was transitive, and finding them again is one table lookup rather than a walk, because a whole-program check has already regenerated all of them. *) - (match Session.eval (gen ()) "(defn put! [xs [$t] i i32 v $t] () (set (at xs i) v))" with + (match Session.eval (gen ()) "(defn put-at [xs [$t] i i32 v $t] () (set (at xs i) v))" with | c -> List.iter (fun want -> if not (List.mem want c.Session.fns) then fail "redefining a called generic did not install %s; it \ installed %s" want (String.concat " " c.Session.fns)) - [ "put!-i32"; "put!-f64" ] + [ "put-at-i32"; "put-at-f64" ] | exception Loc.Error { Loc.dmsg = m; _ } -> fail "redefining a generic: %s" m); @@ -891,20 +891,20 @@ let () = location — a better error than this one and the reason this path is reached less often than it looks. What reaches here is a change every call site still accepts and every *copy* does not: widening the index - from i32 to i64 leaves [(put! xs 0 v)] checking, because the literal - adapts, and changes [put!-i32]'s signature underneath every compiled + from i32 to i64 leaves [(put-at xs 0 v)] checking, because the literal + adapts, and changes [put-at-i32]'s signature underneath every compiled caller. *) (match Session.eval (gen ()) - "(defn put! [xs [$t] i i64 v $t] () \ + "(defn put-at [xs [$t] i i64 v $t] () \ (set (at xs (i32 i)) v))" with | _ -> fail "a generic's changed parameter type was accepted" | exception Loc.Error { Loc.dmsg = m; _ } -> if not (has m "changes signature") then fail "a generic's changed parameter type: %S" m; - if not (has m "the copy of the generic put!") then - fail "the refusal did not say the name came from put!: %S" m; + if not (has m "the copy of the generic put-at") then + fail "the refusal did not say the name came from put-at: %S" m; if not (has m "every copy of it at once") then fail "the refusal did not say every copy changed together: %S" m); diff --git a/vendor/edn/read.flan b/vendor/edn/read.flan index 85e5d68..5acfcf8 100644 --- a/vendor/edn/read.flan +++ b/vendor/edn/read.flan @@ -87,7 +87,7 @@ ;; would be keeping a handle for an operation that never happens. (defn copy-text [s [u8]] string (let [b (vec-new u8)] - (append! (addr b) s) + (append (addr b) s) (string (as-slice b)))) ;; ── Structural equality ───────────────────────────────────────────── @@ -148,7 +148,7 @@ (let [cur (i64 0) k "" v Value.Nil] - (while (map-next! a (addr cur) (addr k) (addr v)) + (while (map-next a (addr cur) (addr k) (addr v)) (match (get b k) (Some w) (when (not (value=? v w)) (return false)) None (return false)))) diff --git a/vendor/json/json.flan b/vendor/json/json.flan index 31152c1..98daa1f 100644 --- a/vendor/json/json.flan +++ b/vendor/json/json.flan @@ -465,7 +465,7 @@ ;; the last place that knows that offset — string-of runs over a literal this ;; has already accepted, and an error out of it would have to point at the ;; token rather than at the backslash. Surrogate PAIRING is checked here too, -;; and not only escape syntax, so that string-of's encode-rune! can never be +;; and not only escape syntax, so that string-of's encode-rune can never be ;; handed a code point the prelude refuses. (defn read-string [c (Ptr Cursor) lo i32] Token (let [s (.src c) @@ -500,7 +500,7 @@ ;; A high surrogate has to be followed by \u and a low one. ;; A low one on its own, or a high one followed by anything ;; else, encodes no character: rune-size answers None for the - ;; whole D800-DFFF block and encode-rune! writes nothing, so + ;; whole D800-DFFF block and encode-rune writes nothing, so ;; the alternative to refusing here is a silently dropped ;; character later. That refusal is forced by the prelude ;; rather than chosen, and it is the reason the pairing rule @@ -703,11 +703,11 @@ (set r (+ 0x10000 (bit-or (<< (- r 0xd800) 10) (- lo2 0xdc00)))))) ;; A four-byte buffer and not a push per byte, because - ;; encode-rune! is the prelude's answer for this and writing + ;; encode-rune is the prelude's answer for this and writing ;; the shifts again here would be a second copy of UTF-8. (let [buf (array 4 u8)] - (match (encode-rune! (slice buf 0 4) r) - (Some w) (append! (addr b) (slice buf 0 w)) + (match (encode-rune (slice buf 0 4) r) + (Some w) (append (addr b) (slice buf 0 w)) ;; Unreachable: read-string refuses every code point ;; rune-size refuses. Written as a no-op rather than a trap ;; because a dropped character is not worth a crash and the diff --git a/web/index.html b/web/index.html index 15637a1..4607389 100644 --- a/web/index.html +++ b/web/index.html @@ -941,7 +941,7 @@ are four predicates, and each gates builtins the compiler already has:

They entail each other in one direction, so one clause usually does: numeric? gives ordered?, and ordered? gives -equal?. A sort! that compares its elements declares +equal?. A sort that compares its elements declares ordered? and nothing else.

Every value copies. There used to be a fifth predicate, @@ -1044,13 +1044,13 @@ over.

- + - + - - - + + + @@ -1062,8 +1062,8 @@ over.

One family, not one per type. The slice algorithms used to be -sort-i32! beside sort-f32! beside sort-bytes!, and -generics collapsed them: sort! is written once and instantiated at whatever +sort-i32 beside sort-f32 beside sort-bytes, and +generics collapsed them: sort is written once and instantiated at whatever element type the call passes. sum-i32 and sum-f32 are what did not collapse, and they are the honest exception — each widens its element into a different accumulator, which one variable cannot express.

GroupNames
slice algorithms, over one type variableswap!, reverse!, sort!, sort-by!, index-of, min-of, max-of, map!, reduce, filter
slice algorithms, over one type variableswap, reverse, sort, sort-by, index-of, min-of, max-of, map-in-place, reduce, filter
the per-type layer that stayssum-i32, sum-f32 — the element and the accumulator are different types, which one variable cannot say
bytesbytes=?, bytes<?, bytes-ci=?, starts-with?, ends-with?, index-of-bytes, trim, digit?, space?, sort-bytes!
bytesbytes=?, bytes<?, bytes-ci=?, starts-with?, ends-with?, index-of-bytes, trim, digit?, space?, sort-bytes
parsingparse-i64, parse-f64
textsplit-on-byte, split-next!, split, lower-ascii, upper-ascii, to-lower, to-upper
building bytesappend!, append-i64!, append-f64!, concat, join, repeat-bytes, replace-bytes, slices-new, format-f64
UTF-8decode-rune, rune-at, rune-count, rune-size, rune-start?, valid-utf8?, encode-rune!
textsplit-on-byte, split-next, split, lower-ascii, upper-ascii, to-lower, to-upper
building bytesappend, append-i64, append-f64, concat, join, repeat-bytes, replace-bytes, slices-new, format-f64
UTF-8decode-rune, rune-at, rune-count, rune-size, rune-start?, valid-utf8?, encode-rune
numberssign-f32, lerp, clamp, floor-f32, ceil-f32, round-f32, abs-i32, abs-i64, the constants pi-f32, pi-f64, tau-f32, tau-f64, and libm through a declare at both widths: sqrt, abs, floor, ceil, round, fmod, sin, cos, tan, asin, acos, atan, atan2, log, log2, log10, exp, pow, hypot, cbrt — each spelled -f32 or -f64
timemonotonic-ns, monotonic-seconds, unix-ns, unix-seconds, sleep-ns, sleep-seconds, and ns-per-second and its two smaller siblings
filesfile-exists? and file-size, which answer a value; slurp, barf, delete-file, rename-file and make-directory, which signal FileError under retry and use-value