cl-fringe.lisp: Abstract out the startup stuff.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 19 Jun 2010 20:04:27 +0000 (21:04 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 19 Jun 2010 20:12:48 +0000 (21:12 +0100)
Less is `cl-launch' specific.  There's some support for ECL and SBCL
native startup stuff.  Indeed, this seems to work better than `cl-launch'
does, so we'll stick with it.

Makefile
cl-fringe.lisp

index 6d4455d..d08ed09 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -94,13 +94,16 @@ icon-fringe: icon-fringe.icn
 ###--------------------------------------------------------------------------
 ### Common Lisp.
 
-CLEANFILES             += *.core
+CLEANFILES             += *.core *.fasl
+
+.SUFFIXES: .lisp .fasl
+.lisp.fasl:; sbcl --eval '(quit :unix-status (if (compile-file "$<") 0 1))'
 
 LANGS                  += cl
 SOURCES                        += cl-fringe.lisp
-cl-fringe: cl-fringe.lisp
-##     cl-launch -R -o $@ -f `pwd`/$^  -- slow to start
-       cl-launch -o $@ -f `pwd`/$^ +I -r launch -d $@.core
+cl-fringe: cl-fringe.fasl
+       cp $< $@.new && chmod +x $@.new && mv $@.new $@
+##     cl-launch -o $@ -f `pwd`/$^ +I -r launch -d $@.core
 
 ###--------------------------------------------------------------------------
 ### F#.
index 5af3cc7..0a41838 100644 (file)
 ;;;--------------------------------------------------------------------------
 ;;; Main program.
 
-(defun main (args)
+(defun main (prog args)
   "Main program: process ARGS."
-  (destructuring-bind (&optional a b &rest junk) args
-    (cond ((or (null a) junk) (error "bad args"))
-         ((null b) (format t "~{~C~}~%"
-                           (list-iterator (iterate-fringe (parse-tree a)))))
-         (t (format t "~:[no match~;match~]~%"
-                    (same-iterators-p (iterate-fringe (parse-tree a))
-                                      (iterate-fringe (parse-tree b))))))))
-
-#+cl-launch
-(progn
-  (defparameter *program-name*
-    (pathname-name (or (cl-launch:getenv "CL_LAUNCH_FILE")
-                      (namestring *load-pathname*)
-                      "<unknown>")))
-  (defun launch ()
-    (flet ((bail (format args)
-            (format *error-output* "~A: ~?~%" *program-name* format args)
-            (cl-launch:quit 1)))
-      (handler-case
-         (main cl-launch:*arguments*)
+  (flet ((bail (format args)
+          (format *error-output* "~A: ~?~%" prog format args)
+          (return-from main 1)))
+    (handler-case
+       (destructuring-bind (&optional a b &rest junk) args
+         (cond ((or (null a) junk)
+                (error "bad args"))
+               ((null b)
+                (format t "~{~C~}~%"
+                        (list-iterator (iterate-fringe (parse-tree a)))))
+               (t
+                (format t "~:[no match~;match~]~%"
+                        (same-iterators-p
+                         (iterate-fringe (parse-tree a))
+                         (iterate-fringe (parse-tree b)))))))
        (simple-error (err)
          (bail (simple-condition-format-control err)
                (simple-condition-format-arguments err)))
        (error (err)
-         (bail "~A" err))))))
+         (bail "~A" err)))
+    0))
+
+#+cl-launch
+(defun launch ()
+  (cl-launch:quit (main (or (cl-launch:getenv "CL_LAUNCH_FILE")
+                           (namestring *load-pathname*)
+                           "<unknown>")
+                       cl-launch:*arguments*)))
+
+#+(and (not cl-launch) ecl)
+(ext:quit (main (ext:argv 0)
+               (loop for i from 1 below (ext:argc) collect (ext:argv i))))
+
+#+(and (not cl-launch) sbcl)
+(sb-ext:quit :unix-status (main (pathname-name *load-pathname*)
+                               (cdr sb-ext:*posix-argv*)))
 
 ;;;----- That's all, folks --------------------------------------------------