~! in format, prompt flush, ,load repl cmd

This commit is contained in:
ESL 2024-07-13 02:41:19 -04:00
parent a2da6a23e8
commit 781fa509e2
4 changed files with 135 additions and 144 deletions

34
s.c
View file

@ -1,4 +1,4 @@
/* s.c -- partially generated via skint -c s.scm */
/* s.c -- generated via skint -c s.scm */
#include "s.h"
#include "n.h"
@ -17,7 +17,6 @@ int dirsep = '\\';
int dirsep = '/';
#endif
char *s_code[] = {
"S", "let-syntax",
@ -1028,9 +1027,9 @@ char *s_code[] = {
"${@(y7:newline),@(y14:make-parameter)[01}@!(y17:format-fresh-line)",
"C", 0,
"${'(s78:supported directives: ~~ ~%25 ~%25 ~& ~t ~_ ~a ~s ~w ~y ~c ~b "
"~o ~d ~x ~f ~? ~k ~*),@(y14:make-parameter)[01}@!(y18:format-help-stri"
"ng)",
"${'(s78:supported directives: ~~ ~%25 ~& ~t ~_ ~a ~s ~w ~y ~c ~b ~o ~d"
" ~x ~f ~? ~k ~* ~!),@(y14:make-parameter)[01}@!(y18:format-help-string"
")",
"P", "fprintf",
"%!2,,,,#0#1#2#3&0{%1.0p?{.0a]1}'(s35:format: no argument for ~ directi"
@ -1044,18 +1043,19 @@ char *s_code[] = {
".2d,:4^[62}'(c~),.1v?{:3,'(c~)W0.5,.2d,:4^[62}'(c%25),.1v?{:3W6.5,.2d,"
":4^[62}'(ct),.1v?{:3,'(c%09)W0.5,.2d,:4^[62}'(c_),.1v?{:3,'(c )W0.5,.2"
"d,:4^[62}'(c&),.1v?{${:3,${@(y17:format-fresh-line)[00}[01}.5,.2d,:4^["
"62}'(cs),.1v?{:3,${.8,:1^[01}W5.5d,.2d,:4^[62}'(ca),.1v?{:3,${.8,:1^[0"
"1}W4.5d,.2d,:4^[62}'(cw),.1v?{:3,${.8,:1^[01}W7.5d,.2d,:4^[62}'(cc),.1"
"v?{:3,${.8,:1^[01}W0.5d,.2d,:4^[62}'(cb),.1v?{${:3,${.(i10),:1^[01},'2"
",:0^[03}.5d,.2d,:4^[62}'(co),.1v?{${:3,${.(i10),:1^[01},'8,:0^[03}.5d,"
".2d,:4^[62}'(cd),.1v?{${:3,${.(i10),:1^[01},'(i10),:0^[03}.5d,.2d,:4^["
"62}'(cx),.1v?{${:3,${.(i10),:1^[01},'(i16),:0^[03}.5d,.2d,:4^[62}'(ch)"
",.1v?{:3,${@(y18:format-help-string)[00}W4.5,.2d,:4^[62}'(cy),.1v?{${:"
"3,${.(i10),:1^[01},${@(y19:format-pretty-print)[00}[02}.5d,.2d,:4^[62}"
"'(cf),.1v?{${:3,.5^,.7^,${.(i12),:1^[01},${@(y18:format-fixed-print)[0"
"0}[04}.5d,.2d,:4^[62}'(l2:c?;ck;),.1A1?{${${${.(i11),:1^[01},:1^[01},$"
"{.(i10),:1^[01}X2,:4^[02}.5dd,.2d,:4^[62}.1a,'(s32:format: unrecognize"
"d ~ directive),@(y5:error)[62}:3,.1aW0.1,.1d,:4^[22}.!0.0^_1[72",
"62}'(c!),.1v?{:3P71.5,.2d,:4^[62}'(cs),.1v?{:3,${.8,:1^[01}W5.5d,.2d,:"
"4^[62}'(ca),.1v?{:3,${.8,:1^[01}W4.5d,.2d,:4^[62}'(cw),.1v?{:3,${.8,:1"
"^[01}W7.5d,.2d,:4^[62}'(cc),.1v?{:3,${.8,:1^[01}W0.5d,.2d,:4^[62}'(cb)"
",.1v?{${:3,${.(i10),:1^[01},'2,:0^[03}.5d,.2d,:4^[62}'(co),.1v?{${:3,$"
"{.(i10),:1^[01},'8,:0^[03}.5d,.2d,:4^[62}'(cd),.1v?{${:3,${.(i10),:1^["
"01},'(i10),:0^[03}.5d,.2d,:4^[62}'(cx),.1v?{${:3,${.(i10),:1^[01},'(i1"
"6),:0^[03}.5d,.2d,:4^[62}'(ch),.1v?{:3,${@(y18:format-help-string)[00}"
"W4.5,.2d,:4^[62}'(cy),.1v?{${:3,${.(i10),:1^[01},${@(y19:format-pretty"
"-print)[00}[02}.5d,.2d,:4^[62}'(cf),.1v?{${:3,.5^,.7^,${.(i12),:1^[01}"
",${@(y18:format-fixed-print)[00}[04}.5d,.2d,:4^[62}'(l2:c?;ck;),.1A1?{"
"${${${.(i11),:1^[01},:1^[01},${.(i10),:1^[01}X2,:4^[02}.5dd,.2d,:4^[62"
"}.1a,'(s32:format: unrecognized ~ directive),@(y5:error)[62}:3,.1aW0.1"
",.1d,:4^[22}.!0.0^_1[72",
"P", "format",
"%!1f,.2q,.0?{.0}{.2S0}_1?{P51,.2?{.1,.3c}{.1},${.2,.4c,@(y7:fprintf),@"

View file

@ -1964,7 +1964,7 @@
(define format-fresh-line ; TODO: add (fresh-line [p]) instruction for source ports
(make-parameter newline))
(define format-help-string
(make-parameter "supported directives: ~~ ~% ~% ~& ~t ~_ ~a ~s ~w ~y ~c ~b ~o ~d ~x ~f ~? ~k ~*"))
(make-parameter "supported directives: ~~ ~% ~& ~t ~_ ~a ~s ~w ~y ~c ~b ~o ~d ~x ~f ~? ~k ~* ~!"))
(define (fprintf p fs . args)
(define (hd args)
@ -1988,12 +1988,13 @@
(when (null? (cdr fl)) (error "format: incomplete escape sequence"))
(let* ([w -1] [d -1] [fl (memd (cdr fl) (set& w) (set& d))])
(case (char-downcase (car fl))
[(#\*) (lp (cdr fl) (cddr args))] ;+ CL
[(#\*) (lp (cdr fl) (cddr args))] ;+ CL, skips 1 arg
[(#\~) (write-char #\~ p) (lp (cdr fl) args)]
[(#\%) (newline p) (lp (cdr fl) args)]
[(#\t) (write-char #\tab p) (lp (cdr fl) args)]
[(#\_) (write-char #\space p) (lp (cdr fl) args)]
[(#\&) ((format-fresh-line) p) (lp (cdr fl) args)]
[(#\!) (flush-output-port p) (lp (cdr fl) args)] ;+ common
[(#\s) (write (hd args) p) (lp (cdr fl) (cdr args))]
[(#\a) (display (hd args) p) (lp (cdr fl) (cdr args))]
[(#\w) (write-shared (hd args) p) (lp (cdr fl) (cdr args))]

View file

@ -2244,17 +2244,16 @@
(for-each print vals)))
(define (repl-read ip prompt op)
(when prompt (newline op) (display prompt op) (display " " op))
(when prompt (format op "~%~a ~!" prompt))
(read-code-sexp ip))
(define (repl-exec-command cmd argstr op)
(define args
(if (memq cmd '(peek sh)) ; do not expect s-exps!
(if (memq cmd '(load sh)) ; do not expect s-exps!
(list (string-trim-whitespace argstr))
(guard (err [else (void)]) (read-port-sexps (open-input-string argstr)))))
(define cmd+args (cons cmd args))
(let retry ([cmd+args (cons cmd args)])
(sexp-case cmd+args
[(say hello) (display "Well, hello!\n" op)]
[(ref <symbol>) (write (repl-environment (car args) 'ref) op) (newline op)]
[(ref (* * ...)) (write (repl-environment (car args) 'ref) op) (newline op)]
[(rnr) (write *root-name-registry* op) (newline op)]
@ -2268,31 +2267,24 @@
(name-remove! *user-name-registry* (car args)) (display "done!\n" op)]
[else (display "name not found: " op) (write name op) (newline op)])]
[(gs) (write (global-store) op) (newline op)]
[(gs <symbol>) (let* ([k (car args)] [v (global-store)] [i (immediate-hash k (vector-length v))])
[(gs <symbol>)
(let* ([k (car args)] [v (global-store)] [i (immediate-hash k (vector-length v))])
(write (cond [(assq k (vector-ref v i)) => cdr] [else #f]) op) (newline op))]
[(peek *)
(cond [(string? (car args))
(display (if (file-exists? (car args))
"file exists\n" "file does not exist\n") op)]
[(symbol? (car args))
(display (if (file-exists? (symbol->string (car args)))
"file exists\n" "file does not exist\n") op)]
[else (display "invalid file name; use double quotes\n" op)])]
[(v) (set! *verbose* #t)]
[(load <string>) (load (car args))]
[(verbose on) (set! *verbose* #t)]
[(verbose off) (set! *verbose* #f)]
[(q) (set! *quiet* #t)]
[(v) (set! *verbose* #t)]
[(quiet on) (set! *quiet* #t)]
[(quiet off) (set! *quiet* #f)]
[(q) (set! *quiet* #t)]
[(time *) (let ([start (current-jiffy)])
(repl-evaluate-top-form (car args) repl-environment op)
(format #t "; elapsed time: ~s ms.~%"
(* 1000 (/ (- (current-jiffy) start) (jiffies-per-second)))))]
[(sh <string>) (%system (car args))]
[(help)
(display "Available commands:\n" op)
(display " ,say hello -- displays nice greeting\n" op)
(display " ,peek <fname> -- check if file exists\n" op)
(display "\nAvailable commands:\n" op)
(display " ,load <fname> -- loads <fname> (no quotes needed)\n" op)
(display " ,q -- disable informational messages\n" op)
(display " ,quiet on -- disable informational messages\n" op)
(display " ,quiet off -- enable informational messages\n" op)
@ -2311,9 +2303,10 @@
(display " ,time <expr> -- time short expression <expr>\n" op)
(display " ,sh <cmdline> -- send <cmdline> to local shell\n" op)
(display " ,help -- this help\n" op)]
[(h) (retry '(help))]
[else
(display "syntax error in repl command\n" op)
(display "type ,help to see available commands\n" op)]))
(display "type ,help to see available commands\n" op)])))
(define (repl-from-port ip env prompt op)
(define cfs (current-file-stack))
@ -2354,7 +2347,7 @@
(when (and (tty-port? (current-input-port)) (tty-port? (current-output-port)))
; quick check for non-interactive use failed, greet
(display "SKINT Scheme Interpreter v0.0.9\n")
(display "Copyright (c) 2024 False Schemers\n\n"))
(display "Copyright (c) 2024 False Schemers\n"))
#t) ; exited normally
(define (repl)

117
t.c
View file

@ -1398,67 +1398,64 @@ char *t_code[] = {
"list1?)[01}?{.0^aY8}{f}~?{.0^,.2^,@(y10:%25for-each1)[52}]5",
"P", "repl-read",
"%3.1?{.2W6.2,.2W4.2,'(s1: )W4}.0,@(y14:read-code-sexp)[31",
"%3.1?{${.3,'(s7:~%25~a ~!),.6,@(y6:format)[03}}.0,@(y14:read-code-sexp"
")[31",
"P", "repl-exec-command",
"%3,,#0#1'(l2:y4:peek;y2:sh;),.3A0?{${.5,@(y22:string-trim-whitespace)["
"01},l1}{${${k0,.0,${.2,.(i12),&2{%0:1,&1{%!0.0,&1{%0:0,@(y6:values),@("
"y13:apply-to-list)[02},:0[11},:0,&1{%0:0P50,@(y15:read-port-sexps)[01}"
",@(y16:call-with-values)[02},.3,&1{%1${k0,.0,${.6,&1{%0:0,Y9]1},:0[01}"
"_1_3}[10},@(y22:with-exception-handler)[02}_1_3}[00}}.!0.0^,.3c.!1${.3"
"^,'(l2:y3:say;y5:hello;),@(y11:sexp-match?)[02}?{.4,'(s13:Well, hello!"
"%0a)W4]5}${.3^,'(l2:y3:ref;y8:<symbol>;),@(y11:sexp-match?)[02}?{.4,${"
"'(y3:ref),.4^a,@(y16:repl-environment)[02}W5.4W6]5}${.3^,'(l2:y3:ref;l"
"3:y1:*;y1:*;y3:...;;),@(y11:sexp-match?)[02}?{.4,${'(y3:ref),.4^a,@(y1"
"6:repl-environment)[02}W5.4W6]5}${.3^,'(l1:y3:rnr;),@(y11:sexp-match?)"
"[02}?{.4,@(y20:*root-name-registry*)W5.4W6]5}${.3^,'(l2:y4:rref;y1:*;)"
",@(y11:sexp-match?)[02}?{.4,${f,.4^a,@(y20:*root-name-registry*),@(y11"
":name-lookup)[03}W5.4W6]5}${.3^,'(l2:y5:rrem!;y1:*;),@(y11:sexp-match?"
")[02}?{${f,.3^a,@(y20:*root-name-registry*),@(y11:name-lookup)[03}?{${"
".2^a,@(y20:*root-name-registry*),@(y12:name-remove!)[02}.4,'(s6:done!%"
"0a)W4]5}.4,'(s16:name not found: )W4.4,@(y4:name)W5.4W6]5}${.3^,'(l1:y"
"3:unr;),@(y11:sexp-match?)[02}?{.4,@(y20:*user-name-registry*)W5.4W6]5"
"}${.3^,'(l2:y4:uref;y1:*;),@(y11:sexp-match?)[02}?{.4,${f,.4^a,@(y20:*"
"user-name-registry*),@(y11:name-lookup)[03}W5.4W6]5}${.3^,'(l2:y5:urem"
"!;y1:*;),@(y11:sexp-match?)[02}?{${f,.3^a,@(y20:*user-name-registry*),"
"@(y11:name-lookup)[03}?{${.2^a,@(y20:*user-name-registry*),@(y12:name-"
"remove!)[02}.4,'(s6:done!%0a)W4]5}.4,'(s16:name not found: )W4.4,@(y4:"
"name)W5.4W6]5}${.3^,'(l1:y2:gs;),@(y11:sexp-match?)[02}?{.4,U2W5.4W6]5"
"}${.3^,'(l2:y2:gs;y8:<symbol>;),@(y11:sexp-match?)[02}?{.0^a,U2,.0V3,."
"2H2,.7,.1,.3V4,.4A3,.0?{.0d}{f}_1W5.7W6]8}${.3^,'(l2:y4:peek;y1:*;),@("
"y11:sexp-match?)[02}?{.0^aS0?{.4,.1^aF0?{'(s12:file exists%0a)}{'(s20:"
"file does not exist%0a)}W4]5}.0^aY0?{.4,.1^aX4F0?{'(s12:file exists%0a"
")}{'(s20:file does not exist%0a)}W4]5}.4,'(s37:invalid file name; use "
"double quotes%0a)W4]5}${.3^,'(l1:y1:v;),@(y11:sexp-match?)[02}?{t@!(y9"
":*verbose*)]5}${.3^,'(l2:y7:verbose;y2:on;),@(y11:sexp-match?)[02}?{t@"
"!(y9:*verbose*)]5}${.3^,'(l2:y7:verbose;y3:off;),@(y11:sexp-match?)[02"
"}?{f@!(y9:*verbose*)]5}${.3^,'(l1:y1:q;),@(y11:sexp-match?)[02}?{t@!(y"
"7:*quiet*)]5}${.3^,'(l2:y5:quiet;y2:on;),@(y11:sexp-match?)[02}?{t@!(y"
"7:*quiet*)]5}${.3^,'(l2:y5:quiet;y3:off;),@(y11:sexp-match?)[02}?{f@!("
"y7:*quiet*)]5}${.3^,'(l2:y4:time;y1:*;),@(y11:sexp-match?)[02}?{Z3,${."
"7,@(y16:repl-environment),.5^a,@(y22:repl-evaluate-top-form)[03}Z4,.1,"
"Z3-/,'(i1000)*,'(s24:; elapsed time: ~s ms.~%25),t,@(y6:format)[63}${."
"3^,'(l2:y2:sh;y8:<string>;),@(y11:sexp-match?)[02}?{.0^aZ6]5}${.3^,'(l"
"1:y4:help;),@(y11:sexp-match?)[02}?{.4,'(s20:Available commands:%0a)W4"
".4,'(s42: ,say hello -- displays nice greeting%0a)W4.4,'(s40: ,pee"
"k <fname> -- check if file exists%0a)W4.4,'(s50: ,q -- di"
"sable informational messages%0a)W4.4,'(s50: ,quiet on -- disable "
"informational messages%0a)W4.4,'(s49: ,quiet off -- enable informa"
"tional messages%0a)W4.4,'(s37: ,v -- turn verbosity on%0a)"
"W4.4,'(s37: ,verbose on -- turn verbosity on%0a)W4.4,'(s38: ,verbos"
"e off -- turn verbosity off%0a)W4.4,'(s58: ,ref <name> -- show de"
"notation for <name> (may alloc)%0a)W4.4,'(s43: ,rnr -- show "
"root name registry%0a)W4.4,'(s48: ,rref <name> -- lookup name in roo"
"t registry%0a)W4.4,'(s50: ,rrem! <name> -- remove name from root regi"
"stry%0a)W4.4,'(s43: ,unr -- show user name registry%0a)W4.4,"
"'(s48: ,uref <name> -- lookup name in user registry%0a)W4.4,'(s50: ,"
"urem! <name> -- remove name from user registry%0a)W4.4,'(s44: ,gs "
" -- show global store (big!)%0a)W4.4,'(s53: ,gs <name> -- l"
"ookup global location for <name>%0a)W4.4,'(s48: ,time <expr> -- time"
" short expression <expr>%0a)W4.4,'(s49: ,sh <cmdline> -- send <cmdlin"
"e> to local shell%0a)W4.4,'(s29: ,help -- this help%0a)W4]5}."
"4,'(s29:syntax error in repl command%0a)W4.4,'(s37:type ,help to see a"
"vailable commands%0a)W4]5",
"%3,#0'(l2:y4:load;y2:sh;),.2A0?{${.4,@(y22:string-trim-whitespace)[01}"
",l1}{${${k0,.0,${.2,.(i11),&2{%0:1,&1{%!0.0,&1{%0:0,@(y6:values),@(y13"
":apply-to-list)[02},:0[11},:0,&1{%0:0P50,@(y15:read-port-sexps)[01},@("
"y16:call-with-values)[02},.3,&1{%1${k0,.0,${.6,&1{%0:0,Y9]1},:0[01}_1_"
"3}[10},@(y22:with-exception-handler)[02}_1_3}[00}}.!0.0^,.2c,,#0.5,.1,"
".4,&3{%1${.2,'(l2:y3:ref;y8:<symbol>;),@(y11:sexp-match?)[02}?{:2,${'("
"y3:ref),:0^a,@(y16:repl-environment)[02}W5:2W6]1}${.2,'(l2:y3:ref;l3:y"
"1:*;y1:*;y3:...;;),@(y11:sexp-match?)[02}?{:2,${'(y3:ref),:0^a,@(y16:r"
"epl-environment)[02}W5:2W6]1}${.2,'(l1:y3:rnr;),@(y11:sexp-match?)[02}"
"?{:2,@(y20:*root-name-registry*)W5:2W6]1}${.2,'(l2:y4:rref;y1:*;),@(y1"
"1:sexp-match?)[02}?{:2,${f,:0^a,@(y20:*root-name-registry*),@(y11:name"
"-lookup)[03}W5:2W6]1}${.2,'(l2:y5:rrem!;y1:*;),@(y11:sexp-match?)[02}?"
"{${f,:0^a,@(y20:*root-name-registry*),@(y11:name-lookup)[03}?{${:0^a,@"
"(y20:*root-name-registry*),@(y12:name-remove!)[02}:2,'(s6:done!%0a)W4]"
"1}:2,'(s16:name not found: )W4:2,@(y4:name)W5:2W6]1}${.2,'(l1:y3:unr;)"
",@(y11:sexp-match?)[02}?{:2,@(y20:*user-name-registry*)W5:2W6]1}${.2,'"
"(l2:y4:uref;y1:*;),@(y11:sexp-match?)[02}?{:2,${f,:0^a,@(y20:*user-nam"
"e-registry*),@(y11:name-lookup)[03}W5:2W6]1}${.2,'(l2:y5:urem!;y1:*;),"
"@(y11:sexp-match?)[02}?{${f,:0^a,@(y20:*user-name-registry*),@(y11:nam"
"e-lookup)[03}?{${:0^a,@(y20:*user-name-registry*),@(y12:name-remove!)["
"02}:2,'(s6:done!%0a)W4]1}:2,'(s16:name not found: )W4:2,@(y4:name)W5:2"
"W6]1}${.2,'(l1:y2:gs;),@(y11:sexp-match?)[02}?{:2,U2W5:2W6]1}${.2,'(l2"
":y2:gs;y8:<symbol>;),@(y11:sexp-match?)[02}?{:0^a,U2,.0V3,.2H2,:2,.1,."
"3V4,.4A3,.0?{.0d}{f}_1W5:2W6]4}${.2,'(l2:y4:load;y8:<string>;),@(y11:s"
"exp-match?)[02}?{:0^a,@(y4:load)[11}${.2,'(l2:y7:verbose;y2:on;),@(y11"
":sexp-match?)[02}?{t@!(y9:*verbose*)]1}${.2,'(l2:y7:verbose;y3:off;),@"
"(y11:sexp-match?)[02}?{f@!(y9:*verbose*)]1}${.2,'(l1:y1:v;),@(y11:sexp"
"-match?)[02}?{t@!(y9:*verbose*)]1}${.2,'(l2:y5:quiet;y2:on;),@(y11:sex"
"p-match?)[02}?{t@!(y7:*quiet*)]1}${.2,'(l2:y5:quiet;y3:off;),@(y11:sex"
"p-match?)[02}?{f@!(y7:*quiet*)]1}${.2,'(l1:y1:q;),@(y11:sexp-match?)[0"
"2}?{t@!(y7:*quiet*)]1}${.2,'(l2:y4:time;y1:*;),@(y11:sexp-match?)[02}?"
"{Z3,${:2,@(y16:repl-environment),:0^a,@(y22:repl-evaluate-top-form)[03"
"}Z4,.1,Z3-/,'(i1000)*,'(s24:; elapsed time: ~s ms.~%25),t,@(y6:format)"
"[23}${.2,'(l2:y2:sh;y8:<string>;),@(y11:sexp-match?)[02}?{:0^aZ6]1}${."
"2,'(l1:y4:help;),@(y11:sexp-match?)[02}?{:2,'(s21:%0aAvailable command"
"s:%0a)W4:2,'(s52: ,load <fname> -- loads <fname> (no quotes needed)%0"
"a)W4:2,'(s50: ,q -- disable informational messages%0a)W4:2"
",'(s50: ,quiet on -- disable informational messages%0a)W4:2,'(s49"
": ,quiet off -- enable informational messages%0a)W4:2,'(s37: ,v "
" -- turn verbosity on%0a)W4:2,'(s37: ,verbose on -- turn v"
"erbosity on%0a)W4:2,'(s38: ,verbose off -- turn verbosity off%0a)W4:"
"2,'(s58: ,ref <name> -- show denotation for <name> (may alloc)%0a)W"
"4:2,'(s43: ,rnr -- show root name registry%0a)W4:2,'(s48: ,r"
"ref <name> -- lookup name in root registry%0a)W4:2,'(s50: ,rrem! <na"
"me> -- remove name from root registry%0a)W4:2,'(s43: ,unr -"
"- show user name registry%0a)W4:2,'(s48: ,uref <name> -- lookup name"
" in user registry%0a)W4:2,'(s50: ,urem! <name> -- remove name from us"
"er registry%0a)W4:2,'(s44: ,gs -- show global store (big!)%"
"0a)W4:2,'(s53: ,gs <name> -- lookup global location for <name>%0a)"
"W4:2,'(s48: ,time <expr> -- time short expression <expr>%0a)W4:2,'(s"
"49: ,sh <cmdline> -- send <cmdline> to local shell%0a)W4:2,'(s29: ,he"
"lp -- this help%0a)W4]1}${.2,'(l1:y1:h;),@(y11:sexp-match?)[0"
"2}?{'(l1:y4:help;),:1^[11}:2,'(s29:syntax error in repl command%0a)W4:"
"2,'(s37:type ,help to see available commands%0a)W4]1}.!0.0^_1[41",
"P", "repl-from-port",
"%4,#0${@(y18:current-file-stack)[00}.!0${k0,.0,${.2,.9,.(i12),.(i12),."
@ -1489,7 +1486,7 @@ char *t_code[] = {
"P", "repl-main",
"%0PiP09?{PoP09}{f}?{Po,'(s32:SKINT Scheme Interpreter v0.0.9%0a)W4Po,'"
"(s35:Copyright (c) 2024 False Schemers%0a%0a)W4}t]0",
"(s34:Copyright (c) 2024 False Schemers%0a)W4}t]0",
"P", "repl",
"%0,,,#0#1#2Pi.!0Po.!1.0^P09?{'(s6:skint])}{f}.!2${n,@(y23:set-current-"