From 0ebe183cfe69ecc2cc5b1c4de9de0bacd4d5753a Mon Sep 17 00:00:00 2001 From: Xander Mckay Date: Tue, 26 Nov 2024 15:37:08 -0500 Subject: [PATCH] +> (yield) operator and nice debug output! --- examples/mini.it | 25 +++++++++++++++++ examples/test.it | 9 ++++++- ithon/__main__.py | 30 +++++++++++++++------ ithon/__pycache__/__main__.cpython-312.pyc | Bin 8950 -> 9966 bytes 4 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 examples/mini.it diff --git a/examples/mini.it b/examples/mini.it new file mode 100644 index 0000000..babe06c --- /dev/null +++ b/examples/mini.it @@ -0,0 +1,25 @@ +from textual.app import App, ComposeResult +from textual.widgets import Header, Footer, TextArea + +class Mini(App): + """A Textual app to manage stopwatches.""" + + BINDINGS = [("ctrl+o", "open", "Open"), ("ctrl+s", "save", "Save"), ("ctrl+alt+s", "save_as", "Save as")] + + def compose(self) -> ComposeResult: + """Create child widgets for the app.""" + +> Header() + +> TextArea() + +> Footer() + + def action_save(self) -> None: + """An action to save.""" + pass + + def action_open(self) -> None: pass + def action_save_as(self) -> None: pass + + +if __name__ == "__main__": + app = Mini() + app.run() diff --git a/examples/test.it b/examples/test.it index a4fdf09..0c3929b 100644 --- a/examples/test.it +++ b/examples/test.it @@ -4,6 +4,13 @@ def fibonacci(x: int) -> list[int]: for i in range(1, x): start.append <| start[i] + start[i - 1] return start +def a(): + yield 1 + +> 2 +def b(): + +>> a() + +>> a() +b() |> list |> print a = 12 |> fibonacci b = a :: a :: a :: a c = b :: b :: b :: b @@ -24,7 +31,7 @@ print(d3d2(x=2)(y=4)) a = 1 a++ -a |> print ?? 11 |> print +print(None ?? a) # 2 '''a''' /* very bad code that is diff --git a/ithon/__main__.py b/ithon/__main__.py index 71e84a1..873f71a 100644 --- a/ithon/__main__.py +++ b/ithon/__main__.py @@ -31,21 +31,26 @@ class lazy_typegetter: -def translate(file: io.StringIO): +def translate(file: io.StringIO, debug: int = 0): def infix(name: str): yield tokenize.OP, ">>" yield tokenize.NAME, name yield tokenize.OP, "<<" - filedata = PREFIX + file.read() - print(filedata) + def dprint(data: str, prio: int): + if debug > prio: + return + print(data) + fdata = file.read() + filedata = PREFIX + fdata + dprint(f'---START FILE---\nname: {file.name}, len: {len(fdata)}\n' + filedata + '\n---END FILE---\n', 4) patched_file = io.StringIO(filedata) skip_token = 0 tokens = lazy_typegetter(list(tokenize.generate_tokens(patched_file.readline))) # Precalculate tokens - + dprint(f'---START DEBOUT---\nname: {file.name}', 4) for n, i in enumerate(tokens): type, name = i - print(type, name) + dprint(str(type) + " " + name, 4) try: next_type, next_name = tokens[n + 1] except IndexError: @@ -55,6 +60,7 @@ def translate(file: io.StringIO): skip_token -= 1 continue if type == tokenize.OP and next_type == tokenize.OP: + dprint(f"OP {name} {next_name} {tokens[n + 2][1]}", 5) # Most likely special operation if name == "|" and next_name == ">": # left pipe yield from infix("_INTERNAL_lpipe") @@ -95,6 +101,14 @@ def translate(file: io.StringIO): elif name == '*' and next_name == "/": yield tokenize.OP, "'''" skip_token+=1 + elif name == '+' and next_name == ">": + yield tokenize.NAME, "yield" + skip_token+=1 + + elif name == '+' and next_name == ">>": + yield tokenize.NAME, "yield" + yield tokenize.NAME, "from" + skip_token+=2 else: yield type,name @@ -119,7 +133,7 @@ def translate(file: io.StringIO): # yield type, name else: yield type,name - + dprint(f'---END DEBOUT---', 4) def transpile(input_path: Path, verbose: int) -> None: dir = Path('dist') @@ -129,10 +143,10 @@ def transpile(input_path: Path, verbose: int) -> None: path = (dir / i.relative_to(input_path)).with_suffix('.py') path.parent.mkdir(parents=True, exist_ok=True) with i.open() as f: - path.write_text(tokenize.untokenize(translate(f))) + path.write_text(tokenize.untokenize(translate(f, verbose))) else: with input_path.open() as f: - input_path.with_suffix('.py').write_text(tokenize.untokenize(translate(f))) + input_path.with_suffix('.py').write_text(tokenize.untokenize(translate(f, verbose))) app = typer.Typer() @app.command('t') diff --git a/ithon/__pycache__/__main__.cpython-312.pyc b/ithon/__pycache__/__main__.cpython-312.pyc index b03c3bfc43ee3dec81e0eb47bd01564b106e8d49..d94938b5eb41b2bd617c2736d8f86a95e3341483 100644 GIT binary patch delta 3576 zcmai0dr(x@89(RV-MjB)*%vI!V|nVzOGFDrK;<=36cI^G+8Eq;7qbWp-d$@Tmp~@A zg=E_-IVP;Jc4#LZu}&tmW?E;GncDhjj5Bpnn&7Q}^v~Kq5-e?X?6lMG+{-SjleTx} ze&_qn`M%%xIOlx#{-gDa-R2u6lODm7Rn>MlmN{+C#50@~2gldf8*|j-d6;5LGsU~qB=G7;RV=Q^u zkUKu63Udi-Q8fzen3_Q%%X1>?2PaQHrxC9S(=g;mR3);7dF>gssHOUgx5rqGV#pn#E_hnMKnTH zO`=(*6gfSC%$q6xX>^9;t!q^ljl7K_2yW5L+hxuPNDS{FIVN{8jR5umA~+42&ZMSd zqiAM4q4^PLW+pWiPSJEx&HOdYKZ0hKthpJyD_o_VR*u2l$Gn4QFq{KBsj-w4$;FUE ziQoAf`1=$mHKS}-6GklSUv?$?A7XiC^*HdIO)oM0M1>& zQFi42;V9k|oDzytu7Pu*6qAWS_WU|I3c3qQJW$MJ-bJ+S8MKMKmHjDSpO91Pz(iUA zOF{4emV)Y5ENZ^mA^;Z3&QlBJ1cF7RpCU2)%2{jf3-61NTb<5}oR5%Y2M68kJVj%%Px zM1CRDw`KYgP#pQ0Oka^{_xmh-tTvK+>1XjHGHrclTvGAAuuoDA3xT1>J|Zl5rHyq3 zS_OI=&!8zr#79~nFFb-$8XihCJd8$=PzuUkEU5u581}NlHjstwlt4vLh=O`N69Vns z62}h<xL}+Pk+VfP;8is^DLM|wJna<8pc2Ae*9{pC`Qv;E(DB(sat+&0ir?tCt$FAOi z;lQw8!u6?hf;>ljwv4Y!xO9{$ZIE!4gv&>na^SoYZV>2)TEg2T#~M;_DCigb!vnrU zfVYAC(pL1GgewL5ot4xh0sjCm)KOm5CkzdaGWCt4Onw7EHjY|W(@ZAfwMlF!EC^d< zeZlYJC9bQxwXOXbfqr5o7D_}+b{F1C*4Zm->ggQU`PA;F)^4GJ3YyN={kz&bTfJ$* z*FcuHQD~%GGhJ5q(c?ozd-r%6$ex3q)JNH8U2=PcA2J1AwZG9Z(Rw${5mQgSGO_cHN*^~B&+=yjKMu@( zYhLp)d(qwck$zshv?*?A`y_M0us7cG;)3DDc>j?_)c`4RRJX`B>*iD+=+5b8Uyd89 z=l3qEYVKNGv69a%`BU)AGg-Cda8BtbRg?T3tvM2kZhm7VRy{R7YhOq!o;|v#^^yt4 zw$eLBYjj`C9^+!ZSzYYqx%|1d`KtM&Ki_h0_r?5$vif*wL)_MQ2`?I($gdqgC8wMg zvdvk1;gqu$lk*wY?Ss>Uv-{)DvRjt2B}-Op$F%7!{h!huG22`2S=StYD}U2nXYNdj zRziF_?kv4!DJ7p|9Nx4XU{HF&{eA|i4RKS>EdGP4;NjnV46}at+>m=U9G45 zHJG56ME-2}RuR-irTChA8q(2r64;}Fb1EYTV;CVS=80Lkeq&a(& z;Z}To4IF~rhwT@Amojc|ZolpM z#-gR;0gJ3z(aifgWGz`XBXj1Py;Hr5rd-mHQ`ixI`oQh>=WlQ6T{Ip9MRQ)0y< z8$5czDe|LGCOH0WdSy$2`m(#RrGmXupl&JEU8zvF)Mz9emY8rzc$IvZv!jZJd5&2P zoQ6v~kjJCkER%e*h64ls-a~`D@LgDnT`0-Djx$2Q3T>3oKYXuVpj8D(m8Zfy0<6Rd z{=uPd`-Sh2?H-pp3R7pu^PZpN(aH%vs-X^#4EqI%gCP(+EYMmB5t5f*GJb%vR!Ve~ z&`lHQ?H76}q5t5*3zX2NBUfIaSxD+08Ibi24@;UuLxY39pc1n{-3zqW%Pn2WOdKyZEjdBHpcNfC&Tw!Gtz}QVITUBehk#KdN*Z^3bGd69UAhlyobyCc(My*>P2M z+LPY7zjN>J{O-BuzWd($*TjED-Pc_%2f-^;W;=GdJmU_+P-fRg=AVJ!Q9)DBNwP@GL-%{YiWsmYFWqtDCO=uZbYf0DD!6OB}3!A^lLPJOVt|{AI(o9`Ef{g%CF7 z3^_m-@?&hdF4DY&PD;=@&%6xb{d_zST`ly^I@ryyuVZH{C2C?y(p`md-Lr#A3kcVX zF`_u@XKy-vY^@}CM%Dv`Q9~}wGeTB{r(YrDCzw}CN!bjWiR>x$o~-PK`hGrdASy9r zL(wFjdkAln??^cfi7JMK{WwcXO1Bzz-CLM%wvv#{t6ulwX(<;NM*-TU+5Cb$j`*!r3j_i?mjBK3>N@5q_~`F{xG$93M1ySt@OS^DX%H@5K397qaamU2)JLW z_W@F?kZwe=GE;0niup{`ZQyR)tCLx+aypA0tkVF%hX{nxWmJe7PPhsRd`{o&H8^T)?8LL zmHF){>iivbs>~dCRjq8Ws_d|*Ny-0`-#5|u`~2TZ z?aPx(tP2ajaSi%N6zb4i+9I5B-BnT6e7@OfFLqM<7X z9XW7NJNipP-@uYk+mAv6vC^!#sMDCl>@v+2ctb~3KecFeHWdf5@2?t*W!aYAlP>1*8X_1i6$v4Yn zOAzJg`QdGX%^f@OR;)>HsIRE6Id6LEmmm97QdgSKKF(6Xu3i7|hSr)ky|vq99OUYA z(h96}eo|g>&aon`XrJ0$E86PFEqjRF2|mJ}3BAMK3whaJL*46-RW<{=UiFOQ_CbM1 zesjmc2CG9*#(rE~dnUKYFrQxx1t%1^ROO6Eg-cC?GCG%AAl|K9ZjB(`a6){avQc7U z?C(`JT8BM2aHSXG1Im@YcEneA!vrW-TR6TJf(c2vRynMob0g}G@0D+~iyU_X$9pA? z_rXL6n_l3~0Jnbx(@JQWKiur#-yy6N*%=~+iNR~^FEwW^rB9LO#5b9kw=eIzPhuIwLa6*r>tNKD;ml}Ea5SX@~puDsgcBj7GeF9-tp~;i;KTFc**`9`wd=|T2 zVu^;gBD{9=NzRb<(+f#F8raOt9iu