From: Mike B. <be...@hi...> - 2003-10-30 23:38:33
|
Peter: (Thanks for the fix to accessors. That is working out now -- with very many positive implications I might add.) Now I am having some problems with macrolet. Here is the offending code: (macrolet ((class-slots* (class) `(sys::class-slots ,class)) (class-slots1 (obj) `(class-slots* (typecase ,obj (class ,obj) (symbol (find-class ,obj)) (t (class-of ,obj))))) (slot-name (slot) `(getf ,slot :name)) (slot-initargs (slot) `(getf ,slot :initargs)) (slot-one-initarg (slot) `(car (slot-initargs ,slot))) (slot-alloc (slot) `(getf ,slot :allocation)))) Well, really, it is the code below, but the above is nicer to test with, - Mike ;;--------------------------------- ;; This comes from CLOCC, btw ;; http://clocc.sourceforge.net ;;--------------------------------- #+(or allegro clisp cmu cormanlisp lispworks lucid sbcl armedbear) ;; we use `macrolet' for speed - so please be careful about double evaluations ;; and mapping (you cannot map or funcall a macro, you know) (eval-when (:compile-toplevel :load-toplevel :execute) (macrolet ((class-slots* (class) #+allegro `(clos:class-slots ,class) #+clisp `(clos::class-slots ,class) #+cmu `(pcl::class-slots ,class) #+cormanlisp `(cl:class-slots ,class) #+armedbear `(sys::class-slots ,class) #+lispworks `(hcl::class-slots ,class) #+lucid `(clos:class-slots ,class) #+sbcl `(sb-pcl::class-slots ,class)) (class-slots1 (obj) `(class-slots* (typecase ,obj (class ,obj) (symbol (find-class ,obj)) (t (class-of ,obj))))) (slot-name (slot) #+(and allegro (not (version>= 6))) `(clos::slotd-name ,slot) #+(and allegro (version>= 6)) `(clos:slot-definition-name ,slot) #+clisp `(clos::slotdef-name ,slot) #+cmu `(slot-value ,slot 'pcl::name) #+cormanlisp `(getf ,slot :name) #+armedbear `(getf ,slot :name) #+lispworks `(hcl::slot-definition-name ,slot) #+lucid `(clos:slot-definition-name ,slot) #+sbcl `(slot-value ,slot 'sb-pcl::name)) (slot-initargs (slot) #+(and allegro (not (version>= 6))) `(clos::slotd-initargs ,slot) #+(and allegro (version>= 6)) `(clos:slot-definition-initargs ,slot) #+clisp `(clos::slotdef-initargs ,slot) #+cmu `(slot-value ,slot 'pcl::initargs) #+cormanlisp `(getf ,slot :initargs) #+armedbear `(getf ,slot :initargs) #+lispworks `(hcl::slot-definition-initargs ,slot) #+lucid `(clos:slot-definition-initargs ,slot) #+sbcl `(slot-value ,slot 'sb-pcl::initargs)) (slot-one-initarg (slot) `(car (slot-initargs ,slot))) (slot-alloc (slot) #+(and allegro (not (version>= 6))) `(clos::slotd-allocation ,slot) #+(and allegro (version>= 6)) `(clos:slot-definition-allocation ,slot) #+clisp `(clos::slotdef-allocation ,slot) #+cmu `(pcl::slot-definition-allocation ,slot) #+cormanlisp `(getf ,slot :allocation) #+armedbear `(getf ,slot :allocation) #+lispworks `(hcl::slot-definition-allocation ,slot) #+lucid `(clos:slot-definition-allocation ,slot) #+sbcl `(sb-pcl::slot-definition-allocation ,slot))))) |
From: Mike B. <be...@hi...> - 2003-10-31 00:37:44
|
Btw, temporarily I am using: (defmacro class-slots1 (obj) `(sys::class-slots (typecase ,obj (class ,obj) (symbol (find-class ,obj)) (t (class-of ,obj))))) (defmacro slot-name (slot) `(getf ,slot :name)) (defmacro slot-initargs (slot) `(getf ,slot :initargs)) (defmacro slot-one-initarg (slot) `(car (slot-initargs ,slot))) (defmacro slot-alloc (slot) `(getf ,slot :allocation)) and it seems to work ok, so it is not a high-priority item. (There are already enough fires in California. I hope all is ok out there. Chicago is finally getting colder.) Also, these macros are called within a package so it is not going to affect anything outside it, btw, - Mike -----Original Message----- From: arm...@li... [mailto:arm...@li...] On Behalf Of Mike Beedle Sent: Thursday, October 30, 2003 5:38 PM To: arm...@li... Subject: [j-devel] macrolet ? Peter: (Thanks for the fix to accessors. That is working out now -- with very many positive implications I might add.) Now I am having some problems with macrolet. Here is the offending code: (macrolet ((class-slots* (class) `(sys::class-slots ,class)) (class-slots1 (obj) `(class-slots* (typecase ,obj (class ,obj) (symbol (find-class ,obj)) (t (class-of ,obj))))) (slot-name (slot) `(getf ,slot :name)) (slot-initargs (slot) `(getf ,slot :initargs)) (slot-one-initarg (slot) `(car (slot-initargs ,slot))) (slot-alloc (slot) `(getf ,slot :allocation)))) Well, really, it is the code below, but the above is nicer to test with, - Mike ;;--------------------------------- ;; This comes from CLOCC, btw ;; http://clocc.sourceforge.net ;;--------------------------------- #+(or allegro clisp cmu cormanlisp lispworks lucid sbcl armedbear) ;; we use `macrolet' for speed - so please be careful about double evaluations ;; and mapping (you cannot map or funcall a macro, you know) (eval-when (:compile-toplevel :load-toplevel :execute) (macrolet ((class-slots* (class) #+allegro `(clos:class-slots ,class) #+clisp `(clos::class-slots ,class) #+cmu `(pcl::class-slots ,class) #+cormanlisp `(cl:class-slots ,class) #+armedbear `(sys::class-slots ,class) #+lispworks `(hcl::class-slots ,class) #+lucid `(clos:class-slots ,class) #+sbcl `(sb-pcl::class-slots ,class)) (class-slots1 (obj) `(class-slots* (typecase ,obj (class ,obj) (symbol (find-class ,obj)) (t (class-of ,obj))))) (slot-name (slot) #+(and allegro (not (version>= 6))) `(clos::slotd-name ,slot) #+(and allegro (version>= 6)) `(clos:slot-definition-name ,slot) #+clisp `(clos::slotdef-name ,slot) #+cmu `(slot-value ,slot 'pcl::name) #+cormanlisp `(getf ,slot :name) #+armedbear `(getf ,slot :name) #+lispworks `(hcl::slot-definition-name ,slot) #+lucid `(clos:slot-definition-name ,slot) #+sbcl `(slot-value ,slot 'sb-pcl::name)) (slot-initargs (slot) #+(and allegro (not (version>= 6))) `(clos::slotd-initargs ,slot) #+(and allegro (version>= 6)) `(clos:slot-definition-initargs ,slot) #+clisp `(clos::slotdef-initargs ,slot) #+cmu `(slot-value ,slot 'pcl::initargs) #+cormanlisp `(getf ,slot :initargs) #+armedbear `(getf ,slot :initargs) #+lispworks `(hcl::slot-definition-initargs ,slot) #+lucid `(clos:slot-definition-initargs ,slot) #+sbcl `(slot-value ,slot 'sb-pcl::initargs)) (slot-one-initarg (slot) `(car (slot-initargs ,slot))) (slot-alloc (slot) #+(and allegro (not (version>= 6))) `(clos::slotd-allocation ,slot) #+(and allegro (version>= 6)) `(clos:slot-definition-allocation ,slot) #+clisp `(clos::slotdef-allocation ,slot) #+cmu `(pcl::slot-definition-allocation ,slot) #+cormanlisp `(getf ,slot :allocation) #+armedbear `(getf ,slot :allocation) #+lispworks `(hcl::slot-definition-allocation ,slot) #+lucid `(clos:slot-definition-allocation ,slot) #+sbcl `(sb-pcl::slot-definition-allocation ,slot))))) ------------------------------------------------------- This SF.net email is sponsored by: SF.net Giveback Program. Does SourceForge.net help you be more productive? Does it help you create better code? SHARE THE LOVE, and help us help YOU! Click Here: http://sourceforge.net/donate/ _______________________________________________ armedbear-j-devel mailing list arm...@li... https://lists.sourceforge.net/lists/listinfo/armedbear-j-devel |
From: Mike B. <be...@hi...> - 2003-10-31 00:58:32
|
Peter, all: progv would be nice to have, I saw it defined on: SpecialOperators.java: // ### progv SpecialOperators.java: private static final SpecialOperator PROGV = new SpecialOperator("progv") { rt.lisp: "progv" but this code didn't work: test 1: (setq *x* 1) (progv '(*x*) '(2) *x*) - Mike used in JLisa for: (defun make-intra-pattern-predicate (forms bindings negated-p) (let* ((special-vars (mapcar #'binding-variable bindings)) (body (if (consp (first forms)) forms (list forms))) (predicate (compile nil `(lambda () (declare (special ,@special-vars)) ,@body))) (test (function (lambda (tokens) (progv ;; -------------- `(,@special-vars) `(,@(mapcar #'(lambda (binding) (if (pattern-binding-p binding) (token-find-fact tokens (binding-address binding)) (get-slot-value (token-top-fact tokens) (binding-slot-name binding)))) bindings)) (funcall predicate)))))) (if negated-p (complement test) test))) |
From: Peter G. <pe...@ar...> - 2003-10-31 03:33:38
|
On Thu, 30 Oct 2003 at 18:58:17 -0600, Mike Beedle wrote: > progv would be nice to have, > > I saw it defined on: > SpecialOperators.java: // ### progv > SpecialOperators.java: private static final SpecialOperator PROGV = > new SpecialOperator("progv") { > rt.lisp: "progv" > > but this code didn't work: > > test 1: > (setq *x* 1) > (progv '(*x*) '(2) *x*) The existing code in SpecialOperators.java just signals an error ("PROGV is not implemented"). I'm working on it right, now but the implementation is a little tricky. I'll try to get it done tomorrow. -Peter |
From: Mike B. <be...@hi...> - 2003-10-31 05:32:20
|
Peter responded: >> Mike wrote: >> but this code didn't work: >> >> test 1: >> (setq *x* 1) >> (progv '(*x*) '(2) *x*) > > The existing code in SpecialOperators.java just signals an error > ("PROGV is not implemented"). > > I'm working on it right, now but the implementation is a little tricky. Peter, Yep, understood. It is fun to see these features implemented in Java, btw. Peter responded: > I'll try to get it done tomorrow. That will be great, thanks, - Mike |
From: Peter G. <pe...@ar...> - 2003-10-31 19:18:05
|
On Thu, 30 Oct 2003 at 19:33:45 -0800, Peter Graves wrote: > I'll try to get it done tomorrow. PROGV is done and available in current CVS. One caveat, which applies to more than just PROGV: contrary to the specification, ABL currently pays no attention to special declarations. So, for example: (let ((x 0)) (declare (special x)) ;; ABL ignores this declaration. (progv '(x) () (setq x 1)) x) This should return 0, but in ABL it returns 1, because, despite the declaration, ABL doesn't see x as a special variable. A workaround (which might not be available in every situation) is to defvar the variable first: #+armedbear (defvar x) (let ((x 0)) (declare (special x)) ;; Still ignored, but ABL has seen the ;; defvar, so x is recognized as special. (progv '(x) () (setq x 1)) x) This returns 0 in ABL (as it should). I do need to fix things so ABL honors special declarations, but that's a big and complicated job which doesn't factor very well, so don't look for it to get done in the near future. -Peter |
From: Peter G. <pe...@ar...> - 2003-10-31 20:34:15
|
On Thu, 30 Oct 2003 at 17:38:02 -0600, Mike Beedle wrote: > Now I am having some problems with macrolet. So, when I take the more complicated of your code snippets and merge it with clocc/src/port/sys.lisp, and then evaluate the MACROLET (including the two defuns at the bottom), I get: CL-USER(7): ;;; Evaluating region ; Unable to compile function CLASS-SLOT-LIST defined in non-null lexical environment. ; Unable to compile function CLASS-SLOT-INITARGS defined in non-null lexical environment. CLASS-SLOT-INITARGS CL-USER(8): which is fine. The "Unable to compile..." warnings are benign. In this particular case, the warnings are indicative of an underlying compiler bug, since the non-null lexical environment in which the two functions in question are being defined contains nothing but the local macros defined by the MACROLET, and if the compiler were to proceed, those local macros would get expanded away, leaving, in effect, nothing at all in the lexical environment. ABL's compiler isn't smart enough yet to recognize that possibility, so it throws up its hands, prints the warning messages, and leaves the functions uncompiled. But they should still work fine, albeit more slowly, in their uncompiled state. It would be nice to fix that compiler bug, but correctness and completeness are higher priorities at the moment. If the compiler is a bit too conservative and gives up too easily, so be it. Splitting the macros out works too, as you discovered. (Of course, if the problem you're referring to is something other than those two warnings, let me know the details and I'll be happy to look into it). -Peter P.S. ABL's CLOS implementation is currently in the SYSTEM package, but it's likely at some point in the future to get a package of its own, so what is now SYS::CLASS-SLOTS will probably one day be CLOS::CLASS-SLOTS (or maybe even MOP::CLASS-SLOTS), and in addition, things like (getf slot :initargs) are not guaranteed to work forever either; these are, after all, the internal details of an implementation that's only two weeks old. So the ABL-specific code in sys.lisp will very likely need to be revised from time to time as these internal details change. |