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
};