diff --git a/s.c b/s.c index efbe18b..1fc5e1f 100644 --- a/s.c +++ b/s.c @@ -1178,16 +1178,16 @@ char *s_code[] = { "(i10)2", "P", "print-command-line-options", - "%!1,,,,#0#1#2#3.4p?{.0^a}{P12}.!0&0{%1.0ddda,.1dda,.2da,,,,#0#1#2.3?{." - "3S3}{'0}.!0.4?{.4S3}{'0}.!1.5?{.5S3}{'0}.!2'0,.2^,.2^+=?{${.8,'(s22:in" - "valid options record),@(y5:error)[02}}'0,.3^=?{'0}{'1,.3^+},'0,.2^>?{'" - "0,.3^>}{f}?{'2,.3^,.3^++}{.2^,.2^+}+]7}.!1${.7,.4^,@(y5:%25map1)[02}.!" - "2${.4^,'0c,@(y3:max),@(y13:apply-to-list)[02}.!3${.4^,.8,,#0.0,.6,.(i1" - "0),&3{%2.0u~?{.1a,.1a,:1^,'(s2: )W4.0dddda,.1ddda,.2dda,.3da,.0?{.1}{" - "f}?{:1^,.1W4:1^,'(s2:, )W4:1^,.2W4.2?{:1^,'(s1:=)W4:1^,.3W4}}{.0?{:1^," - ".1W4.2?{:1^,'(s1: )W4:1^,.3W4}}{.1?{:1^,.2W4.2?{:1^,'(s1:=)W4:1^,.3W4}" - "}{f}}}:1^,'(c ),.7,:0^-S2W4:1^,'(s4: )W4:1^,.4W4:1^W6.7d,.7d,:2^[82" - "}]2}.!0.0^_1[02}'4,.4^,'2++]6", + "%!1,,,,#0#1#2#3.4p?{.4a}{P11}.!0&0{%1.0ddda,.1dda,.2da,,,,#0#1#2.3?{.3" + "S3}{'0}.!0.4?{.4S3}{'0}.!1.5?{.5S3}{'0}.!2'0,.2^,.2^+=?{${.8,'(s22:inv" + "alid options record),@(y5:error)[02}}'0,.3^=?{'0}{'1,.3^+},'0,.2^>?{'0" + ",.3^>}{f}?{'2,.3^,.3^++}{.2^,.2^+}+]7}.!1${.7,.4^,@(y5:%25map1)[02}.!2" + "${.4^,'0c,@(y3:max),@(y13:apply-to-list)[02}.!3${.4^,.8,,#0.0,.6,.(i10" + "),&3{%2.0u~?{.1a,.1a,:1^,'(s2: )W4.0dddda,.1ddda,.2dda,.3da,.0?{.1}{f" + "}?{:1^,.1W4:1^,'(s2:, )W4:1^,.2W4.2?{:1^,'(s1:=)W4:1^,.3W4}}{.0?{:1^,." + "1W4.2?{:1^,'(s1: )W4:1^,.3W4}}{.1?{:1^,.2W4.2?{:1^,'(s1:=)W4:1^,.3W4}}" + "{f}}}:1^,'(c ),.7,:0^-S2W4:1^,'(s4: )W4:1^,.4W4:1^W6.7d,.7d,:2^[82}" + "]2}.!0.0^_1[02}'4,.4^,'2++]6", 0, 0, 0 }; diff --git a/src/s.scm b/src/s.scm index 89add5a..bad4316 100644 --- a/src/s.scm +++ b/src/s.scm @@ -2171,7 +2171,7 @@ ; printer for optmap options used for --help; returns offset of help lines (define (print-command-line-options optmap . ?port) - (define port (if (pair? ?port) (car port) (standard-error-port))) + (define port (if (pair? ?port) (car ?port) (standard-output-port))) (define (optlen i) (let ([co (cadr i)] [lo (caddr i)] [oa (cadddr i)]) (define colen (if co (string-length co) 0)) diff --git a/src/t.scm b/src/t.scm index e2c7fd2..0688678 100644 --- a/src/t.scm +++ b/src/t.scm @@ -2300,7 +2300,7 @@ (define (run-script filename args) (define env (interaction-environment)) (define ci? #f) ; normal load-like behavior is the default - (define callmain #f) + (define callmain #f) ; got changed via first #! line (define main-args (cons filename args)) (let* ([filepath (and (string? filename) (file-resolve-relative-to-current filename))] [fileok? (and (string? filepath) (file-exists? filepath))]) @@ -2312,7 +2312,8 @@ (let ([x0 (read-code-sexp port)]) (when (shebang? x0) (let ([shs (symbol->string (shebang->symbol x0))]) - (cond [(string-position "r7rs" shs)] ; ok, repl env will do + (cond [(string-position "r7rs" shs) + (command-line main-args)] [(string-position "r5rs" shs) (set! env (scheme-report-environment 5)) (set! ci? #t)] @@ -2460,21 +2461,54 @@ ;-------------------------------------------------------------------------------------------------- (define *skint-options* - '([verbose "-v" "--verbose" #f "Increase output verbosity"] - [quiet "-q" "--quiet" #f "Suppress nonessential messages"] - [append-libdir "-A" "--append-libdir" "" "Append a library search directory"] - [prepend-libdir "-I" "--prepend-libdir" "" "Prepend a library search directory"] - [eval "-e" "--eval" "" "Evaluate and print an expression"] - [script "-s" "--script" "" "Run file as a Scheme script"] - [program "-p" "--program" "" "Run file as a Scheme program"] - [version "-V" "--version" #f "Display version info"] - [help "-h" "--help" #f "Display this help"] + '([verbose "-v" "--verbose" #f "Increase output verbosity"] + [quiet "-q" "--quiet" #f "Suppress nonessential messages"] + [append-libdir "-A" "--append-libdir" "DIR" "Append a library search directory"] + [prepend-libdir "-I" "--prepend-libdir" "DIR" "Prepend a library search directory"] + [eval "-e" "--eval" "SEXP" "Evaluate and print an expression"] + [script "-s" "--script" "FILE" "Run file as a Scheme script"] + [program "-p" "--program" "FILE" "Run file as a Scheme program"] + [version "-V" "--version" #f "Display version info"] + [help "-h" "--help" #f "Display this help"] )) +(define *skint-version* "0.1.9") + (define (skint-main) - ; todo: here we can process command line by ourselves! + ; see if command line asks for special processing + (define (eval! str print?) + (let ([obj (read-from-string str)]) + (for-each (lambda (val) (when print? (write val) (newline))) + (call-with-values (lambda () (eval obj)) list)))) + (define (print-version!) + (format #t "(version ~s)~%(scheme.id skint)~%" *skint-version*)) + (define (print-help!) + (format #t "SKINT Scheme Interpreter v~a~%" *skint-version*) + (format #t "usage: skint [OPTION]... [FILE] [ARG]...~%") + (format #t "~%") + (format #t "Options:~%") + (print-command-line-options *skint-options* (current-output-port)) + (format #t "~%") + (format #t "If no FILE is given, skint enters REPL~%") + (format #t "~%")) + (define cl (command-line)) + (let loop ([args (cdr cl)] [repl? #t]) + (get-next-command-line-option args *skint-options* ;=> + (lambda (keysym optarg restargs) + (sexp-case (if optarg (list keysym optarg) (list keysym)) + [(verbose) (set! *verbose* #t) (loop restargs #t)] + [(quiet) (set! *quiet* #t) (loop restargs #t)] + [(append-libdir *) (append-library-path! optarg) (loop restargs #t)] + [(prepend-libdir *) (prepend-library-path! optarg) (loop restargs #t)] + [(eval *) (eval! optarg #t) (loop restargs #f)] + [(script *) (run-script optarg restargs)] ; will exit if a script + [(version) (print-version!) (loop '() #f)] + [(help) (print-help!) (loop '() #f)] + [(#f) (cond [(pair? restargs) (run-script (car restargs) (cdr restargs))] + [(not repl?) (exit #t)])])))) ; all done -- no need to continue + ; falling through to interactive mode (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")) + (format #t "SKINT Scheme Interpreter v~a~%" *skint-version*) + (format #t "Copyright (c) 2024 False Schemers~%")) #t) ; exited normally diff --git a/t.c b/t.c index 65e522a..14aa658 100644 --- a/t.c +++ b/t.c @@ -1448,13 +1448,14 @@ char *t_code[] = { ".4S0?{${.6,@(y32:file-resolve-relative-to-current)[01}}{f},.0S0?{.0F0}" "{f},.0~?{${.3,.9,'(s17:cannot run script),@(y5:error)[03}}${.6,.8,.6,." "8,.7,&5{%0:1,:2,:3,:4,&4{%1${.2,@(y14:read-code-sexp)[01},#0.0^Y5?{.0^" - "Y7X4,.0,'(s4:r7rs)S8,.0?{.0}{.1,'(s4:r5rs)S8?{${'5,@(y25:scheme-report" - "-environment)[01}:!2t:!3}{${.3,'(s41:only scheme-r[57]rs scripts are s" - "upported),@(y5:error)[02}}}_1:3^?{t,.3P79}t:!0${.4,@(y14:read-code-sex" - "p)[01}.!1_1}${.2^,,#0:2,.6,.2,&3{%1.0R8~?{${:2^,.3,@(y4:eval)[02}${:1," - "@(y14:read-code-sexp)[01},:0^[11}]1}.!0.0^_1[01}:0^?{${:2^,n,n,:1^c,'(" - "y5:quote)cc,'(y4:main)c,@(y4:eval)[02},@(y4:exit)[21}]2},:0,@(y20:call" - "-with-input-file)[02},.4,@(y17:with-current-file)[02}Y9]8", + "Y7X4,.0,'(s4:r7rs)S8?{${:1^,@(y12:command-line)[01}}{.0,'(s4:r5rs)S8?{" + "${'5,@(y25:scheme-report-environment)[01}:!2t:!3}{${.2,'(s41:only sche" + "me-r[57]rs scripts are supported),@(y5:error)[02}}}:3^?{t,.3P79}t:!0${" + ".4,@(y14:read-code-sexp)[01}.!1_1}${.2^,,#0:2,.6,.2,&3{%1.0R8~?{${:2^," + ".3,@(y4:eval)[02}${:1,@(y14:read-code-sexp)[01},:0^[11}]1}.!0.0^_1[01}" + ":0^?{${:2^,n,n,:1^c,'(y5:quote)cc,'(y4:main)c,@(y4:eval)[02},@(y4:exit" + ")[21}]2},:0,@(y20:call-with-input-file)[02},.4,@(y17:with-current-file" + ")[02}Y9]8", "P", "repl-evaluate-top-form", "%3,,#0#1.!0${.2,&1{%!0.0:!0]1},.6,.6,&2{%0:1,:0,@(y17:evaluate-top-for" @@ -1560,18 +1561,45 @@ char *t_code[] = { "C", 0, "'(l9:l5:y7:verbose;s2:-v;s9:--verbose;f;s25:Increase output verbosity;" ";l5:y5:quiet;s2:-q;s7:--quiet;f;s30:Suppress nonessential messages;;l5" - ":y13:append-libdir;s2:-A;s15:--append-libdir;s5:;s33:Append a lib" - "rary search directory;;l5:y14:prepend-libdir;s2:-I;s16:--prepend-libdi" - "r;s5:;s34:Prepend a library search directory;;l5:y4:eval;s2:-e;s6" - ":--eval;s6:;s32:Evaluate and print an expression;;l5:y6:script;s" - "2:-s;s8:--script;s6:;s27:Run file as a Scheme script;;l5:y7:prog" - "ram;s2:-p;s9:--program;s6:;s28:Run file as a Scheme program;;l5:" - "y7:version;s2:-V;s9:--version;f;s20:Display version info;;l5:y4:help;s" - "2:-h;s6:--help;f;s17:Display this help;;)@!(y15:*skint-options*)", + ":y13:append-libdir;s2:-A;s15:--append-libdir;s3:DIR;s33:Append a libra" + "ry search directory;;l5:y14:prepend-libdir;s2:-I;s16:--prepend-libdir;" + "s3:DIR;s34:Prepend a library search directory;;l5:y4:eval;s2:-e;s6:--e" + "val;s4:SEXP;s32:Evaluate and print an expression;;l5:y6:script;s2:-s;s" + "8:--script;s4:FILE;s27:Run file as a Scheme 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 version info;;l5:y4:help;s2:-h;s6:--" + "help;f;s17:Display this help;;)@!(y15:*skint-options*)", + + "C", 0, + "'(s5:0.1.9)@!(y15:*skint-version*)", "P", "skint-main", - "%0PiP09?{PoP09}{f}?{Po,'(s32:SKINT Scheme Interpreter v0.0.9%0a)W4Po,'" - "(s34:Copyright (c) 2024 False Schemers%0a)W4}t]0", + "%0,,,,#0#1#2#3&0{%2${.2,@(y16:read-from-string)[01},${@(y4:list),.3,&1" + "{%0:0,@(y4:eval)[01},@(y16:call-with-values)[02},.3,&1{%1:0?{Po,.1W5Po" + "W6]1}]1},@(y10:%25for-each1)[32}.!0&0{%0@(y15:*skint-version*),'(s33:(" + "version ~s)~%25(scheme.id skint)~%25),t,@(y6:format)[03}.!1&0{%0${@(y1" + "5:*skint-version*),'(s30:SKINT Scheme Interpreter v~a~%25),t,@(y6:form" + "at)[03}${'(s42:usage: skint [OPTION]... [FILE] [ARG]...~%25),t,@(y6:fo" + "rmat)[02}${'(s2:~%25),t,@(y6:format)[02}${'(s10:Options:~%25),t,@(y6:f" + "ormat)[02}${Po,@(y15:*skint-options*),@(y26:print-command-line-options" + ")[02}${'(s2:~%25),t,@(y6:format)[02}${'(s40:If no FILE is given, skint" + " enters REPL~%25),t,@(y6:format)[02}'(s2:~%25),t,@(y6:format)[02}.!2${" + "@(y12:command-line)[00}.!3${t,.6^d,,#0.7,.1,.8,.8,&4{%2:0,:1,:2,:3,.5," + "&5{%3.1?{.1,.1,l2}{.0,l1},${.2,'(l1:y7:verbose;),@(y11:sexp-match?)[02" + "}?{t@!(y9:*verbose*)t,.4,:2^[42}${.2,'(l1:y5:quiet;),@(y11:sexp-match?" + ")[02}?{t@!(y7:*quiet*)t,.4,:2^[42}${.2,'(l2:y13:append-libdir;y1:*;),@" + "(y11:sexp-match?)[02}?{${.4,@(y20:append-library-path!)[01}t,.4,:2^[42" + "}${.2,'(l2:y14:prepend-libdir;y1:*;),@(y11:sexp-match?)[02}?{${.4,@(y2" + "1:prepend-library-path!)[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}?{.3,.3,@(y10:run-script)[42}${.2,'(l1:y7:vers" + "ion;),@(y11:sexp-match?)[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-m" + "atch?)[02}?{.3p?{.3d,.4a,@(y10:run-script)[42}: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 Sch" + "eme Interpreter v~a~%25),t,@(y6:format)[03}${'(s35:Copyright (c) 2024 " + "False Schemers~%25),t,@(y6:format)[02}}t]4", 0, 0, 0 };