From d8a0936b1d4137a0e4fd7b23cccae0668a4df47d Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sat, 10 Sep 2022 19:46:20 +0100 Subject: [PATCH] Initial commit --- README.md | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++ toylogo.png | Bin 0 -> 11709 bytes 2 files changed, 69 insertions(+) create mode 100644 README.md create mode 100644 toylogo.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f38f2a --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +

+ +

+ +# Toy 0.6.0 + +This is the Toy programming language interpreter, written in C. + +Special thanks to http://craftinginterpreters.com/ for their fantastic book that set me on this path. + +## Nifty Features + +* Simple C-like syntax +* Bytecode intermediate compilation +* `import` and `export` variables from the host program +* Optional, but robust type system +* functions and types are first-class citizens +* Fancy slice notation for strings, arrays and dictionaries (`print greeting[0:4:-1]; //prints "olleh"`) + +## Building + +Simply run make in the root directory. + +## Syntax + +``` +import standard; //for a bunch of utility functions + + +print "Hello world"; //"print" is a keyword + +var msg = "foobar"; //declare a variable like this + +assert true, "This message won't be seen"; //assert is another keyword + +//------------------------- + +fn makeCounter() { //declare a function like this + var total: int = 0; //declare a variable with a type like this + + fn counter(): int { //declare a return type like this + return ++total; + } + + return counter; //closures are explicitly supported +} + +var tally = makeCounter(); + +print tally(); //1 +print tally(); //2 +print tally(); //3 + +export tally; //export this variable to the host program +``` + +# License + +Copyright (c) 2020-2022 Kayne Ruse, KR Game Studios + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. \ No newline at end of file diff --git a/toylogo.png b/toylogo.png new file mode 100644 index 0000000000000000000000000000000000000000..4a39362bf150a4cff902a8b1bb2143480e44c381 GIT binary patch literal 11709 zcmdsdcT|(#wqQ^c6lo%&AfPBH{fG1tP^3ujAYDaT5Re*5AXorJA<{%@lujs7B$Nb# zf`HO{kdlB=AOuJ#fdBzsyff>*S$FQ-_wKCuYu3tH-}=6FviCl_pS|}BOLIfclY%D! z005`aZ9QuMfCbB3o$SY%UpN@6`pn0PN4FhA006G`KZ~U+u>1k@n)cw>U)$dyacFoNjw zqvut>0|_CNeQW_N5k|0R%%iYzME)*_?%$4hc9+U$1ZxDc0%S8npG@7F{iZuD!Xz`D zT@>(H>KQlSE`J*v;KRweqkuc{R2D#$E*$`{KM@iQP#d^BW??bB5ir2QipGFOy^YdS zz|mZxTyvjpJRj8(AKp0HumCtRvov47W0Esna3sH@!WEUrXt?8N`Z#eV?! z56qVB0ldYHm!fND@U3{FRcLTR$i^Ru#0ANkCFcZ@?jqeq1x4Odu-3n3^*)>^(_jJE z|7(bU7vDc@duW~fu2xgd1@76Uf$cvJ&(g$pzL%j0774%L)z)+ih%7qJkK0|2xN-3! zgk8$)y+~#!D@ByN^o<98a9|C}jR}{zX!!`i_s@0ZACUe1l*ZK671oGL9)s67TYheB z?HAUokTT{{dWn8r5DIQd<>B-_s5WTJWO#q%lsRi7jQRz{`|*V_S+h8%wY<77``!f} z9BMBW3WY;J0p~tj{0{=~YhUsxj2nU~-Q=vmJXP0d`=E(4^##mN&s zfl^iaqu-D8)UWCAx#-dF_LnQ{9j*-*q$x|uxXsVrupGcL->o}@Ql(t9r@lM}EUd){ z{0n>dXJ@RJc}iGPUll8%sgDmS-^cvYh+^DLS9p|R;0kVC3j@A~R6L6b5*FP%>|c^?x|pSmysP+nzN60kcWTC-Ww1Pks1W8aYCX{C*ng4%b=LrD-mJ*sdO#zDWm|jIK;o4z~#+ z-3cYLtZZd0)9wG#v$d_9`e1{TA#Lro#74UMejIP!1hcUPyBWzqXINfPzt~rhhG9?= zt%s~yJ)U#yF#O>K!2G{$PbZz+8(;p_ma}oT zEC9yxneE^AME@th@pn`HTXYcbU18z5=;Txk>|i>?P#3f0DZbAZJlYZ7Jq8u;a;Izn zH_C$kT_^Dmapyk;6d?jXHo0~9X>dh7?nXnAV_3jIT>oXrS)a_Gy5SAU;n7?GD%-s@ zx$tQA(8<3V*Z>!ejQQMc_6rR62A;71?jDm1VEHf1E3=3)z5epaLKvm|!qHEFFJyV? zrOjMer|_CG)K%Ld@~OuuGgj8Jj*xnC|967=ut|ytwyykCeBy^0{=xGVRzfMeITk&~xZ;!LPk<>R}Tc^##j{MIU`k!a{zY0#>L-4MJql%#@b4v?86BccUQbEp9(P@!( z>B=r+N!~vq=zVhCxBLDAPT@56LB}S#~=r(3H5qCJ@BHhx0TaoM)Oc$fUbau(wGU?;C>N+r;CN&dd_BLbIxxf=Q z3}q``*Ep_jo$=Z)`i!9hov#3EJJy02-4#q~xj?p`>Jg^Swg|CIKN!Nc5M+li=SMhH zI<>CtGLL7UYHU|E%#VC1UV*V5yXBi?-)Pdx0iZ&k4ICQ-4R%dd!Rj1)?27p(-|Mc} z_1p|1mx~yW+zqpNT&rXa3~gS|MBIU25CR+#o>P41SnX777Ufz=do%8nodh}Cbn8de zX@C0{UcT{HzF&szR=n)2Y&FN-$gk3FmS(*x+qUp-Y_i0AGqqq;Y$Y`sp43ob=4V%h zk{W-SgS-|`e#kk#t!!Q9_qwgIQ6NsA9S&QuZ1VDX!Q3wEkUB-YVBM0l`Q**wFsJY&TKgx20_HLf6M;n&SDK-*Z z+`0ppJ=caa5=B^UFUqzc>_8mvW`(;GrAA3nw~uuXb846oM%d$n1<%}gJy+?()>6i) zVZ`n8N@Vat^(p#d%*@G^LGI0rlc9;FWW|Oq764ofvSM3h>{<%-t2(ISwq4v(OK~c4 z-Ay^Du-Uv?JudgRO&1|Qv|-0Q;FEfm*!Thm)xuyo}Z>3t>6+M9*>Vr2h=|cR8{WA^UoChQt(l zip7GYR&gg8=glcp_QB_nAoG+e+~Kini6ciUm;YF?VziyjTrve#kwcSKM|P5CVLV5s z6I2U^_WTMomdN1+5iq62;G=vyu#Uq<$0;e5=>6T0!=2QhMH|9--&EDcBF|+aa2>l@ zHAB!B_?wfXTOBLh+kWZB(;{qu$#|-8oA+etrJT|QTE$cm9n~?3V7{Dp`nh!tFss}K ze(jCAQxpbQ>8?#o3$u)03Qawz(A-2%6#?QL*a%0!Vy7LoND)MlyF{2i5ukuyt_@=iFcw2SiswOgG_!#SdqxGtOhh6H5mAW6Bi@ z*G-j!<`6G9a5c*j{;TPQeJ$yz5{I;$b_Q|p?T!=j6YV*EFidM({`1!a;~fQjYiwZ5 zCxp{cV$W^sl>mJu=$=q*xx}`}`Qu>LPWYWf)3Kgdz7__}Q;_DCY5=h;&PYSIW94eG z`fL1qU<*=H0NgyU;jnZ!ht4i5l3xO|=pUMVqJ&C_c-0%DM)7-!t%Uj})OZz<0oNsO zO-AHwBi*TA*fhY-ftg>uHB~cU#dZNWr2Aep=a-db^ z)jGw?fpiC(+JC(Kp5n& z&wKq@D}Aqq@;LUE_D{@=onCSabsGy3pyJc7Trn`^hSr20i zJnqf^H3RP45KeL5Zjm01p(F+FNBFwb7l=kW-_S!we-ECa?t=NJELXR#)zq##uX%5N ztigpkcrT*rO&bpHV*{FhKQ%X`+$D9O(2PKnumQV3-^I3kZD4pbum~1b>4nianwRP1 zTAb?zuiP{~Bn(q-FqXuA#soJHH$I$Ejw~e@x=)I(3VFNx#B5&SXy2|GC!YioCnZL# z!ursgL%-292Z|IlCcDVb^9*ir0W3321It-kXGaULK+I`#LHQcyjxKLjbF^%tPp?CivO~}m*Y`pTJS|77P7*}yNSG*HGf>x@ zRtS9x7vl{i%+WJDJbj(w^yHBbehUn3tYnwm@G_%2jg?Z!Ml06w(q!(#M~MOZV;E!k znlR6Orrz$aZ^dhnoe0pAXTQUX<+d#+G=)Cy zIIlQPE`%b3f4h#) z$A=B_+9TuuuMg(mWL-=Cu(tigE_JNJNN3arWM8?48YsY;3+Q|trlaxaX!vl~ovZHEJpkK19`B3PrC4Be zWs^BOz2nZicMP;}R5qiqzO|HqZA}_-i8* zJp7=eR5TX;mAa^=FJ5AjHoV7eGq5ILk|rp%?K}14$K?8f^kmEZ$FWhAtLPOZarDf+ z)hjoG8q``eN|61L;nm?tr(*8aCa0@}^=Dd_4q9n^TV$2cs{ZKvA8|-gRAiR9vkPLq z+?K6usX5Hmkkt87pj`axp{k<}PYXTDTjlF*vZmhA{=*6fWU~1dB@o2L-c3c7+qI6# z5XmXA-nj|T#`YoQ>&IUWDrA}2d3|}oH1`L(wNdcc>^}?fvH>*40Uc2vfFjNlD3l_j z7R7}&tOgBbmW1>f+|oz-&B38He6c&K-`nv8UwnLEH94ZzRW>@3L)dRh4PEMmH=eth zlLQTmvW6>flpV}D>UUn%42CqY{`Q6pkZk;4|8VW#+a4qD9o|`;SR2{p8X`esZ}Cy! zBcw%P897CZq8f}lEPw0S?&|gEOwU`k<@lWGjUFgLDG>bz7y=tQe|P+2WOkId-lsHj zpL^(8Q}pW8J3@0*YRC{-{Z84;j_#no#mP1*s=^FRHY1YFBco9FD}`cWrOs)*2KGvf~R4Vb?0xM2THQHZ`Z!@%k0%oz33eh-`U(Uw$Np^s&K;_$f((c zM<;(AXi0Iv_TxSpjBC78QE>?w=sxU(#jJm`%?u3kE)#wm}@vU8x0pE+o)Zwfdx}0oL24~ zEhQh_DEOeJoFznZKg*|tU!I`V4;tcY{R7gjJse>p%gj)Pe|b|FDEX~zyFg{pX6GOu zm%6#zZ2DAZYGuTOD=)a(e18UdMueE_oq%$%C?Q7+288w@zTS>eTg}bta9Eixwh+M% zEnfI5&?mMYFJjC{DfNqdACMDPkOqp`qs_<37iIBG52Zhmfmryat|<>h1m#=6RA(7* z&^K7@!meF%>kw=Fxr3^}FO7i&?s`(b0KIwONPE=$BI-RYX(2Kw@mJ_(+6J2wA5ijn zn?spIOR=W`uJ>Ba&})6{RN|xA47l%NX2afcME;OPc24nQ1DwoqR-x+;LTna>KIClc z{Bt$^*IY9(+Kb$GY3wWIBJ=1>|G$%B5ZJ8GBnyoLXI}Tr5!w zhCun1=AxZMgbOhSt9c?rKPH@a{dDEB0hvuC$`IB8JFu5E!?rq{KJX4jUTAT<8_3ARPiQKX z4IJc-$i6B#b7d~Kn!gj?0A^sYkqxTrlhG-SxY8+X8E+@fM<+I3-lA&2Zo+mVI|<+H77ythbklP$M(@ra)) zQbRDqXQB7)&xwH*^_A8%1Kfq?;th<%h3FrnaX*CbHTPCV>qD={5Yp<7U&LZ~Yk2S2Y(NZy#!^Ezc! zGeirY@2pg3P@!66X=9WxKJ+Qy7x%o;s}7&oGNkH14zE~gh@;TARr|DYO^cqi(PtPp zv8Y6z!MRGC^phyuVos!xCOGUz97hdp=!%zcSs)+J4nYKk|hkV<&Au$Hvp@J@b5lom}5=Ci^D*GiUC=YQ&;eIToq@N{j%D zG_*gN4t~2o&@?%5)HBBa9aoG^Q~FkDGH}UHrA4v*^A)NC-|?-%p8c)krVQ)Km!Tt7 z8y8->K^h>13-NJW1h4GYRCRxgF1d2*vxJJh?+ZH-f+0WoORi+k*!u?x1h%QVE`9Z` zVTb&I(i8xUd<#`;SsqTPH#Do<~RJ%siLbmd>5 zI<;XGqH^7*?1Inil!}+8O~~^g259(nuNV zCBegFPI%8U+mxg@O&DAFsjI>UqLmz}o&X=U%sxXJBPVG`jm#PGuuE`u<4j_}d#(&@ z68@}ViYQLpkXY7tF=~Y=G3m@7IhCg4PJ;)>NCrZlfF2Wsl zFlvzkV(t|$xOIMg+TpVQ=${YTI;*b3bEJ**GkKzCEaO=w`n@Powid=Vf+|Z&~ z;{tz2m;$sT>>X2VW8arQ{SXt>3@7U~Tq>i7^JIO!*0vZW`~DJ$leP+5T+M{^CnED4 zUn4zEPh%D(OS~2Y1Zp1!{i5q3Lyl-bl0gb+w+As@__Z+3G^)PzG(E@6aH8cmd8=k; zg2@!0w!)OypbWk=zi?8i<3fc=yyBE(XQ{Ve+l)M4i#a=$8n!xgV}&0-dN7!v-z8Pz z@c8J+TklbUR)70XeP1zsHHQIz+dDkw0yjDb34!sDG+p zwT!@>=`ThA@YhoB7~U4G2E!AAEW+AE3SDdx3Q|^RKpstRY~R$xmZQDm>m#61sHm(T z-ik-eUz!aJ(=jg!kW5wj$(e}M!0tOJcODx`F7ZsDQ*qXB==*t%m41OUgz7|QMuTGh z(LI~H2X9K*o<8;RBx7Hld!phb(IL!h^&w$nOc2o>sUmvB-W23u)*SfeZ@mrUL8hkB zf-XUvH~3m&{e6mmur+A-R`j~74dcNOf7w2euL`v1*r2185lO>;k|T-ohO%|do_&!j zE^XkOq==rc4}T^v^SrIWbRHf%h$`Q=7!B}Wnt1wzr9rRED|XEs37aaqbNL<9SM6u` zhPL?c;C0gFl-ib8&YC*~s6js3B{P#<=+}w*Q;#LQf9Z)opoK=Cs$}|SgP!Gz$F4ut z5XrRFSZuxhMzpiWZ$5vfQd3YR!n3#<%>7wMi`PiMz@VA`U2^J9L_f@I-> z&R4Wae};X+fwV@rpRP~i&ehuhb{S?AQdlZ^l-=SGKnudV+Kx=muJXN$@vP~kJpKXg zDB#*hzkakaaEg`Z&Jk_MTGB92_RL4fSP*_jXJVM=0)=jxC|_D?)Ra339k}bGm!aDh z(Zx3Vjkz~1G-+-mA5%+2VWx(V68=?_-ggDP$106BP9-7<-7P15{SWseQcrk+*I9Vp zJ`sZu#|ZSCm*(Hqm;6A+;ev0!I)>C)XI|gy51Xw`$)A5^dV6c_3gC&A<+H%5T`3bh z!E2U-!veTV8cXP|jcfh<8|w5hwB_}TVV=RPH;d|8{o#CLp2%}XXdvp^HiRekonZsi8uak{yu_)C@T|` zkrzBrHFStee=Lk4EWvD=MqDm$1IL?NX7u7eYf*Y3%6h^F$9H3dj#7l(b0;_B<^|oi z>(p~K7=G;@d}s0>Ztc7R9I>&Cm$x~w`#wb#?d54*?51-_#ULD3C(286jGyv_;a@s| zAc6hZO5@RJv#za$jN(@ZUWApS>@GL?wT*U@JEeQ6fn*fNZn>8D(rX>u_+;VFOpfIK zk@IGtp}wdNI@()@&?NOtRE#-Yp#5hSAomyMOx|LV5r7r*j>Db1 zCFuI8k2usCt6-a)O27`5)RtS?X==vKC7fUuCi$Zb_H6w^XYyn-1+niuG*K5`D?BRJ zy5t2PWV!h0m?u->18B>S*Y{XAe+C3a9jt#zWHj|{xGQOxL<38?X{F=m+_#6JGUUO8 zQFq)*V>**;fDo%cJvgH(S80fj4jEXj7%%|ujl%+SblT}Mc&8e%edGCd2m>=U3hls~ z3%3(bSgpSB-t!RysIX5ml>n*i7V}^WU!wxsT;yy=wHW?Xjb$dpUYTd*R5f0z8rxQH z(8>{GcSC2G9@>?G>?aW4MlPT0D9)Mr$ado{#}ZZlnkjThzY|vt;~IfORh=@~{Jrbv zP-V#j!B;pz<4wDXYr;-fNX$BmU9j&0+>+q2d`8st=x2$W!rDd}u1Avz_=`s3=M~V~ zDGCT<`qGQp+<71p9pe?quaZ1&b}f<$~~peMCWABp*k7m&*u z!(^IOj0G@s(U~)^PFBYXj0e|BrEL?Y@x!C#G$haylJZm;;V3`~>Kig9`WcQXlgqYa z3kT=N%|)db=!$1Va%Z1b04BaBQN<;l29^v@X6=~Z!Sh!Z3w%9n(|9i%IUO#ggKAWx zdp_gr%FWYhU}lrSVf=9JmdRLHbf!hh*miGEOz;Ij_(w5F8naKLWVX;)8*b(HBp~`x zp1o++``z`^)sZA#hxt3m84b5>bnw)ZEBTw_Z_I!P#cr(NeeD{b|&0L&deZ6ox} zGSVr|V9%AMXY4bFiF})r8QM;YiMNm{jTIlCe2y**5)+qIJsUk(XZ2aThK8CvqgFcEHv4ax2wQ^ z%VB$2`EZm5jxBzka29?+ULE@GPp18y38xD|HL^zBrfQ?!NlP!uR^E%`uM$v~lUhHwE0}BYRgnPF{?-BcN^6ZI{HX zq8r=4@>8sPmaw=sidw3e3Pl}|KiRz2pDfFzC85b@XAq7xEj{VQgKzBjmup~S&F^k;wrOmI(_~2jFO4Y5G$};L%B)CuqcPts69&DwPdz#;sp`kr3P<= z*_8_rvg#_#;wLLr>zqbVdK@UL>ZNIX7IxM*J$7^UwD8_{Ik*Uz4lDb338g=ubz4@L zL3CLib|=?1);Q(Iq~Var=S$TH`S4YfQ&|ZZ@bzxN@dS%Bb6a^}nRM8D5r?9j84*M2 zx?9X&1L)2DGw(eztG{$x=lsklJl7#<90sz@2HBMgRu9R^4yj~TZfL%vPl5|vDii_( zX(R;<98z!{cAhxm(bk&3|IwD13rk3L%u%&6*_dpypcd{QdWR;}#d%9<_AfE5^8x=N zr)yaV4Qz*waH8Htfkt)xhjn+hiLbckebeQ37EYSwG<_-S;)JD)3`z%XlN4AczIPAM zxm4_9l-v)?j7k|l`{_HghfIOkb+z8lH;nHoW>Mv$Xj2O0&fvIRqCBmAw z+{EWMgMLi_mLKeQ$R?gH<(bKi%3MF2;j=WWYX@B!(w&fJUbYF5_e&&tr82tSQ@Ep2 zTJP)-dvz>$Z#*Ij6L?)TqYwu>5iPql*AL&>L*LY6>>C*Ku4a&qrbQ<3@#paAmEJEb zcap&n!=G!5)0HCDUz5H4c0c4t?O=}DiuzNawM<=0hNG+&4!x5Lm+~+ah3ndmR}Z(0 z;`N&vK5@m(dQu#MCla?Fw~VbSy+)^^8;sYz?gj1O>nrLQeeV z%%QIzPlmS)4UOcuuSX~?d2dTbKhSK5I`ZUpNKCRZ2S-b6%$*0Xm^q}Tn$;s_fAY10 zPlkEU?pu6rc**E=xeb20DxEM{=y~}%ty_G*uEHW|>T2Yg@s6B zqv&*@8(*vUL*Qr8m8oU}#8%pCm^qzj<46_FBaM41kMvDC9oSYjG%ila-F$60|&8Cj>77T<=S1Vv5`_dwwa zY1Yiql(b<^5?j3(Q4t6z z<;9vm@97=;y65G4u#$xcZLhtBl>pns2dh>Ob{smrPb$7$EtFS7J8F%Jy^E;dG7V?c zKmWRZoaWl(a5QVh4z4WTJ-Ku+R{oLnL*sXSS;lb42WI#41J4|}c=6Y%{DU%F-6jcB z7u9)dm=}Lj{Ee#5S2lgYwVSC|eBD8HN$9KPYSQM+^wn-!*1W@UO{(vCz_$0Z?&}mOqUuHGZh$VcEJ8o8&4!IURdL@6S0lYcaqBCAFCJLsj z-7~9pH&8hD)$0MdxB@0!O|Wb*WC64-_a(9u~3cKFjm8^y3Tq{#R)jJFiiuBM3Rc=Pk#^94lQ=A%UFe+M3K z1abi&9Az4ui`OIS`WaJN{*XOKW)bi;BHTYH`U?D|v8i3_cZUjsy2Bb5cbxlWNW!yc z@s-=8tO{JQ35uBBfcgpLzOaRFy>Xfe`C!4V2%CYAcGZT!_hnOy!4pQLkEVxE_bS>1wB00*(mHZ750t*`!Mr?sB#)Z6l@{44K1! z#jZVg98+kO_opQ;$6!e15y5)LT*o*t22<_)Ou|2HYh66qsqfc