From 9f19e748613cb02b2b2cc634806588cd719bdefa Mon Sep 17 00:00:00 2001 From: Reboy2000 Date: Sat, 17 Jan 2026 19:32:06 -0500 Subject: [PATCH 1/4] Added Optimizations and fixed Docs.md --- .DS_Store | Bin 6148 -> 8196 bytes README.md | 2 +- bin/Splice | Bin 52792 -> 35752 bytes bin/spbuild | Bin 52312 -> 35080 bytes build.sh | 6 +- docs.md | 265 ++++++++++++++++++++++++++- examples/.DS_Store | Bin 0 -> 6148 bytes examples/array/array.spc | Bin 194 -> 0 bytes examples/calculator/calc_test.spl | 11 +- examples/calculator/hello.spc | Bin 0 -> 201 bytes examples/forloops/for.spc | Bin 0 -> 65 bytes examples/helloworld/hello.spc | Bin 25 -> 25 bytes release.md | 5 +- splib/math.spl | 119 ------------ src/build.c | 40 +++- src/module_stubs.c | 8 - src/splice.h | 293 +++++++++++++++++++++++------- 17 files changed, 543 insertions(+), 206 deletions(-) create mode 100644 examples/.DS_Store delete mode 100644 examples/array/array.spc create mode 100644 examples/calculator/hello.spc create mode 100644 examples/forloops/for.spc diff --git a/.DS_Store b/.DS_Store index d8f2cf3437ceb394962e6be82952e9ec375cf559..12b0a34c378b88ca43660da743becfe513f8ab51 100644 GIT binary patch literal 8196 zcmeHMO>0v@6g|_VnEFMn3$qcP_^}WPbk%KAlSQGn(5~D_n-7vgk{3)uUB-oixDl5w z{P+cKbStEQfXD{i58^M%EUs9T`gxn=+xaCREuYhBDzC zk1Vce?Z{XY4rLD?%C4;J2}SAEIe(<#P(@=y9~1}*q!o~}dlm&Wv4??oexLuo;`%yq zxm<0>RgUFu=3j4~dGNmE`|Ah#doAbNz=D2CkNsH}EeuihR>#?IoIQbXIc%NVf3|c_ zb4Z~kOlG4zK4!DYph^|GYwfsZGZmVWW#N}@yaO!CW2>G#ns{868yDYwDcsjAZCodw zuuFSAR_eK|mm{kod9_ieUVXF@{9Y2{^2?!tJJ>}BJ;pT9_wnld-|${$xNu8zNX+Tx zxOw%`-6c~EskPl~55jqQ<13fs?|vO?xQ+@ou#HM0i-(CU7O+KR31!@%Ein6fBI0Kv z;y7+o9Z_hPsy3#@%rz4+^F)fOd&z1&^^r)&>+197#gEU|ObvL5NgYf__?kpq0H>*h zS-(cc>xlW>#$?_@7fnB3UAIrYy6rRLS^_22GX>?~p!jeLUVD9RGyfG{48s{2_9Z&t6w{ z1>wj_Y4c~wQ>dgKUA~fAXhDI)tU$()%ggz{GW+}gVNM}%3kn1U{!syyEpL}sIf*@6 zr>2v$cEoFkmo&kRjMX9R1R~@5I8HnMhavAH>nmD2GL{~;|NbGso?*iKU&|l5BdWk} DyVi6l delta 150 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGjUE#6q~50D9i>M0|%s|B;_1r+h6=dYb#P7_L Z`DGkIc7hCL0ntnlOTl8B<9X&V0{}*J8l?aL diff --git a/README.md b/README.md index f2fce41..c681c9b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
- + diff --git a/bin/Splice b/bin/Splice index b486ed3d2b56c2a7ab5748239855d4d69b62753d..1771c515a3be82691aae0de19dd7fa86a1791ca4 100755 GIT binary patch literal 35752 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 literal 52792 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 ZiEsY${+;_@3+(*sgV3i z@ALcpF~jF%@4fcgYpuQ3+UxAc%;w)OfBf}OA`{^gfoC+Hy9N>MCJ8yBad=kYaXN3y zx@G0&mDw8@+W#XO_Xk~5Vmf~UqSNVEd6%PqwP4>}BFP`jBja>d_$s$n1VKi6J2Dh{lG;fw>*-lkdeEWxIGwrPl8Qb7 zjr0!OpwNp{>1pMl0EP_cRrtz1CEHZEk>24O6?#R36$CEpKYCdi?sQg`-0vyLb9zeh zy`tRT9+o8vJwGGk!(}54rAGP7cJ0LDbgsy9WI2~_Sie!Ru3e!+NX5sHngQg8X^+I? zbZ+zZX)QFp4&aK9U1_hDh`XPl6_8$QhyL<)*cJICwGEe9o=_j|=K(xQKXq7sLqBy@ zoYnfNnj7u6R`hvWXnI3gG3rMzmqtgc>l>fzRXa>Z&z`$X*qx%^5COO%o_9X+l2 zM1HmdkB&2_n5UM{)Dg`An8jiJCOkltinM+=#u)HokiQKNe|QY=!??roOvDrFbMzr1 z@Vw^3?Ib)*XLe;p`RpRk*4cSgMR_RmX96CU!?R`mpr1ZH_sH(Wy>D(xKmPA?0h91R zBz#67Xp9hfp}Rrfi)5Ka|3p1eGWy4KI6mk<%r_Gc*C{5rMMRXKERbhoRfW%8oVF|t za(T8Yt*0Xq^r0Vao1&IkU;LSbhwDqf3!aLQ3=a9}eK7L%b5moAuX=|zU*0yXxyw1c z`O7;;G+){bRCCYrNcoc4)PjEOwT!ZNTTJ%uCiA#1tA)yDn#dvGarSNkygtI- z-D#$7u)Sz2oh-i-L9zb9cBR~DmH!b#4LO^r?Q=7=n8^ReGV*741J+?4({dT<7l3nq z@K9=K98B^R!01kD>jK;c+z-rgEq_7%M}S)??n2$S$YCwa$mBL}0hR%r1(0)r+1@=? z@@MzfnwsMq{n=N|2`#Ws>~n)@)Zrl{A2Qn))XtzXe{Zkj%AGX-3T57y95Z2$WwAX# zrqQE2;4+N&WpD4;4)X-aTA%$dpr6y*n^Aj=%CgY!`XTlO*56XuSwbH4tR^ap9Ji)g z>gjcG+bd`*`0SywBZJ6s2(YW5#keOy-}*54qb=hytRA!vnkT$!NBOtlWzSLcbQWzs zFpqC}0kGQb3o|>DmZx;Y*t@N!sKT|Z|0?UorQqEeQ9r)ZN&(ZZnti_nZpRjC>xiN5 z&I$HF)F2vlZUO}?yX^Zcv6ej^=qbuXfiXSQ95;>vo#u%xQE~RnrI6|HnEHc9A$!3I zy4{*cWd)FZ-w=AeV6r_k>NsElDwEL92cf&_h>5Q{%@Ln&y_*~z50ZQqbXZpNNPo5) zGIRoF^(@TfI=1(dfLZK0lfOwH9sq7TY#*u*tJOYO2T?a-P0tMYT7NqxjIOOU3Hv0% z_QH2#Rf2Fg`Thr*r=bp>yH47>D(eoC%nJB+U=P4oIS{q=!8#$!WlAAECoLDak2- z<>+A@k~|GCgueOJ@Y{QSYAR#@IRbeLFeWTdn98y^A7fvTJXuGpOOoT6{v;i2s7)RP zn3Sf2O|!{E0rRKR{NE5|FwKbph2~DsoCtWZAM$e>vuN! z9l&w`TL`}`Hc>2(`KaA=`_eK~nPoXS@IJWssB66Z2*UTCD$kBJQ89b$ChOZG&cH8^ zXMHojYy%%!6520U!!I|(hYmuHRgmL(q&Fjd59tb|mys?*IzGamZAYpf3#lW?an9_| z9&dm@0(djvv4B4UdueT)EH~<|7pv+auRk-iyit%h4e}c4)(yWt-Ey`;MrgX{BK_G3 zpsUHsGHxGA4iDfTU|j0qrvYD${=IL2rw#)?;BOn?j{u$m_!$HIJm68Ff7$?FgT6!o z|91v>3*e_?282CpG@a=$~1O6`z@Y8^w0{*iGINNhIA#jER$DTrM&A_P#4(nU=4}89(me)YeW|T3N8IVs; z6vkQ-wRwPZe+ZmQz@h2XwiAoI-6; zkY{5EoHM}j+kgW)YeL|>0-PL)+St~Jodfp$Md08)(DpFsVBR<&&U3(#Cc_S(gJtP} zIL`tHlf<@Dpo6*OfH+S9r(*(ih<;%{IUvqK;Ixm2et;7Toaf;mm}d`&`#s?1i~~>L zMuoun4sh%V@DJc<@BC=YTh8m|Ej(wr=6#Cy;G;dgW8VXRmg6!~>@CDDM2dNE>}I5x z>&GsHP7q^bHzSQkT8)(7zXy>HM*2L`NTlO|AHi^z1MkrFkZS_wF8X*7YTk7RaHY|q zV-DhGV1hd5x{5jLy^x#duG7&DlmA%GPer~1^VK;>A>T!dHn+w+TAf>;v0a@kTbUPP zb(48h7j$|t1#|Nh%)ytMEEmoq&h*sWjye2on9Fa#oPIs#_O~`)^{#6^H+5|>=KONI z+4;7D&yabZ{{Wu9V6NYVdhX*{-?u+?h8TV}rY#0mMc4F>K9$(j= z(1zz*ofG_lh6hNljj&vpfjKSkva!~U?WcQ{wh1!Y)>-9tv}GQ(|Afb}5Ip9A2hZVu zE$Ae)Jg3rojNi-13qHOnGS+uW{*qPZe!{<%vLuNz{97sKC}sG!QofpjFf9DLAsK#b znPlG=^qmfyXbT<^C`DM+JL-_ku_!(%u!L;H)>kys}teJT1 zB_NJCO%nyr_N%=P=O`+34JJn_)=X;$k^E{j1!Ci3_UwtU2WsI{$Jdc#O%%ze0bdK5 zV?2dNYj>f|TCB;2(WsMvN5U7o!BdlaI^_1Rrnbv~VSgdu$Cws<`5VU1iHr*~;HOR1 z){Vy^s4NP7%fJ{s^6g#w*w>bzEsvk->dY=pXQ!g=fmE#bguW`V7VYkJq(I&j$a@O> zHC>*9UtKUqwG^VxnL=fM$C}O=M`gn>uW^o}vc_phCsCPw7E;t7$9!}}T_KSl3PQrH4&_gQQu8hh|z~yy`1u>j;aUA#q;%>p3YdtwwPa3YK zulI)FU1eAFWr1(~2zGL2P}#?bZ_Wi&MiSC2Dr-+gDud^eKDlG#qW6Gbz&Z@{?R|1< zv`>Jxv{<2Culi9v?16Rsr--L#QYIzJ3rzI~JIv#-{)g{hoG*WbHaS>-BxCMweHv?m zxu7fd0kFT;d`TaE>zP<>yz}h76XRmqi8;$2Reun-YM;|dy2>R*_9)~Wh=>Zr1r~0de`Of=a z_wEl#%Z)Y}1N&hn`rkf7@s%d%YL%G+cVorupQss4tI`tg2 zm?qD)BF5P!kz*YE`5bUGJ@Ht71mlH${s{EGT_=->%ZuTgfNOF2htQw)?zzUNszAfm zKX!ee-}3{-Ir!OG#30sBFm|E8%h2Be@!?}8;13k*o*ay|1m?f|ZfH{DkstBsHNfrv zpyqr2W@^4_wFjQo^;_>B#}UId|Huy|FMPuWyn*=FGXGeG|4I1b{t$dz@qK*OU5C%{ zxPke&!6#>w!Y3JH3G>2Oj!$F3ljrMfTM2o7&u<1UjZ|d(uJFrPY)cibAhg0OA%|vzZZV%$`fGvS*aj2-PR*M} zP&ezH#}Ut?Snky4dmVqmn&xE#uTIctHz_mx%a;I4jI)(HC|O@7}9 z^URjtG1410Q+~sUS2k1ry@2WZdv2zD(ujBKEct|y-oK{EFBX2kn_ zs{C^!JzJvOV#M2>C_in4^(4xT{oA%$ny1Q#`s1})hE0=y0GO)dR?Fff`TL?>lxBxk z%M(d5uZ?u}YPGzSEaS{XZ!fe>k#Q~oSWr)`mIX89ZyWKRm?2jQdO99kl4YL}@7>w5 z*GO;i9Ch_vc`Zc{gBOPRDrR@||k=uc(h#^QmfG2e%n+@BTB=b*L*Ct*mt~ z;9P^}dWhxb!7 zzPxtP^Tip`HGH{mmoW#LqVoR=`2vhro*xF=qu(rdlh%HGpWLjI^Jv5SJ51|u*JZ!@Xn(^P7-i)N!-sPs(yPPJhA0q%W!?uylJ!X@zt!)VG zjrDOHZ2DZwB$@kO2N{^gXP{+4T#HA1tlM7D#W1$%IdgnV!*)-X198?LVPC*&r= zeGEI+EcKYPSn+NuK)$7?cVu&Q0rvf)_E_+)iw8ZPmy0t1@DaX*H3_dz=8JVnY|BZ| z;=PkE#!ywqRFbn0ho|7-Gty>-&!@Izay+-h{u$!0qr)8AVne-lj@rmLI7jUua!kiu zw!_MMEn`~ts4_}eOZ3#NfG(CpC(E#=&T58^#9F%EAQRTASS!V~JcYJjLZ&YVkm(^+ zraG(>-iAyhWQtQ|iWg_QHA1HN3t5;a)xq9_AXg|}_1EF$QF+-wCls$7mDkyc3NN-> zE$mi@amD$a$bSeshvHvw9sa8|{-7O-zg^>>(8u4Y@_z+<{e$g29Yd&xZEJ!rXttfJ z(w08&b>RKhYJ2SlvETFPmEQgJhy$H56yP>>I)6yi>2`V8|k(rH(h2sp1f4pZJ1`FGWKX9mJA6;m$z{yvg-#GlG@UHGj!sUi zbdO_yMbpWvf4x>GA8K@Ux}K)$WGw9Z)nsM7e-WXKt=B*|lumx8@;qV*t&<-!4s_ze z{!b{K98&3=#om{ulR~^xc;8IhC##1ZtY*uF7Bg_5Crj0iE{;o@oIkpboDZt>U1-bW z!jJDuaNJPhk`e=|RXH26XCVB0;*G+;-@J^miP+6!^Kt0zUCfb1y}IA|8tOZ-=OSQ> zlrixNV4_^4&^V!$Tb1%LlzR>PpxPej7|h=*#@oAdvGya_gD%}DXQ|`xcF33mIPZZ9 z`i)k3J76xrcpr2j@;x=n5IYewPmqY2m$$uu7<%pd1^Z}XZ!ZJwV~t=%Y1V9*@3m9-A)uYC(+C`g#WI20zZmcn*enQsCGl*vm9Oaj*yQoHwYs z3w_N&Up0P4Ufeh4XIJ~meHSv+VJ`sVN$?+%E>}Yq?Ax~1K$eL}4?`9{OX4->KG09W zo*3_sa35OG2d3i$jpG~u=? zjdRe|4A75`K`b*zx2(gy?|q)4qpyNbEo47?rS}>hkAOydymG$6JpK!M@tY4F{59Z> zppA3lhDONEv{OOb0@^X4`z`FDofh)PwK!G1M5B+NW1PN>_{93+wbpr@1*`$Su-Omb zpV(7Q#-5O{6LchW1s&~#-thfB72m$kXV6tM+6o(tqq1cdbP+rh={^pmppgs=m7C@LI4n<>NUr&p|YwSj+kyuJ{CO72p_C1sMB-5B+AnbH9_( z?-=;rcGxWrc6%26K5vd`>BPga_DS^L20vV7u-`nUk9`29!}Qtba?A%0<^b-0kDBiW z55KBg<`E4Zyk8Rs-C~b_^q24rtEyYJC;JQg%Gob_9bBjR)#ISSc3+3Km9Y0SYTH`& zt1qs#`7rR8#9URCOXpWYPlMoJ(9;d7oavC0=a8%mqkmO_-;5f?zm5#xU!P$tw&J<@m)98ffcmd-==2xK|}ih{$iv!(~dIg^MrvCt#O)wgg~(R9A% zkM-LNj^evnWskwW);p-|(IH4zQdvhV($z@u{$}`b?7cSOyMug=q50P@(f7tQYAb+m zW8Ct-M5`q+U91)OjO@>-&lybJ?_%DAcarE&K{R#Wi1{qeM9XePT;a0`3G*?l4dXHf zX(IM*()xJu_x0-IEqky>8Cc4D{xeY*t;kVq*keq=z6HjxI0HC7gB)T#YIrAn2Qu+~ zb0=gT!*YOTBj!iEUkzCu*4^NbwTQ8=JJ8OK?_KokYg{_M7s~yzv^<4+wwWLO)$~&c zSYsm2=)V5y4ND|-=b-Oc=lAIXesKxonCDy_%o{qXn@)~jV($4zot`&=P7c0@Q6E2M z51E`-DUy0VLOY|38-Rx|0zWqr{nF~95St#}?m4=Y_sKBF!``AeN8GP#Z`831>jh26 zvDeWtuPX-9@hr&Ef$vuoU=HxS!bfJmIRHD-gZFmbg?iBrXCtil4$NWM4q2E#gRj7i z!dMq_V;_O{TX|j0=Qn@Q$*t*m6zd1y!?1k)H=*YzbvPel&r5sf@%vrxBNCte;moFP z0?vzIM~=BHC*iz!k}6{?QFjCQX5z7)n1A6_#Nh^n=u;z7qit(=5oWH-T_3J+nI~vDO8`j$aw!Nk9UjClLUOt!Oxn?qA z80(S!&kQ+&V+=lcFLVHX1Gd; zb5^A<_CPdzNjuv-0zGJbxs1KrbLfK;K6V7Q)Zkh_nn5#X7`2^L_lo(fdK}KGG1rUL zaOWb=``Iq_-N$y&+CRbV@t)~KA2`l%`#7{uWIL;|V0$P#Lnar-x8A-Q-3M8}7G-X* z3VPRQYxOl;kM~HYDtFu&Y6ecMR$syOgQ-p5wx{N1#NCyMzbg=jmm?l8L%insud-*r z`}};C&;C3P{aFOL`Q1}{B2(DJg7Zi#&LcBn6O%ZLL`(r6mcJS{dA$0jZ)B4z_ztqL z33STq7){Tb>?=UCoglkr6ZCC-0tL>%j+n>pwP79`_^Nlmy0^U7(mhvBMc;$v1#@No z?v$kLJ@2(_nJ4p}Rf__Y9;Tp~GhhBOXa;cx&6VNXu^fMNd(L|;|2a>_ zuL@%O!Hy{N%wSvWOY(P?u4y|fUEA~CYr~#*J^0~FrFA6M*c4%XTja4`3+A!U5zJ54 z<)`TK({=e&T|P~hpR3E?pvy1R<(KI4%XImhb@?^A{CZtJTbKWqF27lqzgL&vs>|o= z^4oR!5+zSGDx&Y-PO8Uiq?8_@gY8nb4=2_+p}oN@HlhK0UD2g)wC4+Do>uf#79ML zALUn;0{+7(YmT4=<3pvBu|ON@N!qlHhrsLcL%Briouorg-F_>al>yy z-8*!=7Wc0}z?eRrcJ8D__!YyV#k6EGEnZBv#WaIvQ7X+Qo33q8UAY*$lB;~1-fe=F zzRJ>mJx@u}kqDYX#FReu1X~;6L3}034A4MSNTuc8;!=H}2r9r;Uhb+w@Ifqb74=Et zMi6jURA4Bnzen_%O`f+Bj?=H5 z8q52`D${Q;0Orlr0C#V^WBKxx8#iu|aO9)>UK4wYGz|}bIOQ_xBCUA%x00(+=7)a= z%^%L|KV}q$k_B&J&QZkGVMO-~CsXDGz$cM8aw<{LREl&=BNNsOk=Qee#JmdIR^iY8 zI}MEVv;FZCCqLVpQ(--%ieX0jc|O8$%x^^syNMKQ50PRGC{pZ?i4^;aBE@;ENZ|$| z#drQi3Y&`*b6=5;Qd68Ei!%23MT)hqNHHfDDfW>?ihXjCCa5X)f<+m7TOx(Ki8OtY zNNJv$W~gbVNCi^(PgnzC4TLoi)<9STVGV>e5Y|9g17Qt>H4xT7SOZ}Vgf$S>Kv)A| z4TLoi)<9STVGV>e5Y|9g17Qt>H4xT7SOZ}Vgf$S>Kv)A|4TLoi)<9STVGV>e5Y|9g z17Qt>H4xT7SOZ}Vgf$S>Kv)A|4TLoi)<9STVGV>e5Y|9g17Qt>H4xT7SOfoGXh4D# zx8Z5WGZBw+7XUK&D8Ktx^2%@Rb$L5(1F$P){>$x5xIn;!OSw$T@ZiEX(*t;#@VtoU zO*|jsxrm4V4aXzlNyD=U5B}p*)3@;C;ql>l2oL_}G}BM;{0h%$Jn!K-kLNO;XfVTn z$nMT}RTlZOD@)w#_;L<6V9sJ!MPWH0BJVEFEv<6q78G)+!sp5@09STqluHZO;dl({|#RU-Bom=U1I}30{le?Uvid~)(!leucVy;fed4JrS z=B}86PSZu@ItMgOg)w0sYQRMdY}a(Pd`T^@R?BB3rGBGY{_zy0oU4`(CoAP5wH%qE zl)tT(|E`uFR?GLKDfK_#GE3uE%1@|ei&{RcmWQh4fL5+k@VWaVOv>#Ns3N{MVgxdL zhY6QeKj*CY%)wt2f@QuQLSJ5EDBoi!dky7kLwUEM{FtG<&rm*ODF4V%e#TJ#g`pfU zl#dz8FB{6gHgIE{;Q$2+eePo1Q&-`v zEb(zX=a9=cD3Mdd+2CbLh?bSPxwy(nYpT21NhKy?tU|Z4#8qBJ&RfWN8wcbHZ_#~j z=T_YGj9Z+X%B62<;s&?tRi-VN3wP=Fx%}s$?eO#l0O8T%6AKu^mB~*LxNRpwT)C8k zn!A*0TnR|uEtMj0tm{!tecX4_)6m7^UjwZ|M>7mAFKg?})nm&4E zXI#dC&M2RIWB%a-f&J&YUi#p*CpIUZ*|_$W{LflUYu4qTU$S@E;L69pck8cKe)6dM zH{D4QmGRH~`ti5iH$S%i_E+)_e)QG%cV>Th(qTFD)IY9{ooUTm^Uju2i{2|7{b=jY zYM=eZUEY_^<+n$^^ZM(B5gYCr)Vs57XZ7y)e!FMY!!v*SzpbCM`livJocK}474Lzx dzx?Lqrk__GY)a4R99cTkR=g=;#w^y?e*^pP4O;*J literal 52312 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 diff --git a/build.sh b/build.sh index c5d4635..4ae474b 100755 --- a/build.sh +++ b/build.sh @@ -20,16 +20,16 @@ echo "Proceeding with build on $OS/$ARCH..." echo "Building Splice runtime and native module..." # Compile Splice runtime (with SDK globals) -gcc -DSDK_IMPLEMENTATION -Isrc -Wall -Wextra -c src/splice.c -o "$BIN_DIR/Splice.o" +gcc -DSDK_IMPLEMENTATION -Isrc -Wall -Wextra -c -DNDEBUG -O3 -flto src/splice.c -o "$BIN_DIR/Splice.o" # Compile native module without SDK_IMPLEMENTATION -gcc -Isrc -Wall -Wextra -c src/module_stubs.c -o "$BIN_DIR/module_stubs.o" +gcc -Isrc -Wall -Wextra -c -DNDEBUG -O3 -flto src/module_stubs.c -o "$BIN_DIR/module_stubs.o" # Link executable (local binary: Splice) gcc "$BIN_DIR/Splice.o" "$BIN_DIR/module_stubs.o" -o "$BIN_DIR/Splice" echo "Building spbuild (bytecode compiler)..." -gcc -Isrc -Wall -Wextra src/build.c -o "$BIN_DIR/spbuild" +gcc -Isrc -Wall -Wextra -DNDEBUG -O3 -flto src/build.c -o "$BIN_DIR/spbuild" # --- Install section --- INSTALL_DIR="" diff --git a/docs.md b/docs.md index 8bbc9ef..965e566 100644 --- a/docs.md +++ b/docs.md @@ -1,11 +1,266 @@ -# How to code in Splice +# How to Code in Splice -Splice is a very basic language and some of the syntax is derived from Lua, Python and a bit of it's own syntax. +Splice is a lightweight and embeddable programming language. +Its syntax is inspired by Lua and Python, with additional custom syntax +designed to keep the language simple and predictable. -## Print +Splice programs are executed from top to bottom. -Printing in Splice is written using +--- -``` Splice +## Program Structure + +A basic Splice program consists of statements separated by semicolons. + +```splice +print("Hello, Splice"); +``` + +--- + +## Comments + +Splice supports single-line comments using `//`. + +```splice +// This is a comment +print("This line will execute"); +``` + +--- + +## Printing Output + +Printing output is done using the `print` keyword. + +```splice print("Hi"); ``` + +### Printing Variables + +```splice +let x = 10; +print(x); +``` + +--- + +## Variables + +Variables are declared using the `let` keyword. + +```splice +let number = 42; +let name = "Splice"; +let pi = 3.14; +``` + +Splice is dynamically typed, meaning the type is determined at runtime. + +--- + +## Arithmetic Operations + +Splice supports basic arithmetic operations. + +```splice +let a = 10; +let b = 5; + +print(a + b); +print(a - b); +print(a * b); +print(a / b); +``` + +--- + +## Comparison Operators + +Splice supports standard comparison operators. + +```splice +let x = 10; + +print(x == 10); +print(x != 5); +print(x > 5); +print(x < 20); +``` + +--- + +## If Statements + +Conditional execution is done using `if`. + +```splice +let age = 18; + +if (age >= 18) { + print("You are an adult"); +} +``` + +--- + +## If-Else Statements + +```splice +let score = 40; + +if (score >= 50) { + print("Pass"); +} else { + print("Fail"); +} +``` + +--- + +## While Loops + +The `while` loop executes as long as the condition is true. + +```splice +let i = 0; + +while (i < 5) { + print(i); + i = i + 1; +} +``` + +--- + +## For Loops + +Splice supports `for` loops with a counter variable. + +```splice +for (let i = 0; i < 5; i = i + 1) { + print(i); +} +``` + +--- + +## Functions + +Functions are declared using the `func` keyword. + +```splice +func add(a, b) { + return a + b; +} +``` + +### Calling Functions + +```splice +let result = add(10, 20); +print(result); +``` + +--- + +## Return Statement + +Functions return values using `return`. + +```splice +func square(x) { + return x * x; +} + +print(square(5)); +``` + +--- + +## User Input + +Splice supports input using the `input` keyword. + +```splice +let name = input("Enter your name: "); +print(name); +``` + +--- + +## Error Handling + +Splice provides basic error reporting at runtime. +Errors include: + +- Undefined variables +- Invalid operations +- Syntax errors + +--- + +## Execution Model (High Level) + +Splice executes programs by walking an Abstract Syntax Tree (AST). +Each node represents a language construct such as variables, function calls, +loops, or expressions. + +This design allows: + +- Easy embedding in C programs +- Simpler debugging +- Low memory overhead + +--- + +## Embedding Splice in C + +Splice is designed to be embedded in C applications. + +```c +#include + +#define ARDUINO +#define SPLICE_EMBED 1 + +#include "splice.h" + +/* +Splice source (compiled beforehand): + +print("Hello from Splice"); +*/ + +const unsigned char program[] = { + 'S','P','C',0x00, // magic + 0x01, // version + + AST_PRINT, + AST_STRING, + 0x00, 0x11, + 'H','e','l','l','o',' ', + 'f','r','o','m',' ', + 'S','p','l','i','c','e' +}; + +void setup() { + Serial.begin(115200); + while (!Serial); + + ASTNode *root = read_ast_from_spc_mem( + program, + sizeof(program) + ); + + interpret(root); +} + +void loop() {} + +``` + +--- + + diff --git a/examples/.DS_Store b/examples/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d0c089b326b773021927cd649a4d2ff1ceeaf436 GIT binary patch literal 6148 zcmeHLyH3L}6umA5g|bvkY-C_Y^bbN6#KP8%sc(wZHc=m{SWqOyz{(H6*TBNZ@CAr- zZ7Ycrx7{j)d?VkJ*vHPvQDWC6BGFv-8$@*?@=zG7H6%-LJC{;abj=A+$T1$qca2sr zn#3ipt8flD2mYP|{O#^jhh{iBRQP@?*JkS^3d8O=>Y~>y)KYv~p8T~Dcc$A+Z zF3_E7)Wf~U$V=o7EhwUyIg?aQ*YWb2-dm|A>zI=$Q@4$4>hxKsM?+QyjS-HR=B7q* zX5-}bo!_SVN@L}{4x|q7{NST71{xEEa_T^mTL54c)iQ7{=P;np z6~I7aq7XF*p}GQ9SE08ULUl*IuX%ySM4{?VLf#qU=sOF&LlJrg6~3gC2o$>P9B>Yp z4(zGRI-Ya=CwJu>a1Q({2Shb&g-tw?URz5K$7`*R(njH6UZPNTLDI{yJmIC7 d|5uQKHlI&`fyP83Y7p*+fV9CS=fF-K_yw*L*^vMM literal 0 HcmV?d00001 diff --git a/examples/array/array.spc b/examples/array/array.spc deleted file mode 100644 index 0cc0ccbf9019a12e77428c6fc37985aad39954f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmWFzaAsiS<6vN5U}0g%E6ptyVFt3H;DbGk3)i5}Sp$dpNKx7U?5TRSd0RXn-8o~eo diff --git a/examples/calculator/calc_test.spl b/examples/calculator/calc_test.spl index 1676f88..fa43b30 100644 --- a/examples/calculator/calc_test.spl +++ b/examples/calculator/calc_test.spl @@ -1,10 +1,11 @@ func calculator(num1, num2, op) { if (op == "+") { - print(num1 + num2) - } else { - print("Invalid operator: " + op) + print(num1 + num2); + } + if (op == "-") { + print(num1 - num2); } } -calculator(5, 3, "+") // prints 8 -calculator(5, 3, "%") // prints "Invalid operator: %" +calculator(5, 3, "+"); +calculator(5, 3, "-"); diff --git a/examples/calculator/hello.spc b/examples/calculator/hello.spc new file mode 100644 index 0000000000000000000000000000000000000000..2416d73cfe9abac42252dc2ae4c2ba0a107f2e3e GIT binary patch literal 201 zcmWFzaAsiSXJ%kv5a41+PRvOz%}FfDF9Hd$Fyxiy8iGk9CWib1eny}mA2Sn!tt}IX z&&bH24Hjc#2C|qS${~~yLYz^E!85NcF()%cA-^EC2xPdG0$9Hwx`jaFK|sU-OffKU LIDo7mPMInIoy{OJ literal 0 HcmV?d00001 diff --git a/examples/forloops/for.spc b/examples/forloops/for.spc new file mode 100644 index 0000000000000000000000000000000000000000..36e3e3f01c388710506c087de4d41c1a0a86d09c GIT binary patch literal 65 zcmWFzaAsiSXJTMrU}F?!aLX@J$jQ$yC|1bKQwT1|$xKcaVPwbz%7VZLdkD>-;=s=c JWU?^< b) { - a = a - b; - } else { - b = b - a; - }; - }; - - return a; -}; - -func lcm(a, b) { - return abs(a * b) / gcd(a, b); -}; - -func factorial(n) { - if (n < 0) { - raise ("factorial: negative value"); - }; - - let r = 1; - while (n > 1) { - r = r * n; - n = n - 1; - }; - - return r; -}; - - - diff --git a/src/build.c b/src/build.c index b2813d5..3181211 100644 --- a/src/build.c +++ b/src/build.c @@ -5,6 +5,13 @@ #include "splice.h" /* uses AST types + write_ast_to_spc */ +ASTNode* ast_tuple(ASTNode** items, int count) { + ASTNode* node = malloc(sizeof(ASTNode)); + node->type = AST_TUPLE; + node->tuple.items = items; + node->tuple.count = count; + return node; +} static inline int write_ast_to_spc(const char *out_file, const ASTNode *root) { FILE *f = fopen(out_file, "wb"); @@ -306,10 +313,39 @@ static ASTNode *parse_primary(void) { } if (match(TK_LPAREN)) { - ASTNode *e = parse_expression(); + ASTNode *first = parse_expression(); + + /* tuple if comma appears */ + if (match(TK_COMMA)) { + ASTNode **items = NULL; + int count = 0, cap = 0; + + /* first element */ + cap = 4; + items = (ASTNode**)malloc(sizeof(ASTNode*) * cap); + items[count++] = first; + + do { + if (count >= cap) { + cap *= 2; + items = (ASTNode**)realloc(items, sizeof(ASTNode*) * cap); + } + items[count++] = parse_expression(); + } while (match(TK_COMMA)); + + consume(TK_RPAREN, "Expected ')' after tuple"); + + ASTNode *t = ast_new(AST_TUPLE); + t->tuple.items = items; + t->tuple.count = count; + return t; + } + + /* otherwise normal grouping */ consume(TK_RPAREN, "Expected ')'"); - return e; + return first; } + if (match(TK_READ)) { consume(TK_LPAREN, "Expected '(' after read"); ASTNode *e = parse_expression(); diff --git a/src/module_stubs.c b/src/module_stubs.c index e5aba20..592055d 100644 --- a/src/module_stubs.c +++ b/src/module_stubs.c @@ -1,11 +1,3 @@ -/* Minimal module stubs for Splice runtime - * This file is intentionally small: it registers a tiny example native - * function and ensures module initializers are invoked at program - * startup. Real native modules can be added by providing additional - * init functions that call Splice_register_native() or by providing - * Splice_register_module_ symbols which are looked up by the - * import mechanism in `splice.h`. - */ #include "splice.h" #include diff --git a/src/splice.h b/src/splice.h index 5b6ab56..dd72efe 100644 --- a/src/splice.h +++ b/src/splice.h @@ -93,7 +93,11 @@ typedef struct Value { void *object; } Value; -typedef enum { OBJ_ARRAY } ObjectType; +typedef enum { + OBJ_ARRAY, + OBJ_TUPLE +} ObjectType; + typedef struct { ObjectType type; int count; @@ -107,6 +111,7 @@ typedef struct { /* ========================= AST ========================= */ + typedef enum { AST_NUMBER = 0, AST_STRING, @@ -123,6 +128,7 @@ typedef enum { AST_INFO, AST_WHILE, AST_IF, + AST_TUPLE, AST_STATEMENTS, AST_FUNC_DEF, AST_FUNCTION_CALL, @@ -147,7 +153,10 @@ struct ASTNode { ASTNode *left; ASTNode *right; /* may be NULL for unary */ } binop; - + struct { + ASTNode** items; + int count; + } tuple; struct { char *varname; ASTNode *value; @@ -216,7 +225,10 @@ struct ASTNode { } indexassign; }; }; - +typedef struct { + ASTNode** items; + int count; +} ASTTuple; /* ========================= Env (vars + funcs) ========================= */ @@ -232,21 +244,50 @@ typedef struct { void *obj; } Var; -static Var vars[32]; -static int var_count = 0; +#define VAR_TABLE_SIZE 256 /* power of 2 = fast modulo */ + +typedef struct { + char *name; /* interned or strdup */ + VarType type; + double value; + char *str; + void *obj; + int used; +} VarSlot; + +static VarSlot var_table[VAR_TABLE_SIZE]; +static inline unsigned hash_str(const char *s) { + unsigned h = 2166136261u; + while (*s) { + h ^= (unsigned char)*s++; + h *= 16777619u; + } + return h; +} + -static inline Var *get_var(const char *name) { +static inline VarSlot *get_var(const char *name) { if (!name) return NULL; - for (int j = 0; j < var_count; ++j) { - if (!vars[j].name) continue; - if (strcmp(vars[j].name, name) == 0) - return &vars[j]; + unsigned h = hash_str(name); + unsigned idx = h & (VAR_TABLE_SIZE - 1); + + for (unsigned i = 0; i < VAR_TABLE_SIZE; i++) { + VarSlot *v = &var_table[idx]; + + if (!v->used) + return NULL; /* empty slot = not found */ + + if (strcmp(v->name, name) == 0) + return v; + + idx = (idx + 1) & (VAR_TABLE_SIZE - 1); /* linear probe */ } return NULL; } + static inline void free_object(void *obj) { if (!obj) return; ObjArray *oa = (ObjArray*)obj; @@ -260,68 +301,75 @@ static inline void free_object(void *obj) { } static inline void set_var_object(const char *name, void *obj) { - if (!name) - error(0, "set_var_object called with NULL name"); - - for (int j = 0; j < var_count; ++j) { - if (!vars[j].name) continue; - - if (strcmp(vars[j].name, name) == 0) { - if (vars[j].type == VAR_OBJECT) - free_object(vars[j].obj); - vars[j].type = VAR_OBJECT; - vars[j].obj = obj; - free(vars[j].str); - vars[j].str = NULL; - vars[j].value = 0; + if (!name) error(0, "set_var_object: NULL name"); + + unsigned h = hash_str(name); + unsigned idx = h & (VAR_TABLE_SIZE - 1); + + for (;;) { + VarSlot *v = &var_table[idx]; + + if (!v->used) { + v->used = 1; + v->name = strdup(name); + v->type = VAR_OBJECT; + v->obj = obj; + v->str = NULL; + v->value = 0; + return; + } + + if (strcmp(v->name, name) == 0) { + if (v->type == VAR_STRING) free(v->str); + v->type = VAR_OBJECT; + v->obj = obj; return; } - } - vars[var_count].name = strdup(name); - vars[var_count].type = VAR_OBJECT; - vars[var_count].obj = obj; - vars[var_count].value = 0; - vars[var_count].str = NULL; - var_count++; + idx = (idx + 1) & (VAR_TABLE_SIZE - 1); + } } + static inline void set_var( const char *name, VarType type, double value, const char *str ) { - if (!name) { - error(0, "set_var: NULL variable name"); - } + if (!name) error(0, "set_var: NULL name"); - for (int j = 0; j < var_count; ++j) { - if (!vars[j].name) continue; + unsigned h = hash_str(name); + unsigned idx = h & (VAR_TABLE_SIZE - 1); - if (strcmp(vars[j].name, name) == 0) { - vars[j].type = type; - if (type == VAR_STRING) { - free(vars[j].str); - vars[j].str = strdup(str ? str : ""); - } else { - vars[j].value = value; - free(vars[j].str); - vars[j].str = NULL; - } + for (;;) { + VarSlot *v = &var_table[idx]; + + if (!v->used) { + v->used = 1; + v->name = strdup(name); + v->type = type; + v->value = value; + v->str = (type == VAR_STRING) ? strdup(str ? str : "") : NULL; + v->obj = NULL; + return; + } + + if (strcmp(v->name, name) == 0) { + if (v->type == VAR_STRING) free(v->str); + v->type = type; + v->value = value; + v->str = (type == VAR_STRING) ? strdup(str ? str : "") : NULL; return; } - } - vars[var_count].name = strdup(name); - vars[var_count].type = type; - vars[var_count].value = (type == VAR_NUMBER) ? value : 0; - vars[var_count].str = (type == VAR_STRING) ? strdup(str ? str : "") : NULL; - var_count++; + idx = (idx + 1) & (VAR_TABLE_SIZE - 1); + } } + /* ========================= Forward declarations ========================= */ @@ -536,6 +584,11 @@ static inline void free_ast(ASTNode *node) { case AST_IDENTIFIER: free(node->string); break; + case AST_TUPLE: + for (int i = 0; i < node->tuple.count; i++) + free_ast(node->tuple.items[i]); + free(node->tuple.items); + break; case AST_BINARY_OP: free(node->binop.op); @@ -699,6 +752,11 @@ static void write_ast_node(FILE *f, const ASTNode *n) { case AST_READ: write_ast_node(f, n->read.expr); break; + case AST_TUPLE: + w_u32(f, (unsigned int)n->tuple.count); + for (int i = 0; i < n->tuple.count; i++) + write_ast_node(f, n->tuple.items[i]); + break; case AST_WRITE: write_ast_node(f, n->write.path); @@ -804,6 +862,15 @@ static ASTNode *read_ast_node(FILE *f) { case AST_NUMBER: n->number = r_double(f); break; + case AST_TUPLE: { + unsigned int c = r_u32(f); + n->tuple.count = (int)c; + n->tuple.items = + (ASTNode**)calloc(c ? c : 1, sizeof(ASTNode*)); + for (unsigned int i = 0; i < c; i++) + n->tuple.items[i] = read_ast_node(f); + break; + } case AST_STRING: case AST_IDENTIFIER: @@ -934,6 +1001,16 @@ static inline ASTNode *read_ast_from_spc(const char *filename) { /* ========================= Runtime eval/interpret ========================= */ +static inline void print_value(Value v) { + if (v.type == VAL_STRING) { + printf("%s\n", v.string ? v.string : ""); + } else if (v.type == VAL_NUMBER) { + printf("%g\n", v.number); + } else { + printf("\n"); + } +} + static inline char *eval_to_string(ASTNode *node); static inline Value eval(ASTNode *node) { @@ -988,6 +1065,24 @@ static inline Value eval(ASTNode *node) { tmp.number = node->number; return tmp; } + case AST_TUPLE: { + ObjArray *oa = (ObjArray*)calloc(1, sizeof(ObjArray)); + if (!oa) error(0, "OOM tuple"); + + oa->type = OBJ_TUPLE; + oa->count = node->tuple.count; + oa->capacity = node->tuple.count; + oa->items = + (Value*)calloc((size_t)(oa->capacity ? oa->capacity : 1), sizeof(Value)); + + for (int i = 0; i < node->tuple.count; i++) + oa->items[i] = eval(node->tuple.items[i]); + + Value v; + v.type = VAL_OBJECT; + v.object = oa; + return v; + } case AST_STRING: { Value tmp; @@ -1093,6 +1188,10 @@ static inline Value eval(ASTNode *node) { if (!v || v->type != VAR_OBJECT) error(0, "index assign: variable is not array"); ObjArray *oa = (ObjArray*)v->obj; + if (oa->type == OBJ_TUPLE) { + error(0, "cannot assign to tuple (immutable)"); + } + int idx = (int)eval(node->indexassign.index).number; Value val = eval(node->indexassign.value); @@ -1210,7 +1309,12 @@ static inline Value eval(ASTNode *node) { Value v = eval(node->funccall.args[1]); if (a.type != VAL_OBJECT) error(0, "append: first arg must be array"); ObjArray *oa = (ObjArray*)a.object; - if (!oa || oa->type != OBJ_ARRAY) error(0, "append: not an array"); + if (!oa) error(0, "append: invalid object"); + if (oa->type == OBJ_TUPLE) + error(0, "append: cannot modify tuple (immutable)"); + if (oa->type != OBJ_ARRAY) + error(0, "append: not an array"); + if (oa->count >= oa->capacity) { int newcap = oa->capacity ? oa->capacity * 2 : 4; @@ -1243,7 +1347,6 @@ static inline Value eval(ASTNode *node) { ASTNode *func = get_func(node->funccall.funcname); if (!func) error(0, "Undefined function: %s", node->funccall.funcname); - int saved = var_count; for (int j = 0; j < func->funcdef.param_count; ++j) { Value av; if (j < node->funccall.arg_count) { @@ -1278,7 +1381,7 @@ static inline Value eval(ASTNode *node) { } else { result = return_value; } - var_count = saved; + return result; } @@ -1291,14 +1394,81 @@ static inline Value eval(ASTNode *node) { } } +static inline void sb_ensure(char **buf, size_t *cap, size_t need) { + if (need <= *cap) return; + while (*cap < need) *cap *= 2; + *buf = (char*)realloc(*buf, *cap); + if (!*buf) error(0, "OOM stringify"); +} + +static inline char *value_item_to_tmp(Value v, char tmp[128]) { + if (v.type == VAL_STRING) { + /* quoted strings */ + snprintf(tmp, 128, "\"%s\"", v.string ? v.string : ""); + return tmp; + } + if (v.type == VAL_NUMBER) { + snprintf(tmp, 128, "%g", v.number); + return tmp; + } + return ""; +} + static inline char *eval_to_string(ASTNode *node) { Value v = eval(node); - if (v.type == VAL_STRING) return v.string; + + if (v.type == VAL_STRING) { + /* caller owns it */ + return v.string; + } + + if (v.type == VAL_OBJECT) { + ObjArray *oa = (ObjArray*)v.object; + if (!oa) return strdup(""); + + if (oa->type == OBJ_ARRAY || oa->type == OBJ_TUPLE) { + /* build string */ + size_t cap = 128; + size_t len = 0; + char *out = (char*)malloc(cap); + if (!out) error(0, "OOM stringify"); + + char open = (oa->type == OBJ_TUPLE) ? '(' : '['; + char close = (oa->type == OBJ_TUPLE) ? ')' : ']'; + + out[len++] = open; + + for (int i = 0; i < oa->count; i++) { + char tmp[128]; + const char *s = value_item_to_tmp(oa->items[i], tmp); + + size_t sl = strlen(s); + sb_ensure(&out, &cap, len + sl + 4); + memcpy(out + len, s, sl); + len += sl; + + if (i + 1 < oa->count) { + out[len++] = ','; + out[len++] = ' '; + } + } + + out[len++] = close; + out[len] = 0; + return out; + } + + return strdup(""); + } + + /* number */ char buf[64]; snprintf(buf, sizeof(buf), "%g", v.number); return strdup(buf); } + + static inline void interpret(ASTNode *node); static inline void interpret(ASTNode *node) { @@ -1309,7 +1479,8 @@ static inline void interpret(ASTNode *node) { for (int j = 0; j < node->statements.count; ++j) { ASTNode *s = node->statements.stmts[j]; if (s && s->type == AST_FUNC_DEF) - add_func(s->funcdef.funcname, clone_ast(s)); + add_func(s->funcdef.funcname, s); + } for (int j = 0; j < node->statements.count; ++j) { @@ -1342,10 +1513,10 @@ static inline void interpret(ASTNode *node) { } case AST_PRINT: { - char *s = eval_to_string(node->print.expr); - printf("%s\n", s); - free(s); - break; + Value v = eval(node->print.expr); + print_value(v); + if (v.type == VAL_STRING) free(v.string); + } From 2a824c2663ea63c5601757f8089eb2bf03f6f6c4 Mon Sep 17 00:00:00 2001 From: Reboy2000 Date: Sat, 17 Jan 2026 19:42:48 -0500 Subject: [PATCH 2/4] Added Optimizations and fixed Docs.md --- src/splice.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/splice.h b/src/splice.h index dd72efe..31bb9d8 100644 --- a/src/splice.h +++ b/src/splice.h @@ -1092,7 +1092,11 @@ static inline Value eval(ASTNode *node) { } case AST_IDENTIFIER: { - Var *v = get_var(node->string); + VarSlot *slot = get_var(node->string); + double d = slot ? slot->value : 0.0; + Var *v = var_number(d); // or make_number_var(d) + + if (!v) { Value tmp; tmp.type = VAL_NUMBER; From 078f6a122e25bef80ea4f4923971cf9472320241 Mon Sep 17 00:00:00 2001 From: Reboy2000 Date: Sat, 17 Jan 2026 19:57:20 -0500 Subject: [PATCH 3/4] Added Optimizations and fixed Docs.md --- bin/Splice | Bin 35752 -> 35752 bytes examples/helloworld/hello.spc | Bin 25 -> 25 bytes examples/helloworld/helloworld.spl | 2 +- src/splice.h | 9 +++++++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/Splice b/bin/Splice index 1771c515a3be82691aae0de19dd7fa86a1791ca4..38200a9e31fa7b2ce2478d4af55f31860774f096 100755 GIT binary patch delta 3524 zcmZWs4Oo;_7C!fzVfY3Zm|ok z+;iS@?zxxlyBqbVGL2OnYn*jI0*7(|eelJ(Ssdewx?%!N7?~VPN&Mt48a(UE$T26?3 zB$XQ3*@WWRLNc^l6|7lNC~s5K&sac_O+I566?XCtizqCr_jqW#CWD@kOxxpU*Cje` z=v31H2W`m8jcp0w$^LBxSWV#-KeXpt@ zE>@IkCzIK#)H0IB+7YW*AT@`4!G=?_$;T`qt#ajan3X88a~-q~;`j>#eNDo@GSc5m z*lnPPBz!J|b|dznKam7z3rPt=>Rw8lYWW@7#ZY5OdoqJENw3AhzD=9PtyVFMdM0LJ znc6}cS)IC)U|!UlR7+7Y3quhNSFj>YLGFz>lOCTbMqFza0wQBm2)K3N`%`Ta*5<-? zUj^Rp5^$UfUY`ZWdEgyP#c>IEof+VM2IGuwf80t#GJVfAwCHg`QA<2Z%wmQ%uW3mm z6gJ5q0Dpz)oJ*f!u5B8w^N1V8t|@BgS!RwPB%iIk_dqkw7sSg*a_`}b=@KnCTt3cpfM(b zH~8~}JL-C`nQlh97h}T^eF`RlTii>uqs0AkgGOp6aMeLtI)27PigBQC5it&2r)$Op zhIRmb1Z^~@3gIsHyv|~)wL*V62f8BkTqK5<`KpFxe9r>(V(iEgs0ScFLsZc>1E zH&f~>$fIn9KD*j^Ke$I~Fo^nC5WDK3C{!#&l(5B?OU8?n5`;hvQLaA=;O3P=nAa0z! zxEuOT;O>|rbgWTD9#n##a=MXSM-Y8-O9c)Oy|$U%J(oc8B0vta9*l7QDr~Mo@5BuGq2IU zVjCK0!JLx>(IBB)P#$?H=1f;LxUXUA&Q(KS3p&)Y3W|2UDCCw9e*JxOu{Kff2drHs zv|u$TdjPpFV8g~TvWZ=1$|feZ#8gIRv8PNHGLs#|zrfx#Rg&pUV>V3Y(T|_fAS_nq z7}nD1a_Do3Y+ou3giyB2v8|M|}q zHCK?&nck9PejhKXkSwDoi0AF^6BC9J^pk&h%eZSktF|oVx^HAJT5cnKEMl>f*IA~u zfNW(wGxcN%`#RIEEk!Fz!DDljdTcy?VFRu}Fuo>W!aH^f9w9;Q40j z$LCQNCNZ1+2J!)0WuL2?x9GN+?Q!I3%g~dML5PUwm;>ltu-L%9 zbxh-MusAP~5`RLLnlzQ$=|?|J?CqCDFW6qEV5MhK#^%}U#EbWR39HTYl!OOO^rVDa z95g85lScZMgxw~3Ov2w8>41cFCfYAy!9wd^mxMDG`YK|vOPAvH8Fk=fChd{Fk67s| z60Xgp2PAxtjdn>`Zl^CuxW!7JmGFR#?qiYc#auw;ub4ES)7_z?WB;1iI~IEe^g4U( z^eStg+$+AEDsyfWhsSgB(7~k=i+LPk7Tn4TxIj|%5dRzfwYEydx z6{Wb`NwKhXcswHb?1=o|cjSK5wLKRfU{N)EfZZXUPBftq)sS?!;-E4KJ6K2VT6v0- z8W_nd%(&G_mAG6iH}Odsr3fE2m3fa6r~i+6J7ft1ddh|U)zgBcsn^+%PFu(0sWfKL zrzBjjr%%Lis}qTMT*5{@{jG!tbhKH*C)4S62_MkXtrE6s=@tp!p`{NZjuYDI#P<#L zvi2GI+@dUYYQ_&-m%{(X%q~Le{i_RJN)X%4tOETk8_3Q%fLw8cT$luKU=k3uf8p$) zf^D2V!>K*39CM%{u{2?nh*4M3F2OAo4Z(CWhXJ6wk?PFxyTYc7TgU@<4 zWG`R-hl}OYew||e@^k*^nYE7``bSY>#|IB}rmi2hC%k!~@W3;HckAX&OaD#p&>rV= zf^B?Y|NHeN9p1-_Up_S2(c!tmE!*I0eC5eot~YnXiL;l3Sxd4nSlW(jx=$#l9qan= z^FS^xk5 delta 3643 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 literal 25 gcmWFzaAsiSXJlYtU}NNF@JP+c$yX@PFUm;)05GHlMgRZ+ diff --git a/examples/helloworld/helloworld.spl b/examples/helloworld/helloworld.spl index 44159b3..7baa068 100644 --- a/examples/helloworld/helloworld.spl +++ b/examples/helloworld/helloworld.spl @@ -1 +1 @@ -print("Hello world") +print("Hello world"); diff --git a/src/splice.h b/src/splice.h index 31bb9d8..1403268 100644 --- a/src/splice.h +++ b/src/splice.h @@ -264,6 +264,15 @@ static inline unsigned hash_str(const char *s) { } return h; } +static inline Var* var_number(double d) { + Var *v = malloc(sizeof(Var)); + v->name = NULL; + v->type = VAR_NUMBER; + v->value = d; + v->str = NULL; + v->obj = NULL; + return v; +} static inline VarSlot *get_var(const char *name) { From 5c31f4abfd03162b28e535dce88959cb354bff03 Mon Sep 17 00:00:00 2001 From: Reboy2000 Date: Sat, 17 Jan 2026 19:59:44 -0500 Subject: [PATCH 4/4] Added Optimizations and fixed Docs.md --- bin/Splice | Bin 35752 -> 35752 bytes src/splice.h | 11 ++++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/Splice b/bin/Splice index 38200a9e31fa7b2ce2478d4af55f31860774f096..6718b695c87deeaa8668190a3c56f9d8cc94e6d7 100755 GIT binary patch delta 4358 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 diff --git a/src/splice.h b/src/splice.h index 1403268..e828f19 100644 --- a/src/splice.h +++ b/src/splice.h @@ -1197,7 +1197,16 @@ static inline Value eval(ASTNode *node) { if (!node->indexassign.target || node->indexassign.target->type != AST_IDENTIFIER) error(0, "index assign: target must be identifier"); - Var *v = get_var(node->indexassign.target->string); + VarSlot *slot = get_var(node->indexassign.target->string); + double d = slot ? slot->value : 0.0; + + Var *v = malloc(sizeof(Var)); + v->name = NULL; + v->type = VAR_NUMBER; + v->value = d; + v->str = NULL; + v->obj = NULL; + if (!v || v->type != VAR_OBJECT) error(0, "index assign: variable is not array"); ObjArray *oa = (ObjArray*)v->obj;