commit aa7f32bfd93900ee0e932230f0dc9a52f4ed801c
parent ba99919d4db33b4eca1d91e047308b4063788eb7
Author: Tomas Hlavaty <tom@logand.com>
Date:   Sun,  6 Dec 2015 09:12:21 +0100
try more lisps
Diffstat:
5 files changed, 61 insertions(+), 11 deletions(-)
diff --git a/cl-rw.asd b/cl-rw.asd
@@ -36,7 +36,7 @@
                (:file "xml")
                (:file "email")
                (:file "os")
-               #-clisp(:file "concurrency")
+               (:file "concurrency")
                (:file "css")
                (:file "html")
                (:file "socket")
@@ -44,7 +44,7 @@
                (:file "http")
                (:file "net")
                (:file "calendar")
-               #-clisp(:file "ui")
+               (:file "ui")
                (:file "cas")
                (:file "zip")
                (:file "string")
diff --git a/concurrency.lisp b/concurrency.lisp
@@ -29,7 +29,8 @@
            :wait-on-semaphore
            :make-concurrent-queue
            :make-thread
-           :make-program-server))
+           :make-program-server
+           :threads-supported-p))
 
 (in-package :rw.concurrency)
 
@@ -108,15 +109,20 @@
 ;; (funcall q 3)
 ;; (funcall q)
 
