From: Alexey D. <ade...@co...> - 2004-03-28 10:55:24
|
Christophe Rhodes <cs...@ca...> writes: > Attached is a patch implementing dynamic-extent &rest lists for x86, > and breaking the build for all other platforms (and also possibly for > x86/threaded, I dunno). It is heavily inspired by the cmucl > implementation, but I'm mindful that there have been problems with > that. DX does not mix well with tail call optimization. E.g. the patch fails on (defun bar (l) (destructuring-bind (a b c d e f &rest g) l (+ a b c d e f (length g)))) (defun foo (&rest l) (declare (dynamic-extent l)) (bar l)) (foo 1 2 3 4 5 6 7) Maybe the version with cleanups would work better. > I suspect that dynamic-extent closures would be the next most demanded > thing, What does current DX-CMUCL do with (defun bar (f x) (declare (function f)) (values (funcall f x) x)) (defun foo (x l) (flet ((fee (z) (if (> z x) z x))) (declare (dynamic-extent #'fee)) (multiple-value-call 'list (values :a :b) (bar #'fee l) (values :c :d)))) (foo 3 1) -- Regards, Alexey Dejneka "Alas, the spheres of truth are less transparent than those of illusion." -- L.E.J. Brouwer |
From: Raymond T. <to...@rt...> - 2004-03-29 15:31:11
|
>>>>> "Alexey" == Alexey Dejneka <ade...@co...> writes: Alexey> Christophe Rhodes <cs...@ca...> writes: >> Attached is a patch implementing dynamic-extent &rest lists for x86, >> and breaking the build for all other platforms (and also possibly for >> x86/threaded, I dunno). It is heavily inspired by the cmucl >> implementation, but I'm mindful that there have been problems with >> that. Alexey> DX does not mix well with tail call optimization. E.g. the patch Alexey> fails on Alexey> (defun bar (l) Alexey> (destructuring-bind (a b c d e f &rest g) l Alexey> (+ a b c d e f (length g)))) Alexey> (defun foo (&rest l) Alexey> (declare (dynamic-extent l)) Alexey> (bar l)) Alexey> (foo 1 2 3 4 5 6 7) This example works on cmucl when dynamic-extent is enabled. Alexey> What does current DX-CMUCL do with Alexey> (defun bar (f x) Alexey> (declare (function f)) Alexey> (values (funcall f x) x)) Alexey> (defun foo (x l) Alexey> (flet ((fee (z) (if (> z x) z x))) Alexey> (declare (dynamic-extent #'fee)) Alexey> (multiple-value-call 'list Alexey> (values :a :b) Alexey> (bar #'fee l) Alexey> (values :c :d)))) Alexey> (foo 3 1) Without dynamic-extent, cmucl gives (:a :b 3 1 :c :d). With dynamic-extent, it gives (:a :b :c :d). Ray -- Ericsson may automatically add a disclaimer. Sorry, it's beyond my control. This communication is confidential and intended solely for the addressee(s). Any unauthorized review, use, disclosure or distribution is prohibited. If you believe this message has been sent to you in error, please notify the sender by replying to this transmission and delete the message without disclosing it. Thank you. E-mail including attachments is susceptible to data corruption, interruption, unauthorized amendment, tampering and viruses, and we only send and receive e-mails on the basis that we are not liable for any such corruption, interception, amendment, tampering or viruses or any consequences thereof. |
From: Alexey D. <ade...@co...> - 2004-03-29 20:49:35
|
Raymond Toy <to...@rt...> writes: > Alexey> (defun bar (f x) > Alexey> (declare (function f)) > Alexey> (values (funcall f x) x)) > Alexey> (defun foo (x l) > Alexey> (flet ((fee (z) (if (> z x) z x))) > Alexey> (declare (dynamic-extent #'fee)) > Alexey> (multiple-value-call 'list > Alexey> (values :a :b) > Alexey> (bar #'fee l) > Alexey> (values :c :d)))) > Alexey> (foo 3 1) > > Without dynamic-extent, cmucl gives (:a :b 3 1 :c :d). With > dynamic-extent, it gives (:a :b :c :d). Thank you. So, stealing code from CMUCL is not enough. We need to somehow make %DYNAMIC-EXTENT-END known to stack analysis, so that it would be similar to %NIP-VALUES. -- Regards, Alexey Dejneka "Alas, the spheres of truth are less transparent than those of illusion." -- L.E.J. Brouwer |
From: Alexey D. <ade...@co...> - 2004-03-29 20:47:17
|
Christophe Rhodes <cs...@ca...> writes: > +(defmacro with-dynamic-extent ((start ctran nctran kind) &body body) Maybe (START NEXT BODY-START KIND)? Or even (START BODY-START NEXT KIND)? Ok, I think this should work. Three weeks before the freeze; it is probably worth to commit the patch now and to start using it in SBCL itself. -- Regards, Alexey Dejneka "Alas, the spheres of truth are less transparent than those of illusion." -- L.E.J. Brouwer |
From: Christophe R. <cs...@ca...> - 2004-03-30 19:28:05
|
Alexey Dejneka <ade...@co...> writes: > Ok, I think this should work. Three weeks before the freeze; it is > probably worth to commit the patch now and to start using it in SBCL > itself. OK, you asked for it :-). Dynamic-extent &rest lists are now in CVS HEAD for the x86; users of other architectures are warmly encouraged to submit patches for the functionality, the sooner the better. Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Christophe R. <cs...@ca...> - 2004-03-29 21:24:04
|
Alexey Dejneka <ade...@co...> writes: > Christophe Rhodes <cs...@ca...> writes: > >> +(defmacro with-dynamic-extent ((start ctran nctran kind) &body body) > > Maybe (START NEXT BODY-START KIND)? Or even (START BODY-START NEXT KIND)? I'll do some tidying tomorrow. > Ok, I think this should work. Three weeks before the freeze; it is > probably worth to commit the patch now and to start using it in SBCL > itself. Right. In the patch as it currently stands, (defun foo (&rest rest) (declare (optimize sb-c::stack-allocate-dynamic-extent) (dynamic-extent rest)) ...) doesn't stack allocate the rest list. One needs to go to (locally (declare (optimize sb-c::stack-allocate-dynamic-extent)) (defun foo (&rest rest) (declare (dynamic-extent rest)) ...)) for stack allocation to happen. This is probably OK for sbcl (we can make ourselves a DEFUN-WITH-DYNAMIC-EXTENT-REST macro) but probably isn't ideal for code in the wild; given that we don't encourage global declamations of unsafe code, with the patch as is there isn't any less unwieldy way of forcing the stack allocation. Ideas welcome. Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Alexey D. <ade...@co...> - 2004-03-30 02:22:07
|
Christophe Rhodes <cs...@ca...> writes: > In the patch as it currently stands, > (defun foo (&rest rest) > (declare (optimize sb-c::stack-allocate-dynamic-extent) > (dynamic-extent rest)) > ...) > doesn't stack allocate the rest list. One needs to go to > (locally > (declare (optimize sb-c::stack-allocate-dynamic-extent)) > (defun foo (&rest rest) > (declare (dynamic-extent rest)) > ...)) > for stack allocation to happen. Just to be sure: it is right, isn't it? (DX is a bound declaration, so it is applied to the binding; OPTIMIZE is free and is applied only to the body; the binding is outside of the inner OPTIMIZE.) -- Regards, Alexey Dejneka "Alas, the spheres of truth are less transparent than those of illusion." -- L.E.J. Brouwer |
From: Christophe R. <cs...@ca...> - 2004-03-30 06:51:42
|
Alexey Dejneka <ade...@co...> writes: > Christophe Rhodes <cs...@ca...> writes: > >> In the patch as it currently stands, >> (defun foo (&rest rest) >> (declare (optimize sb-c::stack-allocate-dynamic-extent) >> (dynamic-extent rest)) >> ...) >> doesn't stack allocate the rest list. One needs to go to >> (locally >> (declare (optimize sb-c::stack-allocate-dynamic-extent)) >> (defun foo (&rest rest) >> (declare (dynamic-extent rest)) >> ...)) >> for stack allocation to happen. > > Just to be sure: it is right, isn't it? (DX is a bound declaration, so > it is applied to the binding; OPTIMIZE is free and is applied only to > the body; the binding is outside of the inner OPTIMIZE.) I think it's right, yes; I just suspect that there will be complaints, as usual... :-) Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |