Hi,
Appended you find patches for supporting clisp.
Part 1 of the patches are the obvious portability things. It should be uncontroversial and adds two files INSTALL.CLISP and Lisp-Dep/fix-clisp.lisp.
diff -r -c3 mcclim.orig/Apps/Listener/dev-commands.lisp mcclim/Apps/Listener/dev-commands.lisp *** mcclim.orig/Apps/Listener/dev-commands.lisp 2004-10-18 08:30:37.000000000 +0200 --- mcclim/Apps/Listener/dev-commands.lisp 2004-12-18 02:47:15.000000000 +0100 *************** *** 617,625 **** (defun x-specializer-direct-generic-functions (specializer) ;; FIXME - move to CLIM-MOP #+PCL (pcl::specializer-direct-generic-functions specializer) #+SBCL (sb-pcl::specializer-direct-generic-functions specializer) #+openmcl-partial-mop (openmcl-mop:specializer-direct-generic-functions specializer) ! #-(or PCL SBCL openmcl-partial-mop) (error "Sorry, not supported in your CL implementation. See the function X-SPECIALIZER-DIRECT-GENERIC-FUNCTION if you are interested in fixing this."))
(defun class-funcs (class) --- 617,626 ---- (defun x-specializer-direct-generic-functions (specializer) ;; FIXME - move to CLIM-MOP #+PCL (pcl::specializer-direct-generic-functions specializer) #+SBCL (sb-pcl::specializer-direct-generic-functions specializer) + #+clisp (clos:specializer-direct-generic-functions specializer) #+openmcl-partial-mop (openmcl-mop:specializer-direct-generic-functions specializer) ! #-(or PCL SBCL clisp openmcl-partial-mop) (error "Sorry, not supported in your CL implementation. See the function X-SPECIALIZER-DIRECT-GENERIC-FUNCTION if you are interested in fixing this."))
(defun class-funcs (class) *************** *** 890,896 **** ;; hash table capacity #+cmu (values (lisp::internal-symbol-count package)) #+sbcl (values (sb-int:package-internal-symbol-count package)) ! #-(or cmu sbcl) (portable-internal-symbol-count package))
(defun portable-external-symbol-count (package) (let ((n 0)) --- 891,898 ---- ;; hash table capacity #+cmu (values (lisp::internal-symbol-count package)) #+sbcl (values (sb-int:package-internal-symbol-count package)) ! #+clisp (svref (sys::%record-ref *package* 1) 2) ! #-(or cmu sbcl clisp) (portable-internal-symbol-count package))
(defun portable-external-symbol-count (package) (let ((n 0)) *************** *** 903,909 **** "Return the number of external symbols in PACKAGE." #+cmu (values (lisp::external-symbol-count package)) #+sbcl (values (sb-int:package-external-symbol-count package)) ! #-(or cmu sbcl) (portable-external-symbol-count package))
(defun package-grapher (stream package inferior-fun) "Draw package hierarchy graphs for `Show Package Users' and `Show Used Packages'." --- 905,912 ---- "Return the number of external symbols in PACKAGE." #+cmu (values (lisp::external-symbol-count package)) #+sbcl (values (sb-int:package-external-symbol-count package)) ! #+clisp (svref (sys::%record-ref *package* 0) 2) ! #-(or cmu sbcl clisp) (portable-external-symbol-count package))
(defun package-grapher (stream package inferior-fun) "Draw package hierarchy graphs for `Show Package Users' and `Show Used Packages'." diff -r -c3 mcclim.orig/Apps/Listener/listener.lisp mcclim/Apps/Listener/listener.lisp *** mcclim.orig/Apps/Listener/listener.lisp 2004-11-15 08:07:26.000000000 +0100 --- mcclim/Apps/Listener/listener.lisp 2004-12-18 02:48:55.000000000 +0100 *************** *** 64,70 **** #+sbcl (sb-kernel:dynamic-usage) #+lispworks (getf (system:room-values) :total-allocated) #+openmcl (+ (ccl::%usedbytes) (ccl::%freebytes)) ! #-(or cmu sbcl lispworks openmcl) 0)) (with-text-family (T :serif) (formatting-table (T :x-spacing '(3 :character)) (formatting-row (T) --- 64,71 ---- #+sbcl (sb-kernel:dynamic-usage) #+lispworks (getf (system:room-values) :total-allocated) #+openmcl (+ (ccl::%usedbytes) (ccl::%freebytes)) ! #+clisp (values (sys::%room)) ! #-(or cmu sbcl lispworks openmcl clisp) 0)) (with-text-family (T :serif) (formatting-table (T :x-spacing '(3 :character)) (formatting-row (T) diff -r -c3 mcclim.orig/Apps/Listener/util.lisp mcclim/Apps/Listener/util.lisp *** mcclim.orig/Apps/Listener/util.lisp 2004-07-23 14:36:45.000000000 +0200 --- mcclim/Apps/Listener/util.lisp 2004-12-18 02:54:51.000000000 +0100 *************** *** 64,75 **** --- 64,77 ---- #+sbcl (sb-ext:posix-getenv var) #+lispworks (lw:environment-variable var) #+openmcl (ccl::getenv var) + #+clisp (ext:getenv var) nil))
;; Need to strip filename/type/version from directory?.. FIXME? (defun change-directory (pathname) "Ensure that the current directory seen by RUN-PROGRAM has changed, and update *default-pathname-defaults*" #+CMU (unix:unix-chdir (namestring pathname)) + #+clisp (ext:cd pathname) ; SBCL FIXME? (setf *default-pathname-defaults* pathname))
*************** *** 154,161 **** :shell-type "/bin/sh" :output-stream output :wait wait)
! #-(or CMU SBCL lispworks) (format T "~&Sorry, don't know how to run programs in your CL.~%"))
;;;; CLIM/UI utilities --- 156,164 ---- :shell-type "/bin/sh" :output-stream output :wait wait) + #+clisp (ext:run-program program :arguments args :wait wait)
! #-(or CMU SBCL lispworks clisp) (format T "~&Sorry, don't know how to run programs in your CL.~%"))
;;;; CLIM/UI utilities diff -r -c3 mcclim.orig/README mcclim/README *** mcclim.orig/README 2003-11-12 00:45:15.000000000 +0100 --- mcclim/README 2004-12-18 01:19:07.000000000 +0100 *************** *** 2,9 ****
This is McCLIM, an implementation of the "Common Lisp Interface Manager CLIM II Specification." It currently works on X Windows using ! CLX. It works with CMUCL, SBCL, OpenMCL, Allegro CL and LispWorks. The ! INSTALL files in this directory give instructions for each Lisp implementation. Release notes for each release of McCLIM are in the ReleaseNotes directory.
--- 2,9 ----
This is McCLIM, an implementation of the "Common Lisp Interface Manager CLIM II Specification." It currently works on X Windows using ! CLX. It works with CMUCL, SBCL, CLISP, OpenMCL, Allegro CL and LispWorks. ! The INSTALL files in this directory give instructions for each Lisp implementation. Release notes for each release of McCLIM are in the ReleaseNotes directory.
diff -r -c3 mcclim.orig/describe.lisp mcclim/describe.lisp *** mcclim.orig/describe.lisp 2004-11-15 05:47:41.000000000 +0100 --- mcclim/describe.lisp 2004-12-18 01:22:07.000000000 +0100 *************** *** 70,76 **** (let ((arglist #+excl (excl:arglist (symbol-function thing)) #+cmu (kernel:%function-arglist (symbol-function thing)) #+sbcl (sb-kernel:%simple-fun-arglist (symbol-function thing)) ! #-(or excl cmu sbcl) "( ??? )")) (when arglist (clim:present arglist (clim:presentation-type-of arglist) --- 70,77 ---- (let ((arglist #+excl (excl:arglist (symbol-function thing)) #+cmu (kernel:%function-arglist (symbol-function thing)) #+sbcl (sb-kernel:%simple-fun-arglist (symbol-function thing)) ! #+clisp (ext:arglist (symbol-function thing)) ! #-(or excl cmu sbcl clisp) "( ??? )")) (when arglist (clim:present arglist (clim:presentation-type-of arglist) diff -r -c3 mcclim.orig/package.lisp mcclim/package.lisp *** mcclim.orig/package.lisp 2004-12-07 05:49:51.000000000 +0100 --- mcclim/package.lisp 2004-12-18 01:40:42.000000000 +0100 *************** *** 185,193 **** #:with-standard-io-syntax #:write #:write-byte #:write-char #:write-line #:write-sequence #:write-string #:write-to-string #:y-or-n-p #:yes-or-no-p #:zerop)) (packages - #+clisp '(:common-lisp :clos) #+gcl '(:lisp :pcl) ! #-(or clisp gcl) '(:common-lisp)) (gray-symbols '(#:fundamental-stream #:fundamental-input-stream --- 185,192 ---- #:with-standard-io-syntax #:write #:write-byte #:write-char #:write-line #:write-sequence #:write-string #:write-to-string #:y-or-n-p #:yes-or-no-p #:zerop)) (packages #+gcl '(:lisp :pcl) ! #-(or gcl) '(:common-lisp)) (gray-symbols '(#:fundamental-stream #:fundamental-input-stream *************** *** 218,224 **** #:stream-read-byte #:stream-write-byte )) (gray-packages ! `(#+clisp ,@'(:lisp) #+cmu ,@'(:ext) #+mcl ,@'(:ccl) #+allegro ,@'(:common-lisp :excl :stream) --- 217,223 ---- #:stream-read-byte #:stream-write-byte )) (gray-packages ! `(#+clisp ,@'(:gray) #+cmu ,@'(:ext) #+mcl ,@'(:ccl) #+allegro ,@'(:common-lisp :excl :stream) diff -r -c3 mcclim.orig/system.lisp mcclim/system.lisp *** mcclim.orig/system.lisp 2004-12-07 05:49:51.000000000 +0100 --- mcclim/system.lisp 2004-12-18 01:36:56.000000000 +0100 *************** *** 81,86 **** --- 81,87 ---- #+sbcl "Lisp-Dep/fix-sbcl" #+openmcl "Lisp-Dep/fix-openmcl" #+lispworks "Lisp-Dep/fix-lispworks" + #+clisp "Lisp-Dep/fix-clisp" "package")
(clim-defsystem (:clim-core :depends-on (:clim-lisp)) diff -r -c3 mcclim.orig/utils.lisp mcclim/utils.lisp *** mcclim.orig/utils.lisp 2004-10-06 14:03:56.000000000 +0200 --- mcclim/utils.lisp 2004-12-18 01:46:28.000000000 +0100 *************** *** 22,28 **** (defun get-environment-variable (string) #+excl (sys:getenv string) #+cmu (cdr (assoc string ext:*environment-list* :test #'string=)) ! #+clisp (sys::getenv (string string)) #+sbcl (sb-ext::posix-getenv string) #+openmcl (ccl::getenv string) #+lispworks (lw:environment-variable string) --- 22,28 ---- (defun get-environment-variable (string) #+excl (sys:getenv string) #+cmu (cdr (assoc string ext:*environment-list* :test #'string=)) ! #+clisp (ext:getenv (string string)) #+sbcl (sb-ext::posix-getenv string) #+openmcl (ccl::getenv string) #+lispworks (lw:environment-variable string) *** /dev/null 2003-09-23 19:59:22.000000000 +0200 --- mcclim/INSTALL.CLISP 2004-12-18 11:37:30.000000000 +0100 *************** *** 0 **** --- 1,54 ---- + Install instructions for GNU CLISP + ---------------------------------- + + 1. Get clisp-20041218 or newer. Build it with option --with-module=clx/mit-clx. + + 2. Get a copy of the ASDF package. Compile it: + $ clisp -c $ASDF/asdf.lisp + + 3. Start + $ clisp -K full -i $ASDF/asdf.fas -i system.lisp + + 4. Load the system (which will also compile it): + + > (asdf:operate 'asdf:load-op :clim) ;; Build CLIM + > (asdf:operate 'asdf:load-op :clim-clx) ;; Build a backend + > (asdf:operate 'asdf:load-op :clim-examples) + + The first two steps can be done in one step with the :clim-clx-user target: + (asdf:operate 'asdf:load-op :clim-clx-user) + + 5. At a later date, after everything is compiled, load the compiled system: + + > (asdf:operate 'asdf:load-op :clim) ;; Load CLIM + > (asdf:operate 'asdf:load-op :clim-clx) ;; Load backend + + + Running the demos + ----------------- + + 1. Run the calculator demo + + (clim-demo::calculator) + + This demo is self-explanatory. + + When you get tired of it, hit Ctrl-C in the Lisp listener. + + 2. Run the menu demo + + (menutest::menutest) + + This demo is self-explanatory. + + When you get tired of it, hit Ctrl-C in the Lisp listener. + + 3. Run the slider demo + + (clim-demo::colorslider) + + You should see three sliders on the left and a color area on the right. + Use the three sliders to adjust RGB values to obtain a color. + + When you get tired of it - you know... + *** /dev/null 2003-09-23 19:59:22.000000000 +0200 --- mcclim/Lisp-Dep/fix-clisp.lisp 2004-12-18 02:04:36.000000000 +0100 *************** *** 0 **** --- 1,20 ---- + (defpackage #:clim-mop + (:use #:clos)) + + (eval-when (:compile-toplevel :load-toplevel :execute) + (loop for sym being the symbols of :clim-mop + do (export sym :clim-mop))) + + ;; CLIM expects INPUT-STREAM-P to be a generic function. + (unless (typep #'input-stream-p 'generic-function) + (setf (fdefinition 'gray::original-input-stream-p) #'input-stream-p) + (fmakunbound 'input-stream-p) + (defgeneric input-stream-p (stream) + (:method ((stream stream)) (gray::original-input-stream-p stream)))) + + ;; CLIM expects OUTPUT-STREAM-P to be a generic function. + (unless (typep #'output-stream-p 'generic-function) + (setf (fdefinition 'gray::original-output-stream-p) #'output-stream-p) + (fmakunbound 'output-stream-p) + (defgeneric output-stream-p (stream) + (:method ((stream stream)) (gray::original-output-stream-p stream))))
Bruno,
Mario Mommer will give you write access to the McCLIM CVS so that you can check in these modifications and continue to help make McCLIM work with CLISP.
Nice work,
Robert Strandh wrote:
Mario Mommer will give you write access to the McCLIM CVS so that you can check in these modifications and continue to help make McCLIM work with CLISP.
"continue to"? It already works with the two patches I posted! :-)
Thanks, I committed the first patch, which was hopefully uncontroversial.
About the second one: Could someone please explain what the intent of the package EXTERNAL-FORMAT in McCLIM is?
And is it welcome if I send out the interesting warnings that CLISP gives? (Mostly about unused variables and inconsistent class precedence lists.)
Bruno
Bruno Haible writes:
Robert Strandh wrote:
Mario Mommer will give you write access to the McCLIM CVS so that you can check in these modifications and continue to help make McCLIM work with CLISP.
"continue to"? It already works with the two patches I posted! :-)
Great! But we are likely to break it it the future :-)
About the second one: Could someone please explain what the intent of the package EXTERNAL-FORMAT in McCLIM is?
It looks like it tries to handle functions for translating from some internal format of McCLIM (hopefully Unicode) to X11 font encoding.
And is it welcome if I send out the interesting warnings that CLISP gives? (Mostly about unused variables and inconsistent class precedence lists.)
Nor really. Those warnings are given by other implementations as well. The best thing would be to fix them. :-)
Robert Strandh wrote:
About the second one: Could someone please explain what the intent of the package EXTERNAL-FORMAT in McCLIM is?
It looks like it tries to handle functions for translating from some internal format of McCLIM (hopefully Unicode) to X11 font encoding.
OK. Under which conditions should the code which uses and defines external-format::ksc5601-code-to-font-index etc. be defined? - If the Lisp implementation supports Unicode? #+unicode - If CLIM should support Unicode? #+clim-unicode
And what shall happen on implementations that don't have an EXTERNAL-FORMAT package? Why is there no (DEFPACKAGE "EXTERNAL-FORMAT" ...) in McCLIM?
Bruno
Hello,
Bruno Haible writes:
Robert Strandh wrote:
About the second one: Could someone please explain what the intent of the package EXTERNAL-FORMAT in McCLIM is?
It looks like it tries to handle functions for translating from some internal format of McCLIM (hopefully Unicode) to X11 font encoding.
OK. Under which conditions should the code which uses and defines external-format::ksc5601-code-to-font-index etc. be defined?
- If the Lisp implementation supports Unicode? #+unicode
- If CLIM should support Unicode? #+clim-unicode
It looks to me like the functionality in that package should always be there. A McCLIM text style should probably correspond to multiple X fonts possibly each with a different font encoding. The translate function passed to draw-glyphs should be tailored to that font set because it knows about the encoding of each X font and when it would have to switch between fonts.
And what shall happen on implementations that don't have an EXTERNAL-FORMAT package? Why is there no (DEFPACKAGE "EXTERNAL-FORMAT" ...) in McCLIM?
I don't know, because I am not sure who wrote the Korean gadget test. But McCLIM clearly breaks if :unicode is a feature. Again, I don't think that package should be there and that the functionality that it supplies always should.
Now the question is: is there a reasonable way that we can hide the complexity of the translate function at the CLIM level. Or should we on the contrary find a way to expose its flexibility to the programmer using CLIM?