From: Douglas K. <do...@go...> - 2013-10-30 06:30:35
|
A closure created while in the process of binding sequentially will, when applied, accidentally see the state of the environment after further modifications. I have a fix for this, but it's not a patch; it's a piece in a substantial rewrite of eval. The compiler has the semantics right, for comparison's sake. (defvar *stash*) (defun save-it (f) (setq *stash* f) 'whatever) (let ((z 'zee) (y 'y) (x 92)) (let* ((baz (save-it (lambda (what) (print (list what x y z))))) (mum (funcall *stash* :after-binding-baz)) (y 'new-y) (z (progn (funcall *stash* :after-binding-y) 'new-z)) (x (progn (funcall *stash* :after-binding-z) 'new-x))) (funcall *stash* :in-body) (values))) prints (:AFTER-BINDING-BAZ 92 Y ZEE) (:AFTER-BINDING-Y 92 NEW-Y ZEE) (:AFTER-BINDING-Z 92 NEW-Y NEW-Z) (:IN-BODY NEW-X NEW-Y NEW-Z) |
From: Christophe R. <cs...@ca...> - 2013-10-30 20:24:40
Attachments:
eval-letstar.diff
|
Douglas Katzman <do...@go...> writes: > I have a fix for this, but it's not a patch; it's a piece in a substantial > rewrite of eval. Here's a simple-ish fix. I haven't really tested it to destruction, but it gets your test case right. |
From: Douglas K. <do...@go...> - 2013-11-09 00:30:06
|
Fix is not 100% right. After your checkin of Nov 3 a binding can still see itself when it is only about to exist but should not yet. First I'll give you an example emulating PCL method creation, followed by a small example of method creation - a method's use-written code accidentally sees its FMF. * (setq sb-ext:*evaluator-mode* :interpret) :INTERPRET * (let* ((foo (lambda () (format t "In foo: ~S~%" foo) 'hi))) (format t "FOO=~S and (FOO)=~S~%" foo (funcall foo))) prints: In foo: #<INTERPRETED-FUNCTION NIL {10032BE42B}> FOO=#<INTERPRETED-FUNCTION NIL {10032BE42B}> and (FOO)=HI * (defmethod foo ((self t)) (print sb-pcl::fmf) 'how-about-them-apples) STYLE-WARNING: Implicitly creating new generic function COMMON-LISP-USER::FOO. #<STANDARD-METHOD FOO (T) {10032BB5A3}> * (foo 9) #<INTERPRETED-FUNCTION (FAST-METHOD FOO (T))> HOW-ABOUT-THEM-APPLES Here's a simple-ish fix. I haven't really tested it to destruction, but > it gets your test case right. > > |
From: Christophe R. <cs...@ca...> - 2013-11-09 08:40:12
Attachments:
fe.diff
|
Douglas Katzman <do...@go...> writes: > Fix is not 100% right. After your checkin of Nov 3 a binding can still see > itself when it is only about to exist but should not yet. Quite right. Take 2: |