+(defun threads-supported-p ()
+  #+(or allegro ccl ecl mkcl cmucl sb-thread (and clisp mt))
+  t)
+
 (defun make-thread (name fn)
-  #-(or allegro ccl ecl mkcl cmucl sbcl)
+  #-(or allegro ccl ecl mkcl cmucl sbcl (and clisp mt))
   (error "RW.CONCURRENCY:MAKE-THREAD not ported")
   #+allegro (mp:process-run-function name fn)
   #+ccl (ccl:process-run-function name fn)
   #+ecl (mp:process-run-function name fn)
   #+mkcl (mt:thread-run-function name fn)
   #+cmucl (mp:make-process fn :name name)
-  #+sbcl (sb-concurrency::make-thread fn :name (string name)))
+  #+sbcl (sb-concurrency::make-thread fn :name (string name))
+  #+(and clisp mt) (mt:make-thread fn :name name))
 
 (defun make-program-server (command args writer reader)
   (let ((p (rw.os:make-program :stream :stream command args nil))
diff --git a/default.nix b/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchgit, sbcl, ccl, ecl, mkcl, lisptype, demo}:
+{stdenv, fetchgit, sbcl, ccl, cmucl_binary, clisp, ecl, mkcl, lisptype, demo}:
 
 stdenv.mkDerivation rec {
   name = "cl-rw-demo-${demo}-${lisptype}";
@@ -9,7 +9,13 @@ stdenv.mkDerivation rec {
     sha256 = "03w7rah4bkzqw2m47jrb0nhwcsk3qq90nqd193b7qbcdwjkr6l4b";
   };
 
-  buildInputs = [sbcl ccl ecl mkcl];
+  buildInputs = if "sbcl" == "${lisptype}" then [sbcl]
+     else if "ccl" == "${lisptype}" then [ccl]
+     else if "cmucl" == "${lisptype}" then [cmucl_binary]
+     else if "clisp" == "${lisptype}" then [clisp]
+     else if "ecl" == "${lisptype}" then [ecl]
+     else if "mkcl" == "${lisptype}" then [mkcl]
+     else [];
 
   sbclBuild = ''
     sbcl \
@@ -18,22 +24,41 @@ stdenv.mkDerivation rec {
       --disable-debugger \
       --no-sysinit \
       --no-userinit \
-      --load "${sbcl}/lib/sbcl/contrib/asdf" \
+      --eval '(require :asdf)' \
       --eval '(push (truename "./") asdf:*central-registry*)' \
       --eval '(require :cl-rw-demo-${demo})' \
       --eval '(rw.demo.${demo}::save-image)'
   '';
   cclBuild = ''
     lx86cl64 -K utf-8 -n \
-      -l "${ccl}/share/ccl-installation/tools/asdf" \
+      -e '(require :asdf)' \
       -e '(push (truename "./") asdf:*central-registry*)' \
       -e '(require :cl-rw-demo-${demo})' \
       -e '(rw.demo.${demo}::save-image)'
   '';
+  cmuclBuild = ''
+    lisp \
+      -batch \
+      -noinit \
+      -nositeinit \
+      -eval '(require :asdf)' \
+      -eval '(push (truename "./") asdf:*central-registry*)' \
+      -eval '(require :cl-rw-demo-${demo})' \
+      -eval '(rw.demo.${demo}::save-image)'
+  '';
+  clispBuild = ''
+    clisp \
+      -v \
+      -norc \
+      -i "${clisp}/lib/clisp/asdf" \
+      -x '(push (truename "./") asdf:*central-registry*)' \
+      -x '(require :cl-rw-demo-${demo})' \
+      -x '(rw.demo.${demo}::save-image)'
+  '';
   eclBuild = ''
     ecl \
       -norc \
-      -load "${ccl}/share/ccl-installation/tools/asdf" \
+      -eval '(require :asdf)' \
       -eval '(push (truename "./") asdf:*central-registry*)' \
       -eval '(require :cl-rw-demo-${demo})' \
       -eval '(rw.demo.${demo}::save-image)'
@@ -41,7 +66,7 @@ stdenv.mkDerivation rec {
   mkclBuild = ''
     mkcl \
       -norc \
-      -load "${ccl}/share/ccl-installation/tools/asdf" \
+      -eval '(require :asdf)' \
       -eval '(push (truename "./") asdf:*central-registry*)' \
       -eval '(require :cl-rw-demo-${demo})' \
       -eval '(rw.demo.${demo}::save-image)'
@@ -51,6 +76,8 @@ stdenv.mkDerivation rec {
   ''
   + (if "sbcl" == "${lisptype}" then sbclBuild
      else if "ccl" == "${lisptype}" then cclBuild
+     else if "cmucl" == "${lisptype}" then cmuclBuild
+     else if "clisp" == "${lisptype}" then clispBuild
      else if "ecl" == "${lisptype}" then eclBuild
      else if "mkcl" == "${lisptype}" then mkclBuild
      else "");
diff --git a/demo-zappel.lisp b/demo-zappel.lisp
@@ -195,6 +195,18 @@
 (defun save-image ()
   #-(or ccl cmucl sbcl)
   (error "TODO RW.DEMO.ZAPPEL::SAVE-IMAGE")
+  #+clisp
+  (ext:saveinitmem "cl-rw-demo-zappel"
+                   :executable t
+                   :quiet t
+                   :norc
+                   :init-function (lambda ()
+                                    (handler-case
+                                        (progn
+                                          (start)
+                                          (loop (sleep 1)))
+                                      (condition ()
+                                        (quit 1)))))
   #+ccl ;; TODO no debug on ^C
   (ccl:save-application "cl-rw-demo-zappel"
                         :prepend-kernel t
diff --git a/release.nix b/release.nix
@@ -4,10 +4,15 @@ let
 in {
   cl-rw-demo-counter-sbcl = demo "counter" "sbcl";
   cl-rw-demo-counter-ccl = demo "counter" "ccl";
+  cl-rw-demo-counter-cmucl = demo "counter" "cmucl";
+  cl-rw-demo-counter-clisp = demo "counter" "clisp";
   #cl-rw-demo-counter-ecl = demo "counter" "ecl";
   #cl-rw-demo-counter-mkcl = demo "counter" "mkcl";
+
   cl-rw-demo-zappel-sbcl = demo "zappel" "sbcl";
   cl-rw-demo-zappel-ccl = demo "zappel" "ccl";
+  cl-rw-demo-zappel-cmucl = demo "zappel" "cmucl";
+  cl-rw-demo-zappel-clisp = demo "zappel" "clisp";
   #cl-rw-demo-zappel-ecl = demo "zappel" "ecl";
   #cl-rw-demo-zappel-mkcl = demo "zappel" "mkcl";
 }