Greetings! Looks good. Take care,
Matt Kaufmann <[EMAIL PROTECTED]> writes: > Hi, Camm -- > > Thanks. OK then, in order to get this patch just to apply to GCL > 2.6.7 (and perhaps before), I've changed my one-liner patch to the > following. Please let me know if you see a problem with it. > > #+(and gcl (not ansi-cl)) > (when (and (fboundp 'compiler::wrap-literals) > (not (gcl-version-> 2 6 7))) > (setf (symbol-function 'compiler::wrap-literals) > (symbol-function 'identity))) > > ; where [this is old code so I'm pretty sure it's OK]: > > #+gcl > (defun gcl-version-> (major minor extra &optional weak) > > ; When true, this guarantees that the current GCL version is greater than > ; major.minor.extra (or if weak is non-nil, than greater than or equal to). > ; The converse holds for versions of GCL past perhaps 2.0. > > (and (boundp 'si::*gcl-major-version*) > (integerp si::*gcl-major-version*) > (if (= si::*gcl-major-version* major) > (and (boundp 'si::*gcl-minor-version*) > (integerp si::*gcl-minor-version*) > (if (= si::*gcl-minor-version* minor) > (and (boundp 'si::*gcl-extra-version*) > (integerp si::*gcl-extra-version*) > (if weak > (>= si::*gcl-extra-version* extra) > (> si::*gcl-extra-version* extra))) > (if weak > (>= si::*gcl-minor-version* minor) > (> si::*gcl-minor-version* minor)))) > (if weak > (>= si::*gcl-major-version* major) > (> si::*gcl-major-version* major))))) > > Thanks -- > -- Matt > Sender: [EMAIL PROTECTED] > Cc: gcl-devel@gnu.org > From: Camm Maguire <[EMAIL PROTECTED]> > Date: 16 May 2007 12:01:57 -0400 > X-SpamAssassin-Status: Yes, hits=6.7 required=5.0 > X-UTCS-Spam-Status: No, hits=-120 required=200 > > Greetings! > > Matt Kaufmann <[EMAIL PROTECTED]> writes: > > > Hi, Camm -- > > > > Nice work! > > > > I tried your latest patch, nc1.l, by loading and compiling it in GCL > > 2.6.7 and then loading the .o file as part of the ACL2 build process. > > Then I ran my local regression (which includes a little more than the > > distributed and workshop books), which passed. I got these results. > > > > Using only (defun compiler::wrap-literals (x) x): > > 12987.607u 275.321s 3:45:30.28 98.0% 0+0k 0+0io 0pf+0w > > > > Using nc1.o: > > 12874.456u 279.197s 3:46:40.46 96.7% 0+0k 0+0io 1pf+0w > > > > Speedup: almost 1%. > > (/ (- (+ 12874.456 279.197) (+ 12987.607 275.321)) > > (+ 12987.607 275.321)) > > -0.008239130906840452 > > > > Still, I'm tempted to distribute only the one-line patch with ACL2, > > since otherwise it seems I'd need to automate the compiling of your > > new compiler file as part of the ACL2 build process. Alternatively, I > > could perhaps prefix each of your new three forms with compiler:: so > > that they can go into existing ACL2 source file acl2-fns.lisp, or even > > put in compiler::(progn <form1> <form2> <form3>). Thoughts? > > > > Either way, should I make loading of the (one-line or three-function) > > patch conditional on being GCL Version 2.6.7, or would this be > > suitable for any 2.6.* version? > > > > I think your one-liner is good for <= 2.6.7. I've committed the 3-fn > patch to 2.6.8pre, and it is already in cvs head (2.7.0). > > compile can likely be sped up a bit further by eliding all i/o before > the c file is output. > > Take care, > > > Thanks -- > > -- Matt > > Cc: gcl-devel@gnu.org > > From: Camm Maguire <[EMAIL PROTECTED]> > > Date: 07 May 2007 16:09:14 -0400 > > X-SpamAssassin-Status: No, hits=1.3 required=5.0 > > X-UTCS-Spam-Status: No, hits=-240 required=200 > > > > Greetings, and thanks! > > > > Matt Kaufmann <[EMAIL PROTECTED]> writes: > > > > > Hi, Camm -- > > > > > > Regarding: > > > > > > >> it could save me a bit of time. > > > > > > If it would help you out and it's just a matter of my compiling a > lisp > > > file into an ACL2 image (like I did before), then I'd be happy to > try > > > it out. > > > > > > > OK here is one to try (just small patches to 3 functions in 2.6.7): > > > > > ============================================================================= > > nc1.l > > > ============================================================================= > > (in-package 'compiler) > > > > (defun compile (name &optional def &aux tem gaz > (*default-pathname-defaults* #".")) > > > > (cond ((not(symbolp name)) (error "Must be a name")) > > ((and (consp def) > > (member (car def) '(lambda ))) > > (or name (setf name 'cmp-anon)) > > (setf (symbol-function name) > > def) > > (compile name)) > > (def (error "def not a lambda expression")) > > ((setq tem (macro-function name)) > > (setf (symbol-function 'cmp-anon) tem) > > (compile 'cmp-anon) > > (setf (macro-function name) (macro-function name)) > > ;; FIXME -- support warnings-p and failures-p. CM 20041119 > > (values name nil nil)) > > ((and (setq tem (symbol-function name)) > > (consp tem)) > > (let ((na (if (symbol-package name) name 'cmp-anon))) > > (unless (and (fboundp 'si::init-cmp-anon) (or (si::init-cmp-anon) > (fmakunbound 'si::init-cmp-anon))) > > (with-open-file > > (st (setq gaz (gazonk-name)) :direction :output)) > > (let* ((*compiler-compile* `(defun ,na ,@ (ecase (car tem) > > (lambda (cdr tem)) > > (lambda-block (cddr > tem))))) > > (fi (compile-file gaz))) > > (load fi) > > (delete-file fi)) > > (unless *keep-gaz* (delete-file gaz))) > > (or (eq na name) (setf (symbol-function name) (symbol-function > na))) > > ;; FIXME -- support warnings-p and failures-p. CM 20041119 > > (values (symbol-function name) nil nil) > > )) > > (t (error "can't compile ~a" name)))) > > > > (defun compile-file1 (input-pathname > > &key (output-file input-pathname) > > (o-file t) > > (c-file *default-c-file*) > > (h-file *default-h-file*) > > (data-file *default-data-file*) > > (c-debug nil) > > #+aosvs (ob-file nil) > > (system-p *default-system-p*) > > (print nil) > > (load nil) > > &aux (*standard-output* *standard-output*) > > (*error-output* *error-output*) > > (*compiler-in-use* *compiler-in-use*) > > (*c-debug* c-debug) > > (*compile-print* (or print *compile-print*)) > > (*package* *package*) > > (*DEFAULT-PATHNAME-DEFAULTS* #"") > > (*data* (list (make-array 50 :fill-pointer 0 > > :adjustable t > > ) > > nil ;inits > > nil > > )) > > *init-name* > > (*fasd-data* *fasd-data*) > > (*error-count* 0)) > > (declare (special *c-debug* *init-name* system-p)) > > > > (cond (*compiler-in-use* > > (format t "~&The compiler was called recursively.~%~ > > Cannot compile ~a.~%" > > (namestring (merge-pathnames input-pathname #".lsp"))) > > (setq *error-p* t) > > (return-from compile-file1 (values))) > > (t (setq *error-p* nil) > > (setq *compiler-in-use* t))) > > > > (unless (probe-file (merge-pathnames input-pathname #".lsp")) > > (format t "~&The source file ~a is not found.~%" > > (namestring (merge-pathnames input-pathname #".lsp"))) > > (setq *error-p* t) > > (return-from compile-file1 (values))) > > > > (when *compile-verbose* > > (format t "~&Compiling ~a.~%" > > (namestring (merge-pathnames input-pathname #".lsp")))) > > > > (and *record-call-info* (clear-call-table)) > > > > (with-open-file > > (*compiler-input* (merge-pathnames input-pathname #".lsp")) > > > > > > (cond ((numberp *split-files*) > > (if (< (file-length *compiler-input*) *split-files*) > > (setq *split-files* nil) > > ;;*split-files* = ( section-length split-file-names > next-section-start-file-position > > ;; package-ops) > > (setq *split-files* (list *split-files* nil 0 nil))))) > > > > (cond ((consp *split-files*) > > (file-position *compiler-input* (third *split-files*)) > > (setq output-file > > (make-pathname :directory (pathname-directory output-file) > > :name (format nil "~a~a" > > (length (second *split-files*)) > > (pathname-name (pathname > output-file))) > > :type "o")) > > > > (push (pathname-name output-file) (second *split-files*)) > > )) > > > > > > > > > > (let* ((eof (cons nil nil)) > > (dir (or (and (not (null output-file)) > > (pathname-directory output-file)) > > (pathname-directory input-pathname))) > > (name (or (and (not (null output-file)) > > (pathname-name output-file)) > > (pathname-name input-pathname))) > > (device (or (and (not (null output-file)) > > (pathname-device output-file)) > > (pathname-device input-pathname))) > > > > (o-pathname (get-output-pathname o-file "o" name dir device)) > > (c-pathname (get-output-pathname c-file "c" name dir device)) > > (h-pathname (get-output-pathname h-file "h" name dir device)) > > (data-pathname (get-output-pathname data-file "data" name dir > device)) > > ; (i-pathname (get-output-pathname data-file "i" name dir)) > > #+aosvs (ob-pathname (get-output-pathname ob-file "ob" name dir > device)) > > ) > > (declare (special dir name )) > > > > (init-env) > > > > (and (boundp 'si::*gcl-version*) > > (not system-p) > > (add-init `(si::warn-version ,si::*gcl-major-version* > > ,si::*gcl-minor-version* > > ,si::*gcl-extra-version*))) > > > > (when (probe-file "./gcl_cmpinit.lsp") > > (load "./gcl_cmpinit.lsp" > > :verbose *compile-verbose*)) > > > > (with-open-file (*compiler-output-data* > > data-pathname > > :direction :output) > > (progn > > (setq *fasd-data* > > (cond ((if system-p (eq *fasd-data* :system-p) > > *fasd-data*) > > (list > > (si::open-fasd *compiler-output-data* :output nil nil) > > ;(si::open-fasd *compiler-output-i* :output nil nil) > > )))) > > > > (wt-data-begin) > > > > (if *compiler-compile* > > (t1expr *compiler-compile*) > > (let* ((rtb *readtable*) > > (prev (and (eq (get-macro-character #\# rtb) > > (get-macro-character > > #\# (si:standard-readtable))) > > (get-dispatch-macro-character #\# #\, rtb)))) > > (if (and prev (eq prev (get-dispatch-macro-character > > #\# #\, (si:standard-readtable)))) > > (set-dispatch-macro-character #\# #\, > > > 'si:sharp-comma-reader-for-compiler rtb) > > (setq prev nil)) > > > > ;; t1expr the package ops again.. > > (if (consp *split-files*) > > (dolist (v (fourth *split-files*)) (t1expr v))) > > (unwind-protect > > (do ((form (read *compiler-input* nil eof) > > (read *compiler-input* nil eof)) > > (load-flag (or (eq :defaults *eval-when-defaults*) > > (member 'load *eval-when-defaults*)))) > > (nil) > > (cond > > ((eq form eof)) > > (load-flag (t1expr form)) > > ((maybe-eval nil form))) > > (cond > > ((and *split-files* (check-end form eof)) > > (setf (fourth *split-files*) (reverse (third *data*))) > > (return nil)) > > ((eq form eof) (return nil))) > > ) > > > > (when prev (set-dispatch-macro-character #\# #\, prev rtb)))))) > > > > (setq *init-name* (init-name input-pathname system-p)) > > ; (let ((x (merge-pathnames #".o" o-pathname))) > > ; (with-open-file (s x :if-does-not-exist :create) > > ; (setq *init-name* (init-name x system-p))) > > ; (delete-file x)) > > > > (when (zerop *error-count*) > > (when *compile-verbose* (format t "~&End of Pass 1. ~%")) > > (compiler-pass2 c-pathname h-pathname system-p )) > > > > > > (wt-data-end) > > > > ) ;;; *compiler-output-data* closed. > > > > (init-env) > > > > (if (zerop *error-count*) > > > > #+aosvs > > (progn > > (when *compile-verbose* (format t "~&End of Pass 2. ~%")) > > (when data-file > > (with-open-file (in fasl-pathname) > > (with-open-file (out data-pathname :direction :output) > > (si:copy-stream in out)))) > > (cond ((or fasl-file ob-file) > > (compiler-cc c-pathname ob-pathname) > > (cond ((probe-file ob-pathname) > > (when fasl-file > > (compiler-build ob-pathname fasl-pathname) > > (when load (load fasl-pathname))) > > (unless ob-file (delete-file ob-pathname)) > > (when *compile-verbose* > > (print-compiler-info) > > (format t "~&Finished compiling ~a.~%" > (namestring output-file)) > > )) > > (t (format t "~&Your C compiler failed to compile the > intermediate file.~%") > > (setq *error-p* t)))) > > (*compile-verbose* > > (print-compiler-info) > > (format t "~&Finished compiling ~a.~%" (namestring > output-file) > > ))) > > (unless c-file (delete-file c-pathname)) > > (unless h-file (delete-file h-pathname)) > > (unless fasl-file (delete-file fasl-pathname))) > > > > > > (progn > > (when *compile-verbose* (format t "~&End of Pass 2. ~%")) > > (cond (*record-call-info* > > (dump-fn-data (get-output-pathname output-file "fn" name > dir device)))) > > (cond (o-file > > (compiler-cc c-pathname o-pathname ) > > (cond ((probe-file o-pathname) > > (compiler-build o-pathname data-pathname) > > (when load (load o-pathname)) > > (when *compile-verbose* > > (print-compiler-info) > > (format t "~&Finished compiling ~a.~%" > (namestring output-file) > > ))) > > (t > > (format t "~&Your C compiler failed to compile the > intermediate file.~%") > > (setq *error-p* t)))) > > (*compile-verbose* > > (print-compiler-info) > > (format t "~&Finished compiling ~a.~%" (namestring > output-file) > > ))) > > (unless c-file (delete-file c-pathname)) > > (unless h-file (delete-file h-pathname)) > > (unless (or data-file #+ld-not-accept-data t system-p) > (delete-file data-pathname)) > > o-pathname) > > > > (progn > > (when (probe-file c-pathname) (delete-file c-pathname)) > > (when (probe-file h-pathname) (delete-file h-pathname)) > > (when (probe-file data-pathname) (delete-file data-pathname)) > > (format t "~&No FASL generated.~%") > > (setq *error-p* t) > > (values) > > ))))) > > > > > > ; ((and *compiler-compile* (not *keep-gaz*)) > > ; (setf (info-type info) (object-type val)) > > ; (list 'LOCATION info (list 'VV (add-object (cons 'si::|#,| > `(si::nani ,(si::address val))))))) > > > > (defun c1constant-value (val always-p) > > (cond > > ((eq val nil) (c1nil)) > > ((eq val t) (c1t)) > > ((si:fixnump val) > > (list 'LOCATION (make-info :type 'fixnum) > > (list 'FIXNUM-VALUE (and (>= (abs val) 1024)(add-object val)) > > val))) > > ((characterp val) > > (list 'LOCATION (make-info :type 'character) > > (list 'CHARACTER-VALUE (add-object val) (char-code val)))) > > ((typep val 'long-float) > > ;; We can't read in long-floats which are too big: > > (let* (sc (vv (cond ((> (abs val) (/ most-positive-long-float 2)) > > (add-object `(si::|#,| * ,(/ val > most-positive-long-float) most-positive-long-float))) > > ((< (abs val) (* least-positive-long-float 1.0d20)) > > (add-object `(si::|#,| * ,(/ val > least-positive-long-float) least-positive-long-float))) > > ((setq sc t) (add-object val))))) > > `(location ,(make-info :type 'long-float) > > ,(if sc (list 'LONG-FLOAT-VALUE vv val) (list 'vv vv))))) > > ((typep val 'short-float) > > (list 'LOCATION (make-info :type 'short-float) > > (list 'SHORT-FLOAT-VALUE (add-object val) val))) > > ((and *compiler-compile* (not *keep-gaz*)) > > (list 'LOCATION (make-info :type (object-type val)) > > (list 'VV (add-object (cons 'si::|#,| `(si::nani ,(si::address > val))))))) > > (always-p > > (list 'LOCATION (make-info :type (object-type val)) > > (list 'VV (add-object val)))) > > (t nil))) > > > ============================================================================= > > > > > -- Matt > > > Sender: [EMAIL PROTECTED] > > > Cc: gcl-devel@gnu.org > > > From: Camm Maguire <[EMAIL PROTECTED]> > > > Date: 03 May 2007 16:12:35 -0400 > > > X-SpamAssassin-Status: No, hits=1.3 required=5.0 > > > X-UTCS-Spam-Status: No, hits=-250 required=200 > > > > > > Greetings! > > > > > > Matt Kaufmann <[EMAIL PROTECTED]> writes: > > > > > > > Hi, Camm -- > > > > > > > > I tried the fix, and it worked, though as you suggested, it > may need > > > > tuning for speed. Result is the third line of numbers below: > > > > > > > > ; Original run: > > > > 12990.367u 274.629s 3:46:08.34 97.7% 0+0k 0+0io 5pf+0w > > > > > > > > ; One-line fix: > > > > 12987.607u 275.321s 3:45:30.28 98.0% 0+0k 0+0io 0pf+0w > > > > > > > > ; The latest: > > > > 13587.777u 296.454s 4:03:23.40 95.0% 0+0k 0+0io 17pf+0w > > > > > > > > As for ACL2, I plan just to use the following (aforementioned) > > > > "One-line fix" (let me know if you object), since it's simplest > > > > (perhaps safest, certainly easiest for me to distribute). > > > > > > > > #+(and gcl (not ansi-cl)) > > > > (defun compiler::wrap-literals (x) x) > > > > > > > > If you want to experiment with tuning your latest fix, you > could > > > > presumably built ACL2 3.2 with (load > > > > "/projects/acl2/devel/compiler-patch.o") in the current > directory. > > > > (By the way, I compiled compiler-patch.lsp in a fresh GCL > 2.6.7 with > > > > default optimization; I wonder if optimizing could be part of > the > > > > "tuning for speed".) > > > > > > > > > > OK, thanks to your prompting, I've figured out a way to avoid > > > wrap-literals entirely (and all that new code), and to avoid the > > > prin1/read in pass1 when invoked from within compile, which might > > > speed things up a bit from the fastest you have above. It could > be > > > argued that this belongs in 2.6 as the current wrap-literals is > > > buggy. Your solution above is of course fine, but in case you'd > like > > > to try this last idea, please let me know -- it could save me a > bit of > > > time. > > > > > > Take care, > > > > > > > -- Matt > > > > Sender: [EMAIL PROTECTED] > > > > Cc: gcl-devel@gnu.org > > > > From: Camm Maguire <[EMAIL PROTECTED]> > > > > Date: 02 May 2007 17:17:25 -0400 > > > > X-SpamAssassin-Status: No, hits=-1.3 required=5.0 > > > > X-UTCS-Spam-Status: No, hits=-281 required=200 > > > > > > > > Greetings, and thanks so much! Obviously a bone-headed > first attempt > > > > -- my apologies. > > > > > > > > This should work or be close, but might need tuning for > speed. If you > > > > could test, I'd be most grateful. Just compile and load the > > > > following: > > > > > > > > > ============================================================================= > > > > (in-package 'compiler) > > > > > > > > (defvar *mlts* nil) > > > > > > > > (defmacro ndbctxt (&rest body) > > > > `(let ((*compiler-check-args* *compiler-check-args*) > > > > (*safe-compile* *safe-compile*) > > > > (*compiler-push-events* *compiler-push-events*) > > > > (*notinline* *notinline*) > > > > (*space* *space*)) > > > > ,@body)) > > > > > > > > (defun portable-source (form &optional cdr) > > > > (cond ((atom form) form) > > > > (cdr (cons (portable-source (car form)) > (portable-source (cdr form) t))) > > > > ((case (car form) > > > > ((let let* lambda) > > > > `(,(car form) > > > > ,(mapcar (lambda (x) (if (atom x) x > `(,(car x) ,@(portable-source (cdr x) t)))) (cadr form)) > > > > ,@(let ((r (remove-if-not 'si::specialp > (mapcar (lambda (x) (if (atom x) x (car x))) (cadr form))))) > > > > (when r `((declare (special ,@r))))) > > > > ,@(ndbctxt (portable-source (cddr form) > t)))) > > > > ((quote function) form) > > > > (declare > > > > (let ((opts (mapcan (lambda (x) (if (eq (car > x) 'optimize) (cdr x) (list x))) > > > > (remove-if-not > > > > (lambda (x) (and (consp > x) (member (car x) '(optimize notinline)))) > > > > (cdr form))))) > > > > (when opts (local-compile-decls opts))) > > > > form) > > > > (the `(,(car form) ,(cadr form) > ,@(portable-source (cddr form) t))) > > > > ((and or) `(,(car form) ,@(portable-source > (cdr form) t))) > > > > (check-type form) > > > > ((flet labels macrolet) > > > > `(,(car form) > > > > ,(mapcar (lambda (x) `(,(car x) ,@(cdr > (portable-source `(lambda ,@(cdr x)))))) (cadr form)) > > > > ,@(let ((*mlts* *mlts*)) > > > > (when (eq (car form) 'macrolet) > > > > (dolist (l (cadr form)) (push (car > l) *mlts*))) > > > > (ndbctxt (portable-source (cddr form) > t))))) > > > > (multiple-value-setq (portable-source > (multiple-value-setq-expander (cdr form)))) > > > > (multiple-value-bind `(,(car form) ,(cadr > form) ,(portable-source (caddr form)) > > > > ,@(let ((r > (remove-if-not 'si::specialp (cadr form)))) > > > > (when r `((declare > (special ,@r))))) > > > > ,@(ndbctxt > (portable-source (cdddr form) t)))) > > > > ((case ccase ecase) `(,(car form) > ,(portable-source (cadr form)) > > > > ,@(mapcar (lambda (x) > `(,(car x) ,@(portable-source (cdr x) t))) (cddr form)))))) > > > > ((let* ((fd (and (symbolp (car form)) (not (member > (car form) *mlts*)) > > > > (or (unless (member (car form) > *notinline*) (get (car form) 'si::compiler-macro-prop)) > > > > (macro-function (car form))))) > > > > (nf (if fd (cmp-expand-macro fd (car form) > (cdr form)) form))) > > > > (portable-source nf (equal form nf)))))) > > > > > > > > (defun this-safety-level nil > > > > (cond (*compiler-push-events* 3) > > > > (*safe-compile* 2) > > > > (*compiler-check-args* 1) > > > > (0))) > > > > > > > > (defun local-compile-decls (decls) > > > > (dolist** > > > > (decl decls) > > > > (unless (consp decl) (setq decl (list decl 3))) > > > > (case (car decl) > > > > (safety > > > > (let ((level (cadr decl))) > > > > (declare (fixnum level)) > > > > (setq *compiler-check-args* (>= level 1) > > > > *safe-compile* (>= level 2) > > > > *compiler-push-events* (>= level 3)))) > > > > (space (setq *space* (cadr decl))) > > > > (notinline (push (cadr decl) *notinline*)) > > > > (speed) ;;FIXME > > > > (compilation-speed) ;;FIXME > > > > (inline > > > > (setq *notinline* (remove (cadr decl) > *notinline*))) > > > > (otherwise (baboon))))) > > > > > > > > (defun pd (fname ll args) > > > > (let (decls ctps doc) > > > > (when (and (consp args) (stringp (car args)) (cdr args) > (not doc)) (push (pop args) doc)) > > > > (do nil ((or (not args) (not (consp (car args))) (not > (eq (caar args) 'declare)))) > > > > (push (pop args) decls)) > > > > (do nil ((or (not args) (not (consp (car args))) (not > (eq (caar args) 'check-type)))) > > > > (push (pop args) ctps)) > > > > (let* ((nal (do (r (y ll)) ((or (not y) (eq (car y) > '&aux)) (nreverse r)) (push (pop y) r))) > > > > (al (cdr (member '&aux ll))) > > > > (ax (mapcar (lambda (x) (if (atom x) x (car x))) > al)) > > > > (dd (aux-decls ax decls)) > > > > (cc (aux-ctps ax ctps)) > > > > (sd `(declare (optimize (safety > ,(this-safety-level)))))) > > > > (portable-source `(lambda ,nal > > > > ,@doc > > > > ,@(let ((r (nreverse (cadr dd)))) > > > > (unless (and (consp r) (consp > (car r)) (eq (caar r) 'declare) > > > > (consp (cadar r)) > (eq (caadar r) 'optimize) > > > > (consp (cadr > (cadar r))) (eq (caadr (cadar r)) 'safety)) > > > > (push sd r)) > > > > (nconc r (cadr cc))) > > > > ,@(let* ((r args) > > > > (r (if (or al (car dd)) > `((let* ,al ,@(append (car dd) (car cc)) ,@r)) r)) > > > > (r (if (and (consp (car > r)) (eq (caar r) 'block) (eq (cadar r) fname)) > > > > r `((block ,fname > ,@r))))) > > > > r)))))) > > > > > > > > (defun aux-decls (auxs decls) > > > > (let (ad dd) > > > > (dolist (l decls) > > > > (let* ((b (cadr l)) > > > > (b (if (eq (car b) 'type) (cdr b) b))) > > > > (cond ((eq (car b) 'optimize) (push l dd)) > > > > ((eq (car b) 'class) > > > > (unless (<= (length b) 3) > > > > (cmperr "Unknown class declaration: ~s" b)) > > > > (if (member (cadr b) auxs) (push l ad) (push > l dd))) > > > > ((let ((tt (intersection (cdr b) auxs))) > > > > (cond ((not tt) (push l dd)) > > > > ((let ((z (if (eq b (cadr l)) (list > (caadr l)) (list (caadr l) (cadadr l))))) > > > > (push `(declare (,@z ,@tt)) ad) > > > > (let ((q (set-difference (cdr b) > auxs))) > > > > (when q > > > > (push `(declare (,@z ,@q)) > dd))))))))))) > > > > (list (nreverse ad) (nreverse dd)))) > > > > > > > > (defun aux-ctps (auxs ctps) > > > > (let (ad dd) > > > > (dolist (l ctps) (if (member (cadr l) auxs) (push l ad) > (push l dd))) > > > > (list (nreverse ad) (nreverse dd)))) > > > > > > > > (defun ppd (form) > > > > (ecase (car form) > > > > (lambda (pd 'cmp-anon (cadr form) (cddr form))) > > > > (lambda-block (pd (cadr form) (caddr form) (cdddr > form))) > > > > (lambda-closure (pd 'cmp-anon (caddr (cddr form)) > (cdddr (cddr form)))) > > > > (lambda-block-closure (pd (cadr (cdddr form)) > (caddr (cdddr form)) (cdddr (cdddr form)))))) > > > > > > > > > > > > (defun wrap-literals (form &optional n) > > > > (if (not n) > > > > (wrap-literals (ppd form) t) > > > > (cond ((and (consp form) (eq (car form) 'quote)) > > > > (let ((x (cadr form))) > > > > (if (and (symbolp x) > > > > (eq :external (cadr > (multiple-value-list (find-symbol (symbol-name x) 'lisp))))) > > > > form > > > > `(load-time-value (si::nani ,(si::address > x)))))) > > > > ((consp form) > > > > (cons (wrap-literals (car form) t) (wrap-literals > (cdr form) t))) > > > > ((or (symbolp form) (numberp form) (characterp > form)) > > > > form) > > > > (`(load-time-value (si::nani ,(si::address > form))))))) > > > > > ============================================================================= > > > > > > > > Take care, > > > > > > > > Matt Kaufmann <[EMAIL PROTECTED]> writes: > > > > > > > > > Hi, Camm -- > > > > > > > > > > I needed to add this: > > > > > > > > > > compiler::(defvar *tmp-pack* nil) > > > > > > > > > > Actually I got through much of the regression suite > before hitting an > > > > > error when I had instead just declared *tmp-pack* special > in the > > > > > definition of wrap-literals. I think that I only hit an > error when > > > > > the compiler was called using compile rather than > compile-file. > > > > > > > > > > But then the regression failed. I distilled the > following small > > > > > example to illustrate the problem. I haven't > investigated in depth > > > > > but I suspect you'll figure it out quickly by tracing > > > > > compiler::wrap-literals. It appears that a variable > binding is being > > > > > treated as a macro call. > > > > > > > > > > sundance:~> gcl-2.6.7 > > > > > GCL (GNU Common Lisp) 2.6.7 CLtL1 Sep 15 2005 > 12:36:56 > > > > > Source License: LGPL(gcl,gmp), GPL(unexec,bfd) > > > > > Binary License: GPL due to GPL'ed components: (BFD > UNEXEC) > > > > > Modifications of this banner must retain notice of a > compatible license > > > > > Dedicated to the memory of W. Schelter > > > > > > > > > > Use (help) to get some basic information on how to use > GCL. > > > > > > > > > > >compiler::(defvar *tmp-pack* nil) > > > > > > > > > > COMPILER::*TMP-PACK* > > > > > > > > > > >compiler::(defun wrap-literals (form &aux fd) > > > > > (cond ((and (consp form) (eq (car form) 'quote)) > > > > > (let ((x (cadr form))) > > > > > (if (and (symbolp x) > > > > > (eq :external (cadr (multiple-value-list > (find-symbol (symbol-name x) 'lisp))))) > > > > > form > > > > > `(load-time-value (si::nani ,(si::address x)))))) > > > > > ((and (consp form) (symbolp (car form)) (not (eq > 'lambda (car form))) (setq fd (macro-function (car form)))) > > > > > (wrap-literals (cmp-expand-macro fd (car form) (cdr > form)))) > > > > > ((consp form) > > > > > (cons (wrap-literals (car form)) (wrap-literals (cdr > form)))) > > > > > ((symbolp form) > > > > > (unless (symbol-package form) > > > > > (unless *tmp-pack* > > > > > (setq *tmp-pack* (make-package (symbol-name > (gensym))))) > > > > > (import form *tmp-pack*)) > > > > > form) > > > > > ((or (rationalp form) (characterp form)) > > > > > form) > > > > > (`(load-time-value (si::nani ,(si::address form)))))) > > > > > > > > > > COMPILER::WRAP-LITERALS > > > > > > > > > > >(defmacro my-cons2 (name) > > > > > (list 'cons name name)) > > > > > > > > > > MY-CONS2 > > > > > > > > > > >(defun foo (x) > > > > > (let ((my-cons2 (cdr x))) > > > > > (equal my-cons2 nil))) > > > > > > > > > > FOO > > > > > > > > > > >(compile 'foo) > > > > > > > > > > Compiling gazonk8.lsp. > > > > > ; (DEFUN FOO ...) is being compiled. > > > > > ;;; The variable binding (CONS (CDR X) (CDR X)) is > illegal.;; Warning: The variable X is not used. > > > > > No FASL generated. > > > > > > > > > > Error: Cannot open the file NIL.. > > > > > Fast links are on: do (si::use-fast-links nil) for > debugging > > > > > Error signalled by LET. > > > > > Broken at LOAD. Type :H for Help. > > > > > >> > > > > > > > > > > -- Matt > > > > > Sender: [EMAIL PROTECTED] > > > > > Cc: gcl-devel@gnu.org > > > > > From: Camm Maguire <[EMAIL PROTECTED]> > > > > > Date: 01 May 2007 14:07:41 -0400 > > > > > X-SpamAssassin-Status: No, hits=-2.5 required=5.0 > > > > > X-UTCS-Spam-Status: No, hits=-310 required=200 > > > > > > > > > > Greetings! I'm not very happy about the (not (eq > 'lambda (car > > > > > form))), but it might be worth testing this: > > > > > > > > > > (defun wrap-literals (form &aux fd) > > > > > (cond ((and (consp form) (eq (car form) 'quote)) > > > > > (let ((x (cadr form))) > > > > > (if (and (symbolp x) > > > > > (eq :external (cadr (multiple-value-list > (find-symbol (symbol-name x) 'lisp))))) > > > > > form > > > > > `(load-time-value (si::nani ,(si::address > x)))))) > > > > > ((and (consp form) (symbolp (car form)) (not (eq > 'lambda (car form))) (setq fd (macro-function (car form)))) > > > > > (wrap-literals (cmp-expand-macro fd (car form) (cdr > form)))) > > > > > ((consp form) > > > > > (cons (wrap-literals (car form)) (wrap-literals > (cdr form)))) > > > > > ((symbolp form) > > > > > (unless (symbol-package form) > > > > > (unless *tmp-pack* > > > > > (setq *tmp-pack* (make-package (symbol-name > (gensym))))) > > > > > (import form *tmp-pack*)) > > > > > form) > > > > > ((or (rationalp form) (characterp form)) > > > > > form) > > > > > (`(load-time-value (si::nani ,(si::address form)))))) > > > > > > > > > > Take care, > > > > > > > > > > > > > > > Matt Kaufmann <[EMAIL PROTECTED]> writes: > > > > > > > > > > > By the way, the times for the ACL2 regression suite > are virtually > > > > > > identical before and after the following change > (added to a compiled > > > > > > ACL2 source file): > > > > > > > > > > > > #+(and gcl (not ansi-cl)) (defun > compiler::wrap-literals (x) x) > > > > > > > > > > > > ; Before above addition: > > > > > > 12990.367u 274.629s 3:46:08.34 97.7% 0+0k 0+0io > 5pf+0w > > > > > > ; After above addition: > > > > > > 12987.607u 275.321s 3:45:30.28 98.0% 0+0k 0+0io > 0pf+0w > > > > > > > > > > > > I've saved a copy of the development sources that I > used, so that I > > > > > > can test an alternate wrap-literals that you send me. > > > > > > > > > > > > -- Matt > > > > > > Sender: [EMAIL PROTECTED] > > > > > > Cc: gcl-devel@gnu.org > > > > > > From: Camm Maguire <[EMAIL PROTECTED]> > > > > > > Date: 30 Apr 2007 13:35:32 -0400 > > > > > > X-SpamAssassin-Status: No, hits=-2.5 required=5.0 > > > > > > X-UTCS-Spam-Status: No, hits=-310 required=200 > > > > > > > > > > > > Greetings! This should work. Would you be > willing to test an > > > > > > alternate wrap-literals if I get one together in > the near-future? > > > > > > > > > > > > Take care, > > > > > > > > > > > > Matt Kaufmann <[EMAIL PROTECTED]> writes: > > > > > > > > > > > > > Thank you, Camm. Unfortunately, after (setq > compiler::*keep-gaz* t), > > > > > > > then all the gazonk*.lsp files are left around. > So I'm wondering if > > > > > > > it would safe to do the following instead: > > > > > > > > > > > > > > #+(and gcl (not ansi-cl)) (defun > compiler::wrap-literals (x) x) > > > > > > > #+(and gcl (not ansi-cl)) (compile > 'compiler::wrap-literals) > > > > > > > > > > > > > > A small test suggests that this may work, > though I have no idea really > > > > > > > what I'm doing. Should I expect the above > solution to be OK? > > > > > > > > > > > > > > Thanks -- > > > > > > > -- Matt > > > > > > > Sender: [EMAIL PROTECTED] > > > > > > > Cc: gcl-devel@gnu.org > > > > > > > From: Camm Maguire <[EMAIL PROTECTED]> > > > > > > > Date: 30 Apr 2007 12:16:06 -0400 > > > > > > > X-SpamAssassin-Status: No, hits=-2.5 > required=5.0 > > > > > > > X-UTCS-Spam-Status: No, hits=-310 > required=200 > > > > > > > > > > > > > > Greetings, and thanks so much for this > report! > > > > > > > > > > > > > > The issue in brief stems from ansification > -- compile'ed forms must > > > > > > > refer to the exact object literally referred > to in the form, not a > > > > > > > copy, so the traditional GCL print and > compile-file won't work. The > > > > > > > function is compiler::wrap-literals, which > you can trace if > > > > > > > interested. There is obviously a bug here > -- most likely > > > > > > > wrap-literals should do some selective > macro-expansion, perhaps along > > > > > > > the lines of compiler::portable-source in > 2.7.0. I will see if I can > > > > > > > come up with a solution which also retains > our current (2.7.0) > > > > > > > compatibility with the ansi tests for > compile. If you have any > > > > > > > suggestions, they are of course most > appreciated. The tests in > > > > > > > question as run thus: > > > > > > > > > > > > > > cd ansi-tests > > > > > > > ../unixport/saved_ansi_gcl > > > > > > > >(load "gclload1") > > > > > > > >(load "compile") > > > > > > > >(load "compile-file") > > > > > > > >(rt:do-tests) > > > > > > > > > > > > > > There is an immediate work-around. Set the > variable > > > > > > > compiler::*keep-gaz* to t -- this avoids > wrap-literals and behaves as > > > > > > > the traditional compile via > print/compile-file did. The idea is that > > > > > > > there are certain packages in the ansi > build, notably pcl, which > > > > > > > compile functions which need to be linked > later in gazonk files at the > > > > > > > raw build stage. Even though pcl uses > compile here, literal object > > > > > > > reference is impossible as the running image > at compile time is gone. > > > > > > > So qualitatively if one needs to keep the > gazonk files around, they > > > > > > > better not refer to objects only available > in the compiling image. > > > > > > > > > > > > > > This exception in all likelihood should not > be there eventually, but I > > > > > > > can't at the moment envision a bridge > between ansi compile and > > > > > > > traditional gcl compile without one. > > > > > > > > > > > > > > Comments/suggestions as always most welcome. > > > > > > > > > > > > > > Take care, > > > > > > > > > > > > > > Matt Kaufmann <[EMAIL PROTECTED]> writes: > > > > > > > > > > > > > > > Hello -- > > > > > > > > > > > > > > > > It appears that the GCL compiler (at > least: version 2.6.7 CLtL1, and > > > > > > > > also version 2.7.0 ANSI as of about > 11/27/06) is laying down calls of > > > > > > > > lisp::load-time-value that are interfering > with macro expansion. > > > > > > > > Below is an example exhibiting the problem. > > > > > > > > > > > > > > > > Is there any simple workaround, such as > (setq *some-compiler-switch* > > > > > > > > nil)? By the way, the actual (much > bigger) failure I had, from which > > > > > > > > the example below is extracted, was only > an explicit error when > > > > > > > > calling COMPILE as shown below. When I > put the function into a file, > > > > > > > > I didn't see any problem with > COMPILE-FILE, but I found bizarre and > > > > > > > > somewhat nondeterministic behavior that > went away when I avoided > > > > > > > > compiling that function by loading the > .lisp file instead. > > > > > > > > > > > > > > > > ..... > > > > > > > > > > > > > > > > >(defmacro my-mac (b) > > > > > > > > (list 'list > > > > > > > > (if (and (consp b) > > > > > > > > (stringp (car b))) > > > > > > > > (list 'quote b) > > > > > > > > b))) > > > > > > > > > > > > > > > > MY-MAC > > > > > > > > > > > > > > > > >(defun foo () > > > > > > > > (my-mac ("Guards"))) > > > > > > > > > > > > > > > > FOO > > > > > > > > > > > > > > > > >(foo) > > > > > > > > > > > > > > > > (("Guards")) > > > > > > > > > > > > > > > > >(compile 'foo) > > > > > > > > > > > > > > > > Compiling gazonk4.lsp. > > > > > > > > ; (DEFUN FOO ...) is being compiled. > > > > > > > > ;;; The function (LOAD-TIME-VALUE > (SYSTEM:NANI 139732192)) is illegal. > > > > > > > > No FASL generated. > > > > > > > > > > > > > > > > Error: Cannot open the file NIL.. > > > > > > > > Fast links are on: do (si::use-fast-links > nil) for debugging > > > > > > > > Error signalled by LET. > > > > > > > > Broken at LOAD. Type :H for Help. > > > > > > > > >>(quit) > > > > > > > > sundance:~> cat gazonk4.lsp > > > > > > > > > > > > > > > > (lisp::defun user::foo lisp::nil > (user::my-mac ((lisp::load-time-value (system::nani 139732192)))))sundance:~> > > > > > > > > > > > > > > > > Thanks -- > > > > > > > > -- Matt > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > Camm Maguire > [EMAIL PROTECTED] > > > > > > > > ========================================================================== > > > > > > > "The earth is but one country, and mankind > its citizens." -- Baha'u'llah > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > Camm Maguire > [EMAIL PROTECTED] > > > > > > > ========================================================================== > > > > > > "The earth is but one country, and mankind its > citizens." -- Baha'u'llah > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > Camm Maguire > [EMAIL PROTECTED] > > > > > > ========================================================================== > > > > > "The earth is but one country, and mankind its > citizens." -- Baha'u'llah > > > > > > > > > > > > > > > > > > > > > > > -- > > > > Camm Maguire > [EMAIL PROTECTED] > > > > > ========================================================================== > > > > "The earth is but one country, and mankind its citizens." > -- Baha'u'llah > > > > > > > > > > > > > > > > > > -- > > > Camm Maguire [EMAIL > PROTECTED] > > > > ========================================================================== > > > "The earth is but one country, and mankind its citizens." -- > Baha'u'llah > > > > > > > > > > > > > -- > > Camm Maguire [EMAIL > PROTECTED] > > > ========================================================================== > > "The earth is but one country, and mankind its citizens." -- > Baha'u'llah > > > > > > > > > > -- > Camm Maguire [EMAIL > PROTECTED] > ========================================================================== > "The earth is but one country, and mankind its citizens." -- Baha'u'llah > > > -- Camm Maguire [EMAIL PROTECTED] ========================================================================== "The earth is but one country, and mankind its citizens." -- Baha'u'llah _______________________________________________ Gcl-devel mailing list Gcl-devel@gnu.org http://lists.gnu.org/mailman/listinfo/gcl-devel