Track changes to runlisp.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 19 Apr 2008 21:32:08 +0000 (22:32 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 19 Apr 2008 21:32:08 +0000 (22:32 +0100)
sys-base is now less dependent on runlisp for setting itself up.
It doesn't run as well as it does through runlisp but it does at
least work.  (The code in sys-base is a clone-and-hack job of
the guts of runlisp: try to keep them in sync.)

Runlisp renamed its command-line arguments variable, to avoid the
annoying conflict with CMU CL's ext:*command-line-strings*; track
this change.

optparse-test
optparse.lisp
sys-base.lisp

index 4f3ad5f..cd1c4f9 100755 (executable)
@@ -91,7 +91,4 @@
   (format t "keyword: ~S~%" opt-keyword)
   (format t "enum: ~S~%" opt-enum)
   (format t "object: ~S~%" opt-object))
-(test (cdr *command-line-strings*))
-
-
-
+(test (cdr *command-line*))
index 37d27de..6e06fc0 100644 (file)
@@ -28,7 +28,7 @@
 
 (defpackage #:optparse
   (:use #:common-lisp #:mdw.base #:mdw.sys-base #:mdw.str)
-  (:export #:exit #:*program-name* #:*command-line-strings*
+  (:export #:exit #:*program-name* #:*command-line*
           #:moan #:die
           #:option #:optionp #:make-option
             #:opt-short-name #:opt-long-name #:opt-tag #:opt-negated-tag
                          (:constructor make-option-parser
                                        (&key
                                         ((:args argstmp)
-                                         (cdr *command-line-strings*))
+                                         (cdr *command-line*))
                                         (options *options*)
                                         (non-option :skip)
                                         ((:numericp numeric-p))
   "An option parser object.  Slots:
 
    ARGS                The arguments to be parsed.  Usually this will be
-               *command-line-strings*.
+               *command-line*.
 
    OPTIONS      List of option structures describing the acceptable options.
 
@@ -840,9 +840,9 @@ Ambiguous long option `~A' -- could be any of:~{~%  --~A~}"
 
 (defun show-usage (prog usage &optional (stream *standard-output*))
   "Basic usage-showing function.  PROG is the program name, probably from
-   *command-line-strings*.  USAGE is a list of possible usages of the
-   program, each of which is a list of items to be supplied by the user.  In
-   simple cases, a single string is sufficient."
+   *command-line*.  USAGE is a list of possible usages of the program, each
+   of which is a list of items to be supplied by the user.  In simple cases,
+   a single string is sufficient."
   (pprint-logical-block (stream nil :prefix "Usage: ")
     (dolist (u (listify usage))
       (pprint-logical-block (stream nil :prefix (format nil "~A " prog))
@@ -881,10 +881,10 @@ Ambiguous long option `~A' -- could be any of:~{~%  --~A~}"
 
 (defun show-help (prog ver usage opts &optional (stream *standard-output*))
   "Basic help-showing function.  PROG is the program name, probably from
-   *command-line-strings*.  VER is the program's version number.  USAGE is a
-   list of the possible usages of the program, each of which may be a list of
-   items to be supplied.  OPTS is the list of supported options, as provided
-   to the options parser.  STREAM is the stream to write on."
+   *command-line*.  VER is the program's version number.  USAGE is a list of
+   the possible usages of the program, each of which may be a list of items
+   to be supplied.  OPTS is the list of supported options, as provided to the
+   options parser.  STREAM is the stream to write on."
   (format stream "~A, version ~A~2%" prog ver)
   (show-usage prog usage stream)
   (terpri stream)
index e973e90..359da3f 100644 (file)
 
 (defpackage #:runlisp
   (:use #:common-lisp)
-  (:export #:*lisp-interpreter* #:*command-line-strings* #:run)
-  #+cmu (:import-from #:ext #:*command-line-strings*))
-(defvar runlisp:*command-line-strings* '("<interactive>"))
-
+  (:export #:*raw-command-line* #:*command-line* #:exit)
+  #+clisp (:import-from #:ext #:exit))
 (defpackage #:mdw.sys-base
   (:use #:common-lisp #:runlisp)
-  (:export #:exit #:hard-exit #:*program-name* #:*command-line-strings*)
-  (:import-from #:runlisp #:*lisp-interpreter* #:*command-line-strings*)
-  #+clisp (:import-from #:ext #:exit))
+  (:export #:exit #:hard-exit #:*program-name* #:*command-line*)
+  (:import-from #:runlisp #:*raw-command-line* #:*command-line* #:exit))
 (in-package #:mdw.sys-base)
 
+(defvar *raw-command-line*
+  (or #+cmu ext:*command-line-strings*
+      #+sbcl sb-ext:*posix-argv*
+      #+ecl (loop from i below (ext:argc) collect (ext:argv i))
+      #+clisp (coerce (ext:argv) 'list)
+      '("<unknown-lisp>" "--" "<unknown-script>")))
+
+(defvar *command-line*
+  (or (cdr (member "--" *raw-command-line* :test #'string=))
+      *raw-command-line*))
+
+#-clisp
+(unless (fboundp 'exit)
+  (defun exit (&optional (code 0))
+    "Polite way to end a program."
+    #+(or cmu ecl) (ext:quit code)
+    #+sbcl (sb-ext:quit :unix-status code)
+    #-(or cmu ecl sbcl)
+    (progn
+      (unless (zerop code)
+       (format t "~&Exiting unsuccessfully with code ~D.~%" code))
+      (abort))))
+
 (defun hard-exit (&optional (code 0))
   "Stops the program immediately in its tracks.  Does nothing else.  Use
    after fork, for example, to avoid flushing buffers."
   #+sbcl (sb-ext:quit :unix-status code :recklessly-p t)
   #+(or clisp ecl) (ext:quit code))
 
-#-clisp
-(defun exit (&optional (code 0))
-  "Polite way to end a program.  If running in an interactive Lisp, just
-   return to the top-level REPL."
-  (if (boundp '*lisp-interpreter*)
-      #+(or cmu ecl) (ext:quit code)
-      #+sbcl (sb-ext:quit :unix-status code)
-      (progn
-        (unless (zerop code)
-          (format t "~&Exiting unsuccessfully with code ~D.~%" code))
-        (abort))))
-
 (defvar *program-name*
-  (pathname-name (car *command-line-strings*))
+  (pathname-name (car *command-line*))
   "A plausible guess at the program's name, stripped of strange extensions.")
 
 ;;;----- That's all, folks --------------------------------------------------