TI-Basic (kinda)

Run Settings
LanguageRaku
Language Version
Run Command
my $file = slurp "PGRM1.8xp"; my $code = ""; my $line = 2; class TI { method Disp(*@args) {.say for @args} method Prompt(\var) {var = prompt "?="} method Input(Str $prompt, \var) {var = prompt $prompt} method Pause(Num $time) {sleep $time} } class TIBuiltin { has $.value; multi method new(\set-value) { self.new(value => set-value) } } class TIFunc is TIBuiltin { submethod CALL-ME(*@args) { $!value.(|@args) } } class TIConstant is TIBuiltin { } class TIVar { has Num $!value is rw = 0; multi method set(Num $new-value) { $!value = $new-value } multi method set(TIVar $new-value) { $!value = $new-value.get() } method get() { return $!value } } class TIList { } class TIMatrix { } class TIString { } my regex TI-var {<upper>||Θ||θ||ϴ} my regex TI-string-var {Str<digit>} my regex TI-list-var {[[l||ι][<upper>||Θ||θ||ϴ][<upper>||Θ||θ||ϴ||<digit>]**0..5]||L<digit>} my regex TI-matrix-var {'['<[A..J]>']'} my regex TI-label-var {[<upper>||<digit>||Θ||θ||ϴ]**1..2} die "Program must start with \"PROGRAM:NAME\" at line 1" if not $file.lines[0] ~~ /^PROGRAM':'\w+/; $file ~~ s/^PROGRAM':'\w+\n//; $file ~~ s:g/'='/ eq /; $file ~~ s:g/'≠'||'/='||'!='/ ne /; #$file ~~ s///; for $file.lines { die "Statement must begin with a ':' at line $line" if not so m/^':'/; given m/^':'(\N*)$/[0].Str { when /^$/ { $code ~= "\n" } when /^(.+?)['->'||'→'](<TI-var>||<TI-list-var>||<TI-matrix-var>)$/ { $code ~= "set $1: $0;\n" } when /^(< DelVar Disp Goto If Input Lbl Pause Prompt Repeat While >)\s?(\N+)$/ { given (my @m = [$0, $1])[0] { when "Disp" {$code ~= "Disp $1;\n"} when "If" { if $file.lines[$line - 1] ~~ m/^':'Then$/ { $code ~= "if $(@m[1])" } else { $code ~= "if $(@m[1]) \{\n" } } } } when /^(< Else End Return Stop Then >)$/ { given $0 { when "Else" {$code ~= "\} else \{\n"} when "End" {$code ~= "\}\n"} when "Then" {$code ~= " \{\n"} } } } $line++ } say $code
PROGRAM:PRGM1 :1->A :2->B :A+B->C : :Disp A :Disp B :Disp C :Disp A+B+C : :If A<1 :Then :Disp 1 :End : :If A=1 :Then :Disp 2 :End : :If A>1 :Then :Disp 3 :End : :If A+B≠C :Disp 1 :Else :Disp 0 :End
Editor Settings
Theme
Key bindings
Full width
Lines