diff --git a/pre/t.scm b/pre/t.scm index d8a2323..3346ca1 100644 --- a/pre/t.scm +++ b/pre/t.scm @@ -150,6 +150,15 @@ ; for now, we will just use read with no support for circular structures (read-simple port)) +(define (lookup-global k . ?alloc) ;=> box | #f if !defined and !alloc + (let* ([v (global-store)] [i (immediate-hash k (vector-length v))]) + (cond [(assq k (vector-ref v i)) => cdr] + [(and (pair? ?alloc) (car ?alloc)) + (let ([b (box k)]) ; default value is k itself + (vector-set! v i (cons (cons k b) (vector-ref v i))) + b)] + [else #f]))) + (define (error* msg args) (raise (error-object #f msg args))) @@ -2478,10 +2487,13 @@ (let ([x0 (read-code-sexp port)]) ; support loading fasl files too (if (eq? x0 (symbol->shebang (string->symbol "/usr/bin/env skint -f"))) (run-fasl-from-port port #f) ; do not call main even if it is there - (let loop ([x x0]) - (unless (eof-object? x) - (eval x env) - (loop (read-code-sexp port)))))))) + (begin + (when (eq? x0 (symbol->shebang (string->symbol "/usr/bin/env skint -s"))) + (set! x0 (read-code-sexp port))) ; just skip -- this file is loadable + (let loop ([x x0]) + (unless (eof-object? x) + (eval x env) + (loop (read-code-sexp port))))))))) ; we aren't asked by the spec to call last expr tail-recursively, so this (void)) @@ -2496,6 +2508,11 @@ (define (exec code) (define cl (closure (deserialize-code code))) (cl)) + (define (def id code) + (define cl (closure (deserialize-code code))) + (set-box! (lookup-global id #t) cl)) + (define (fail! lno hd) + (error "unexpected line header on FASL body line" lno hd)) (when (eqv? (peek-char port) #\#) ; header is optional if call is explicit (define x (read-code-sexp port)) (unless (eq? x (symbol->shebang (string->symbol "/usr/bin/env skint -f"))) @@ -2503,7 +2520,7 @@ (let loop ([c (peek-char port)]) (when (memv c '(#\newline #\return)) (read-char port) (loop (peek-char port)))) - (let loop ([line 1]) + (let loop ([lno 1]) (unless (eof-object? (peek-char port)) (define c1 (read-char port)) (define c2 (read-char port)) @@ -2511,10 +2528,18 @@ (define hd (list c1 c2 c3)) (cond [(equal? hd '(#\C #\tab #\tab)) (exec (read-line port)) - (loop (+ line 1))] + (loop (+ lno 1))] + [(and (eqv? c1 #\P) (eqv? c2 #\tab) (not (eof-object? c3))) + (let scan ([c (read-char port)] [l (list c3)]) + (cond [(eof-object? c) (fail! lno 'eof)] + [(eqv? c #\tab) + (define id (string->symbol (list->string (reverse! l)))) + (def id (read-line port)) + (loop (+ lno 1))] + [else (scan (read-char port) (cons c l))]))] [(equal? hd '(#\M #\tab #\tab)) (and (pair? main-args) (eval `(main (quote ,main-args)) env))] - [else (error "unexpected line header on FASL body line" line hd)])))) + [else (fail! lno hd)])))) (define (run-fasl filename args) (define main-args (cons filename args)) @@ -2619,9 +2644,7 @@ (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 ) - (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))] + [(gs ) (write (lookup-global (car args)) op) (newline op)] [(load ) (load (car args))] [(v) (set! *verbose* #t) (format #t "verbosity is on~%")] [(v-) (set! *verbose* #f) (format #t "verbosity is off~%")] @@ -2727,6 +2750,7 @@ [prepend-libdir "-I" "--prepend-libdir" "DIR" "Prepend a library search directory"] [define-feature "-D" "--define-feature" "NAME" "Add name to the list of features"] [eval "-e" "--eval" "SEXP" "Evaluate and print an expression"] + [load "-l" "--load" "FILE" "Load file and continue processing"] [script "-s" "--script" "FILE" "Run file as a Scheme script"] [fasl "-f" "--fasl" "FILE" "Run file as a compiled script"] [program "-p" "--program" "FILE" "Run file as a Scheme program"] @@ -2769,6 +2793,7 @@ [(append-libdir *) (append-library-path! optarg) (loop restargs #t)] [(prepend-libdir *) (prepend-library-path! optarg) (loop restargs #t)] [(define-feature *) (add-feature! optarg) (loop restargs #t)] + [(load *) (load optarg) (loop restargs #t)] [(eval *) (eval! optarg #t) (loop restargs #f)] [(script *) (set! *quiet* #t) (exit (run-script optarg restargs))] [(fasl *) (set! *quiet* #t) (exit (run-fasl optarg restargs))] diff --git a/t.c b/t.c index f7cc95c..0146d19 100644 --- a/t.c +++ b/t.c @@ -100,6 +100,10 @@ char *t_code[] = { "P", "read-code-sexp", "%1.0,@(y11:read-simple)[11", + "P", "lookup-global", + "%!1U2,.0V3,.3H2,.0,.2V4,.4A3,.0?{.0d]5}.3p?{.3a}{f}?{.4b,.2,.4V4,.1,.7" + "cc,.3,.5V5.0]6}f]5", + "P", "error*", "%2${.3,.3,f,@(y12:error-object)[03},@(y5:raise)[21", @@ -1550,26 +1554,31 @@ char *t_code[] = { "P", "load", "%!1,,#0#1.2p?{.2a}{${@(y23:interaction-environment)[00}}.!0f.!1${.2,.4" - ",&2{%1:0^?{t,.1P79}${.2,@(y14:read-code-sexp)[01},'(s21:/usr/bin/env s" - "kint -f)X5Y6,.1q?{f,.2,@(y18:run-fasl-from-port)[22}.0,,#0:1,.4,.2,&3{" - "%1.0R8~?{${:2^,.3,@(y4:eval)[02}${:1,@(y14:read-code-sexp)[01},:0^[11}" - "]1}.!0.0^_1[21},.6,@(y28:call-with-current-input-file)[02}Y9]4", + ",&2{%1:0^?{t,.1P79}${.2,@(y14:read-code-sexp)[01},#0'(s21:/usr/bin/env" + " skint -f)X5Y6,.1^q?{f,.2,@(y18:run-fasl-from-port)[22}'(s21:/usr/bin/" + "env skint -s)X5Y6,.1^q?{${.3,@(y14:read-code-sexp)[01}.!0}.0^,,#0:1,.4" + ",.2,&3{%1.0R8~?{${:2^,.3,@(y4:eval)[02}${:1,@(y14:read-code-sexp)[01}," + ":0^[11}]1}.!0.0^_1[21},.6,@(y28:call-with-current-input-file)[02}Y9]4", "P", "expand", "%!1,#0.1p?{.1a}{${@(y23:interaction-environment)[00}}.!0.0^,.3,t,@(y5:" "xpand)[33", "P", "run-fasl-from-port", - "%2,,#0#1${@(y23:interaction-environment)[00}.!0&0{%1,#0.1U4,U91.!0.0^[" - "20}.!1'(c#),.3R1v?{,#0${.5,@(y14:read-code-sexp)[01}.!0'(s21:/usr/bin/" - "env skint -f)X5Y6,.1^q~?{${.2^,'(s30:unexpected header in FASL file),@" - "(y5:error)[02}}_1}${.4R1,,#0.6,.1,&2{%1'(l2:c%0a;c%0d;),.1A1?{:1R0:1R1" - ",:0^[11}]1}.!0.0^_1[01}'1,,#0.0,.4,.6,.8,.6,&5{%1:2R1R8~?{,,,,#0#1#2#3" - ":2R0.!0:2R0.!1:2R0.!2.2^,.2^,.2^,l3.!3'(l3:cC;c%09;c%09;),.4^e?{${${:2" - ",@(y9:read-line)[01},:3^[01}'1,.5+,:4^[51}'(l3:cM;c%09;c%09;),.4^e?{:1" - "p?{:0^,n,n,:1c,'(y5:quote)cc,'(y4:main)c,@(y4:eval)[52}f]5}.3^,.5,'(s4" - "0:unexpected line header on FASL body line),@(y5:error)[53}]1}.!0.0^_1" - "[41", + "%2,,,,#0#1#2#3${@(y23:interaction-environment)[00}.!0&0{%1,#0.1U4,U91." + "!0.0^[20}.!1&0{%2,#0.2U4,U91.!0.0^,${t,.5,@(y13:lookup-global)[02}sz]3" + "}.!2&0{%2.1,.1,'(s40:unexpected line header on FASL body line),@(y5:er" + "ror)[23}.!3'(c#),.5R1v?{,#0${.7,@(y14:read-code-sexp)[01}.!0'(s21:/usr" + "/bin/env skint -f)X5Y6,.1^q~?{${.2^,'(s30:unexpected header in FASL fi" + "le),@(y5:error)[02}}_1}${.6R1,,#0.8,.1,&2{%1'(l2:c%0a;c%0d;),.1A1?{:1R" + "0:1R1,:0^[11}]1}.!0.0^_1[01}'1,,#0.3,.7,.6,.3,.(i11),.7,.(i11),&7{%1:5" + "R1R8~?{,,,,#0#1#2#3:5R0.!0:5R0.!1:5R0.!2.2^,.2^,.2^,l3.!3'(l3:cC;c%09;" + "c%09;),.4^e?{${${:5,@(y9:read-line)[01},:6^[01}'1,.5+,:3^[51}'(cP),.1^" + "v?{'(c%09),.2^v?{.2^R8~}{f}}{f}?{.2^,l1,:5R0,,#0:5,.1,:3,.(i10),:4,:0," + "&6{%2.0R8?{'(y3:eof),:2,:0^[22}'(c%09),.1v?{,#0.2A9X3X5.!0${${:5,@(y9:" + "read-line)[01},.3^,:1^[02}'1,:2+,:3^[31}.1,.1c,:5R0,:4^[22}.!0.0^_1[52" + "}'(l3:cM;c%09;c%09;),.4^e?{:2p?{:1^,n,n,:2c,'(y5:quote)cc,'(y4:main)c," + "@(y4:eval)[52}f]5}.3^,.5,:0^[52}]1}.!0.0^_1[61", "P", "run-fasl", "%2,#0.2,.2c.!0.0,&1{%1:0^,.1,@(y18:run-fasl-from-port)[12},.2,@(y28:ca" @@ -1635,47 +1644,47 @@ char *t_code[] = { "registry*),@(y11:name-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:2W6]1}${.2,'(l1:y2:gs;),@(y11:sexp-match?)[02}?{:2," - "U2W5:2W6]1}${.2,'(l2:y2:gs;y8:;),@(y11:sexp-match?)[02}?{:0^a," - "U2,.0V3,.2H2,:2,.1,.3V4,.4A3,.0?{.0d}{f}_1W5:2W6]4}${.2,'(l2:y4:load;y" - "8:;),@(y11:sexp-match?)[02}?{:0^a,@(y4:load)[11}${.2,'(l1:y1:v" - ";),@(y11:sexp-match?)[02}?{t@!(y9:*verbose*)'(s17:verbosity is on~%25)" - ",t,@(y6:format)[12}${.2,'(l1:y2:v-;),@(y11:sexp-match?)[02}?{f@!(y9:*v" - "erbose*)'(s18:verbosity is off~%25),t,@(y6:format)[12}${.2,'(l1:y1:q;)" - ",@(y11:sexp-match?)[02}?{t@!(y7:*quiet*)'(s13:quiet is on~%25),t,@(y6:" - "format)[12}${.2,'(l1:y2:q-;),@(y11:sexp-match?)[02}?{f@!(y7:*quiet*)'(" - "s14:quiet is off~%25),t,@(y6:format)[12}${.2,'(l2:y4:time;y1:*;),@(y11" - ":sexp-match?)[02}?{Z3,${:2,@(y16:repl-environment),:0^a,@(y22:repl-eva" - "luate-top-form)[03}Z4,.1,Z3-/,'(i1000)*,'(s24:; elapsed time: ~s ms.~%" - "25),t,@(y6:format)[23}${.2,'(l1:y3:pwd;),@(y11:sexp-match?)[02}?{:2,${" - "@(y17:current-directory)[00}W4:2W6]1}${.2,'(l2:y2:cd;y8:;),@(y" - "11:sexp-match?)[02}?{:0^a,@(y17:current-directory)[11}${.2,'(l2:y2:sh;" - "y8:;),@(y11:sexp-match?)[02}?{:0^aZ6]1}${.2,'(l1:y2:si;),@(y11" - ":sexp-match?)[02}?{Zh,Zb,Zc,'(s49:~d collections, ~d reallocs, heap si" - "ze ~d words~%25),t,@(y6:format)[15}${.2,'(l1:y2:gc;),@(y11:sexp-match?" - ")[02}?{Zg'(l1:y2:si;),:1^[11}${.2,'(l1:y4:help;),@(y11:sexp-match?)[02" - "}?{:2,'(s57:%0aREPL commands (,load ,cd ,sh arguments need no quotes):" - "%0a)W4:2,'(s44: ,load load into REPL%0a)W4:2,'(s" - "59: ,q quiet: disable informational messages%0a)W4:2," - "'(s51: ,q- enable informational messages%0a)W4:2,'(s39" - ": ,v turn verbosity on%0a)W4:2,'(s40: ,v- " - " turn verbosity off%0a)W4:2,'(s48: ,ref show denota" - "tion for %0a)W4:2,'(s45: ,rnr show root name regi" - "stry%0a)W4:2,'(s50: ,rref lookup name in root registry%0" - "a)W4:2,'(s52: ,rrem! remove name from root registry%0a)W4" - ":2,'(s45: ,unr show user name registry%0a)W4:2,'(s50: ," - "uref lookup name in user registry%0a)W4:2,'(s52: ,urem! " - " remove name from user registry%0a)W4:2,'(s46: ,gs " - " show global store (big!)%0a)W4:2,'(s55: ,gs l" - "ookup global location for %0a)W4:2,'(s56: ,time ti" - "me single-line expression %0a)W4:2,'(s60: ,pwd sh" - "ow skint's current working directory%0a)W4:2,'(s62: ,cd " - " change skint's current working directory%0a)W4:2,'(s51: ,sh send to local shell%0a)W4:2,'(s41: ,si " - " display system info%0a)W4:2,'(s55: ,gc force gc to " - "finalize lost objects%0a)W4:2,'(s31: ,help this help%0a)" - "W4]1}${.2,'(l1:y1:h;),@(y11:sexp-match?)[02}?{'(l1:y4:help;),:1^[11}:2" - ",'(s29:syntax error in repl command%0a)W4:2,'(s37:type ,help to see av" - "ailable commands%0a)W4]1}.!0.0^_1[41", + "U2W5:2W6]1}${.2,'(l2:y2:gs;y8:;),@(y11:sexp-match?)[02}?{:2,${" + ":0^a,@(y13:lookup-global)[01}W5:2W6]1}${.2,'(l2:y4:load;y8:;)," + "@(y11:sexp-match?)[02}?{:0^a,@(y4:load)[11}${.2,'(l1:y1:v;),@(y11:sexp" + "-match?)[02}?{t@!(y9:*verbose*)'(s17:verbosity is on~%25),t,@(y6:forma" + "t)[12}${.2,'(l1:y2:v-;),@(y11:sexp-match?)[02}?{f@!(y9:*verbose*)'(s18" + ":verbosity is off~%25),t,@(y6:format)[12}${.2,'(l1:y1:q;),@(y11:sexp-m" + "atch?)[02}?{t@!(y7:*quiet*)'(s13:quiet is on~%25),t,@(y6:format)[12}${" + ".2,'(l1:y2:q-;),@(y11:sexp-match?)[02}?{f@!(y7:*quiet*)'(s14:quiet is " + "off~%25),t,@(y6:format)[12}${.2,'(l2:y4:time;y1:*;),@(y11:sexp-match?)" + "[02}?{Z3,${:2,@(y16:repl-environment),:0^a,@(y22:repl-evaluate-top-for" + "m)[03}Z4,.1,Z3-/,'(i1000)*,'(s24:; elapsed time: ~s ms.~%25),t,@(y6:fo" + "rmat)[23}${.2,'(l1:y3:pwd;),@(y11:sexp-match?)[02}?{:2,${@(y17:current" + "-directory)[00}W4:2W6]1}${.2,'(l2:y2:cd;y8:;),@(y11:sexp-match" + "?)[02}?{:0^a,@(y17:current-directory)[11}${.2,'(l2:y2:sh;y8:;)" + ",@(y11:sexp-match?)[02}?{:0^aZ6]1}${.2,'(l1:y2:si;),@(y11:sexp-match?)" + "[02}?{Zh,Zb,Zc,'(s49:~d collections, ~d reallocs, heap size ~d words~%" + "25),t,@(y6:format)[15}${.2,'(l1:y2:gc;),@(y11:sexp-match?)[02}?{Zg'(l1" + ":y2:si;),:1^[11}${.2,'(l1:y4:help;),@(y11:sexp-match?)[02}?{:2,'(s57:%" + "0aREPL commands (,load ,cd ,sh arguments need no quotes):%0a)W4:2,'(s4" + "4: ,load load into REPL%0a)W4:2,'(s59: ,q " + " quiet: disable informational messages%0a)W4:2,'(s51: ,q- " + " enable informational messages%0a)W4:2,'(s39: ,v " + " turn verbosity on%0a)W4:2,'(s40: ,v- turn ver" + "bosity off%0a)W4:2,'(s48: ,ref show denotation for %0a)W4:2,'(s45: ,rnr show root name registry%0a)W4:2," + "'(s50: ,rref lookup name in root registry%0a)W4:2,'(s52:" + " ,rrem! remove name from root registry%0a)W4:2,'(s45: ,un" + "r show user name registry%0a)W4:2,'(s50: ,uref " + " lookup name in user registry%0a)W4:2,'(s52: ,urem! " + "remove name from user registry%0a)W4:2,'(s46: ,gs show" + " global store (big!)%0a)W4:2,'(s55: ,gs lookup global " + "location for %0a)W4:2,'(s56: ,time time single-lin" + "e expression %0a)W4:2,'(s60: ,pwd show skint's cu" + "rrent working directory%0a)W4:2,'(s62: ,cd change skin" + "t's current working directory%0a)W4:2,'(s51: ,sh send " + " to local shell%0a)W4:2,'(s41: ,si display sy" + "stem info%0a)W4:2,'(s55: ,gc force gc to finalize lost" + " objects%0a)W4:2,'(s31: ,help this help%0a)W4]1}${.2,'(l" + "1:y1:h;),@(y11:sexp-match?)[02}?{'(l1:y4:help;),:1^[11}:2,'(s29:syntax" + " error in repl command%0a)W4:2,'(s37:type ,help to see available comma" + "nds%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),." @@ -1712,19 +1721,20 @@ char *t_code[] = { ",@(y16:repl-environment),.8^,@(y14:repl-from-port)[04}_3}t]3", "C", 0, - "'(l11:l5:y7:verbose;s2:-v;s9:--verbose;f;s25:Increase output verbosity" + "'(l12:l5:y7:verbose;s2:-v;s9:--verbose;f;s25:Increase output verbosity" ";;l5:y5:quiet;s2:-q;s7:--quiet;f;s30:Suppress nonessential messages;;l" "5:y13:append-libdir;s2:-A;s15:--append-libdir;s3:DIR;s33:Append a libr" "ary search directory;;l5:y14:prepend-libdir;s2:-I;s16:--prepend-libdir" ";s3:DIR;s34:Prepend a library search directory;;l5:y14:define-feature;" "s2:-D;s16:--define-feature;s4:NAME;s32:Add name to the list of feature" "s;;l5:y4:eval;s2:-e;s6:--eval;s4:SEXP;s32:Evaluate and print an expres" - "sion;;l5:y6:script;s2:-s;s8:--script;s4:FILE;s27:Run file as a Scheme " - "script;;l5:y4:fasl;s2:-f;s6:--fasl;s4:FILE;s29:Run file as a compiled " - "script;;l5:y7:program;s2:-p;s9:--program;s4:FILE;s28:Run file as a Sch" - "eme program;;l5:y7:version;s2:-V;s9:--version;f;s20:Display version in" - "fo;;l5:y4:help;s2:-h;s6:--help;f;s17:Display this help;;)@!(y15:*skint" - "-options*)", + "sion;;l5:y4:load;s2:-l;s6:--load;s4:FILE;s33:Load file and continue pr" + "ocessing;;l5:y6:script;s2:-s;s8:--script;s4:FILE;s27:Run file as a Sch" + "eme script;;l5:y4:fasl;s2:-f;s6:--fasl;s4:FILE;s29:Run file as a compi" + "led script;;l5:y7:program;s2:-p;s9:--program;s4:FILE;s28:Run file as a" + " Scheme program;;l5:y7:version;s2:-V;s9:--version;f;s20:Display versio" + "n info;;l5:y4:help;s2:-h;s6:--help;f;s17:Display this help;;)@!(y15:*s" + "kint-options*)", "C", 0, "'(s5:0.4.9)@!(y15:*skint-version*)", @@ -1757,21 +1767,22 @@ char *t_code[] = { "ibrary-path!)[01}t,.4,:2^[42}${.2,'(l2:y14:prepend-libdir;y1:*;),@(y11" ":sexp-match?)[02}?{${.4,@(y21:prepend-library-path!)[01}t,.4,:2^[42}${" ".2,'(l2:y14:define-feature;y1:*;),@(y11:sexp-match?)[02}?{${.4,:5^[01}" - "t,.4,:2^[42}${.2,'(l2:y4:eval;y1:*;),@(y11:sexp-match?)[02}?{${t,.5,:4" - "^[02}f,.4,:2^[42}${.2,'(l2:y6:script;y1:*;),@(y11:sexp-match?)[02}?{t@" - "!(y7:*quiet*)${.5,.5,@(y10:run-script)[02},@(y4:exit)[41}${.2,'(l2:y4:" - "fasl;y1:*;),@(y11:sexp-match?)[02}?{t@!(y7:*quiet*)${.5,.5,@(y8:run-fa" - "sl)[02},@(y4:exit)[41}${.2,'(l2:y7:program;y1:*;),@(y11:sexp-match?)[0" - "2}?{t@!(y7:*quiet*)${.5,.5,@(y11:run-program)[02},@(y4:exit)[41}${.2,'" - "(l2:y9:benchmark;y1:*;),@(y11:sexp-match?)[02}?{${.5,.5,@(y10:run-scri" - "pt)[02},@(y4:exit)[41}${.2,'(l1:y7:version;),@(y11:sexp-match?)[02}?{$" - "{:3^[00}f,n,:2^[42}${.2,'(l1:y4:help;),@(y11:sexp-match?)[02}?{${:1^[0" - "0}f,n,:2^[42}${.2,'(l1:f;),@(y11:sexp-match?)[02}?{.3p?{t@!(y7:*quiet*" - ")${.5d,.6a,@(y10:run-script)[02},@(y4:exit)[41}:0~?{t,@(y4:exit)[41}f]" - "4}]4},@(y15:*skint-options*),.2,@(y28:get-next-command-line-option)[23" - "}.!0.0^_1[02}PiP09?{PoP09}{f}?{${@(y15:*skint-version*),'(s30:SKINT Sc" - "heme Interpreter v~a~%25),t,@(y6:format)[03}${'(s35:Copyright (c) 2024" - " False Schemers~%25),t,@(y6:format)[02}}t]5", + "t,.4,:2^[42}${.2,'(l2:y4:load;y1:*;),@(y11:sexp-match?)[02}?{${.4,@(y4" + ":load)[01}t,.4,:2^[42}${.2,'(l2:y4:eval;y1:*;),@(y11:sexp-match?)[02}?" + "{${t,.5,:4^[02}f,.4,:2^[42}${.2,'(l2:y6:script;y1:*;),@(y11:sexp-match" + "?)[02}?{t@!(y7:*quiet*)${.5,.5,@(y10:run-script)[02},@(y4:exit)[41}${." + "2,'(l2:y4:fasl;y1:*;),@(y11:sexp-match?)[02}?{t@!(y7:*quiet*)${.5,.5,@" + "(y8:run-fasl)[02},@(y4:exit)[41}${.2,'(l2:y7:program;y1:*;),@(y11:sexp" + "-match?)[02}?{t@!(y7:*quiet*)${.5,.5,@(y11:run-program)[02},@(y4:exit)" + "[41}${.2,'(l2:y9:benchmark;y1:*;),@(y11:sexp-match?)[02}?{${.5,.5,@(y1" + "0:run-script)[02},@(y4:exit)[41}${.2,'(l1:y7:version;),@(y11:sexp-matc" + "h?)[02}?{${:3^[00}f,n,:2^[42}${.2,'(l1:y4:help;),@(y11:sexp-match?)[02" + "}?{${:1^[00}f,n,:2^[42}${.2,'(l1:f;),@(y11:sexp-match?)[02}?{.3p?{t@!(" + "y7:*quiet*)${.5d,.6a,@(y10:run-script)[02},@(y4:exit)[41}:0~?{t,@(y4:e" + "xit)[41}f]4}]4},@(y15:*skint-options*),.2,@(y28:get-next-command-line-" + "option)[23}.!0.0^_1[02}PiP09?{PoP09}{f}?{${@(y15:*skint-version*),'(s3" + "0:SKINT Scheme Interpreter v~a~%25),t,@(y6:format)[03}${'(s35:Copyrigh" + "t (c) 2024 False Schemers~%25),t,@(y6:format)[02}}t]5", 0, 0, 0 };