Article View: comp.lang.lisp.mcl
Article #680Re: shiftf
From: Bill St. Clair
Date: Wed, 27 Jan 1993 19:51
Date: Wed, 27 Jan 1993 19:51
55 lines
3298 bytes
3298 bytes
At 11:31 1/27/93 +0017, Kim Barrett wrote: >> MCL's shiftf macro produces unneccesary complicated form in the simple >> cases. The most frequent use of shift, is probably for simple pointer >> switching in list structures: Replacing a value while saving the old >> value. (The two-argument (place, newvalue) special case of shiftf used >> to have its own name, swapf) >> >> Here's what MCL's shiftf produces: >> ? (macroexpand '(shiftf (cddr liste) nil)) >> (LET* ((#:G91 LISTE) >> (#:G89 (MULTIPLE-VALUE-LIST (CDDR #:G91)))) >> (DECLARE (DYNAMIC-EXTENT #:G89)) >> (MULTIPLE-VALUE-BIND (#:G90) NIL >> (PROGN (CCL::SET-CDDR #:G91 #:G90))) >> (VALUES-LIST #:G89)) >> >> Here's a simpler expansion suggestion (Allegro 4.1 produces something >> similar to this): >> (LET* ((#:G91 LISTE) >> (#:G89 (CDDR #:G91)) >> (#:G90 NIL)) >> (CCL::SET-CDDR #:G91 #:G90) >> #:G89) > >You didn't mention which version of MCL you are using. SETF and related macros >had a lot of work done on them not too long ago. In MCL2.0p2 (and probably in >MCL2.0, but p2 is what I've got in front of me right now) the expansion is > >(LET* ((#:G30466 LISTE)) > (MULTIPLE-VALUE-PROG1 (CDDR #:G30466) > (MULTIPLE-VALUE-BIND (#:G30465) > NIL > (PROGN (SET-CDDR #:G30466 #:G30465))))) > >The MULTIPLE-VALUE-BIND with a single variable is trivially transformed into a >LET. If the compiler handling for MULTIPLE-VALUE-PROG! recognizes that CDDR >always returns one value and makes the obvious transformation, then compiling >this expansion should produce the same code as your simpler expansion, without >requiring that the SHIFTF macro (and presumably lots of other similar macros) >itself try to optimize the expansion. The reason for all the >multiple-value-mumbles in the expansion is to support multiple-valued place >forms (see X3J13 issue SETF-MULTIPLE-STORE-VARIABLES). Rather than try to make >the macros optimize this stuff, its much better to make the compiler smart >about some of these special cases where multiple value forms can be transformed >into single value forms. Unfortunately, the compiler doesn't currently seem to >know about CDDR being single valued, so things could be a bit better. But the >"bug" is there, not in SHIFTF. Unpatched MCL 2.0 produces the expansion to which Espen referred. Patch 2 modifies SHIFTF & ROTATEF to produce Kim's better code. Mark announced how to get patch 2 about a month ago. Ask and I'll resend. I have prepared a patch that makes the compiler a little bit smarter about turning MULTIPLE-VALUE-PROG1 into PROG1. In particular, it makes the patch 2 expansion for (shift (cddr liste) nil) compile into the same code as the Allegro 4.1 expansion. Ask for "single-value-prog1-patch".
Technical Details
Message-ID:
<9301271850.AA22730@cambridge.apple.com>Path:
arc1-ca.pugleaf.net!sparky!uunet!crdgw1!rpi!gatech!udel!bogus.sura.net!howland.reston.ans.net!spool.mu.edu!agate!stanford.edu!apple!cambridge.apple.com!bill@cambridge.apple.comShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!crdgw1!rpi!gatech!udel!bogus.sura.net!howland.reston.ans.net!spool.mu.edu!agate!stanford.edu!apple!cambridge.apple.com!bill@cambridge.apple.com From: bill@cambridge.apple.com (Bill St. Clair) Newsgroups: comp.lang.lisp.mcl Subject: Re: shiftf Message-ID: <9301271850.AA22730@cambridge.apple.com> Date: 27 Jan 93 19:51:42 GMT Sender: owner-info-mcl@cambridge.apple.com Lines: 55 Approved: comp.lang.lisp.mcl@Cambridge.Apple.C0M