Re: (MEMBER ...) with literal symbol(s)
Stavros Macrakis <[email protected]> Mon, 5 May 2025 11:11:50 -0400
| Newsgroups | gmane.comp.mathematics.maxima.general,gmane.lisp.gcl.devel |
|---|---|
| Message-ID | <CACLVabUXqfgzi856cbxLjugcaFHpm_tuM+YqZ8iF=MHjaJ-hdA@mail.gmail.com> |
--===============4711146879791035584==
Content-Type: multipart/alternative; boundary="000000000000032d6c063464ecf2"
--000000000000032d6c063464ecf2
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Assuming that clause 2 applies to the loop in *member*
2) GCL will unroll loops over constant (and non-constant) lists up to
*src-loop-unroll-limit*
(default 20)
then this whole discussion is moot, since the vast majority (95%) of
constant lists of symbols are length 6 or less, and those are the
often-used cases.
Re
5) GCL will not attempt to aggregate the types across all elements of a lis=
t,
i.e. this whole list is of type symbol, so pull that out of the loop as
well. This seems ill-advised and unpractical to me at least at the moment.
I'm surprised by this, and don't understand why it would be "ill-advised
and unpractical", but as I say it's moot if (2) is applied.
3) GCL will pull the type-of on unknown x out of the loop and use it as a
key to a switch table inside the loop.
Of course, this is unnecessary if arg 2 is a list of symbols, since
*eq* applies
to all data types. In some styles of code, it might be faster to test *(and
(symbolp x) (or (eq x 'c1) (eq x 'c2) ...))*, but in the case of Maxima
this will almost always slow things down rather than speed them up.
The expression *(member x '(a b c...) :test #'eq)* strikes me as verbose
and pedantic. Code should be easily *readable* by humans, and the extra
clause is clearly semantically unnecessary. *memq* is a bit better, but
shouldn't be necessary (there is nothing wrong with writing functions which
encapsulate some useful piece of Common Lisp functionality). If a
particular compiler chooses not to optimize that idiom, I'd say that's the
compiler's problem. But according to Camm's explanation, GCL *does* optimiz=
e
it. So there's no issue.
-s
On Sat, May 3, 2025 at 6:37=E2=80=AFAM Camm Maguire <[email protected]=
> wrote:
> Greetings!
>
> This is what is happening, with a twist.
>
> Since we don't know that *all* elements of the list will allow eql->eq
> ahead of time (optimization 5), one runtime check on x is done outside
> the loop to see if we can do eql->eq on that basis, e.g. an integer x0
> is computed. The test then becomes (if x0 (eq a b) (eql a b)), and then
> eql goes to eq based on b anyway, so at the C level we have (if x0 (eq a
> b) (eq a b)). All eql code in the example you cite has been eliminated.
> We have no optimization trying to recognize identical branches and
> eliminate the if. So instead of one machine instruction, you have two,
> switch x0, (eq a b).
>
> Take care,
>
> David Scherfgen via Maxima-discuss
> <[email protected]> writes:
>
> > Thanks for the explanation, Camm.
> >
> > Optimizations 2) and 1) should suffice for this very common case in
> Maxima's source to be optimized in GCL (just like SBCL does), optimizatio=
n
> 5) shouldn't be
> > necessary.
> >
> > Let's take the example (member x '(a b c)), i.e. unknown x and a list o=
f
> literal symbols.
> >
> > Via 2), GCL should unroll that into (or (eql x 'a) (eql x 'b) (eql x
> 'c)).
> >
> > Via 1), GCL should replace each of the (eql ...) with (eq ...), as one
> of the arguments is a literal symbol.
> >
> > But that doesn't seem to be what's happening, right?
> >
> > Best regards
> > David Scherfgen
> >
> > Camm Maguire <[email protected]> schrieb am Fr., 2. Mai 2025,
> 22:28:
> >
> > Greetings! Glad you noticed this.
> >
> > This touches on 4 optimizations currently in place in the compiler, an=
d
> > one that is not.
> >
> > 1) GCL will optimize eql to eq when it can infer the types on either a=
rg
> > that would permit this.
> >
> > 2) GCL will unroll loops over constant (and non-constant) lists up to
> > *src-loop-unroll-limit* (default 20)
> >
> > 3) GCL will pull the type-of on unknown x out of the loop and use it a=
s
> > a key to a switch table inside the loop.
> >
> > 4) GCL will replace the loop entirely with its known result when
> > possible.
> >
> > 5) GCL will not attempt to aggregate the types across all elements of =
a
> > list, i.e. this whole list is of type symbol, so pull that out of the
> > loop as well. This seems ill-advised and unpractical to me at least a=
t
> > the moment.
> >
> > You can get more info on what is happening by setting
> > compiler::*annotate* to t before running disassemble. If you only wan=
t
> > the C code and not the disassembly, (setq
> > compiler::*disassemble-objdump* nil).
> >
> > You can also see the lisp source of member:
> >
> > ('si::fle is shorthand for 'function-lambda-expression)
> >
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > (si::fle 'member)
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > (LAMBDA
> > (SYSTEM::ITEM LIST &KEY SYSTEM::KEY SYSTEM::TEST SYSTEM::TEST-NOT)
> > (DECLARE (OPTIMIZE (SAFETY 1))) (CHECK-TYPE LIST PROPER-LIST)
> > (CHECK-TYPE SYSTEM::TEST (OR NULL SYSTEM::FUNCTION-DESIGNATOR))
> > (CHECK-TYPE SYSTEM::TEST-NOT (OR NULL SYSTEM::FUNCTION-DESIGNATOR))
> > (CHECK-TYPE SYSTEM::KEY (OR NULL SYSTEM::FUNCTION-DESIGNATOR))
> > (BLOCK
> > MEMBER
> > (LET*
> > ((#:G568
> > (COERCE (OR SYSTEM::TEST SYSTEM::TEST-NOT #'EQL) 'FUNCTION))
> > (#:G569
> > (IF
> > (EQ #:G568 #'EQ) 0
> > (IF
> > (EQ #:G568 #'EQL) 1
> > (IF
> > (EQ #:G568 #'EQUAL) 2
> > (IF (EQ #:G568 #'EQUALP) 3 (IF (EQ #:G568 #'FUNCALL) 4 5))))))
> > (#:G570 (IF SYSTEM::KEY (COERCE SYSTEM::KEY 'FUNCTION)))
> > (#:G570 (IF (NOT (EQ #:G570 #'IDENTITY)) #:G570)))
> > (AND
> > SYSTEM::TEST SYSTEM::TEST-NOT
> > (ERROR "both test and test not supplied"))
> > (LET*
> > NIL
> > (LABELS
> > ((SYSTEM::KEY
> > (SYSTEM::X) (IF #:G570 (FUNCALL #:G570 SYSTEM::X) SYSTEM::X))
> > (SYSTEM::TEST-NO-KEY
> > (SYSTEM::X SYSTEM::Y)
> > (IF
> > (CASE
> > #:G569 (0 (EQ SYSTEM::X SYSTEM::Y))
> > (1 (EQL SYSTEM::X SYSTEM::Y)) (2 (EQUAL SYSTEM::X SYSTEM::Y))
> > (3 (EQUALP SYSTEM::X SYSTEM::Y))
> > (4 (FUNCALL SYSTEM::X SYSTEM::Y))
> > (OTHERWISE (FUNCALL #:G568 SYSTEM::X SYSTEM::Y)))
> > (NOT SYSTEM::TEST-NOT) SYSTEM::TEST-NOT))
> > (SYSTEM::TEST
> > (SYSTEM::X SYSTEM::Y)
> > (SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))))
> > (DECLARE (IGNORABLE #'SYSTEM::TEST))
> > (IF
> > (CASE
> > #:G569
> > ((1 2 3)
> > (OR
> > (CASE
> > #:G569 (1 (EQL-IS-EQ SYSTEM::ITEM))
> > (2 (EQUAL-IS-EQ SYSTEM::ITEM))
> > (3 (EQUALP-IS-EQ SYSTEM::ITEM))))))
> > (SETQ #:G569 0))
> > (MACROLET
> > ((SYSTEM::COLLECT
> > (SYSTEM::A SYSTEM::B SYSTEM::C)
> > (LIST
> > 'LET (LIST (LIST 'SYSTEM::TMP SYSTEM::A))
> > (LIST
> > 'SETQ SYSTEM::C
> > (LIST
> > 'IF SYSTEM::C
> > (LIST 'CDR (LIST 'RPLACD SYSTEM::C 'SYSTEM::TMP))
> > (LIST 'SETQ SYSTEM::B 'SYSTEM::TMP))))))
> > (IF
> > (NOT
> > (MAPL
> > (LAMBDA
> > (SYSTEM::X)
> > (IF
> > (SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))
> > (RETURN-FROM MEMBER SYSTEM::X)))
> > LIST))
> > NIL)))))))
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> >
> > Some examples:
> >
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > Unknown x & y, (disassemble '(lambda (x y) (member x y))
> > loop not unrolled, type-of x pulled out, eql used unless runtime
> > determination of x allows eq.
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > static object LI1__CMP_ANON___gazonk_2205667_0(register object
> V3,object V4)
> > { VMB1 VMS1 VMV1
> > /*(MEMBER X Y)*/
> > {register fixnum V5;
> > V5=3D 1;
> > /*(EQL-IS-EQ SYSTEM::ITEM)*/
> > switch(/* (APPLIED TP4 SYSTEM::X) */tp4(V3)){
> > case -1:
> > goto T7;
> > T7:;
> > goto T5;
> >
> > case 1:
> > goto T8;
> > T8:;
> > case 2:
> > goto T9;
> > T9:;
> > case 3:
> > goto T10;
> > T10:;
> > case 4:
> > goto T11;
> > T11:;
> > case 5:
> > goto T12;
> > T12:;
> > case 6:
> > goto T13;
> > T13:;
> > goto T3;
> >
> > default:
> > goto T14;
> > T14:;
> > goto T5;
> >
> > goto T3;
> > }
> > goto T3;
> >
> > /* END (EQL-IS-EQ SYSTEM::ITEM)*/
> > goto T5;
> > T5:;
> > V5=3D 0;
> > goto T2;
> >
> > goto T3;
> > T3:;
> > goto T2;
> > T2:;
> > /*(MAPL (LAMBDA (SYSTEM::X) (IF # #)) LIST)*/
> > /*(SYSTEM::LMAPR SYSTEM::FUN LIST)*/
> > /*(SYSTEM::LMAP SYSTEM::F SYSTEM::X)*/
> > {register object V6;
> > V6=3D (V4);
> > goto T24;
> > T24:;
> > if(((V6))=3D=3DCnil){
> > goto T26;
> > }
> > /*((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/
> > switch(V5){
> > case 0:
> > goto T36;
> > T36:;
> > if(!(((V3))=3D=3D(/* (SYSTEM::KEY SYSTEM::Y) */(V6)->c.c_car))=
){
> > goto T33;
> > }
> > goto T34;
> >
> > case 1:
> > goto T37;
> > T37:;
> > if(!(eql((V3),/* (SYSTEM::KEY SYSTEM::Y) */(V6)->c.c_car))){
> > goto T33;
> > }
> > goto T34;
> >
> > goto T33;
> > }
> > goto T33;
> >
> > goto T34;
> > T34:;
> > goto T32;
> >
> > goto T33;
> > T33:;
> > goto T30;
> >
> > /* END (SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))=
*/
> > /* END (SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > goto T32;
> > T32:;
> > {object V8 =3D (V6);
> > VMR1(V8);}
> > goto T30;
> > T30:;
> > /* END ((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > {object V9;
> > V9=3D /* (APPLIED CDR SYSTEM::X) */V6->c.c_cdr;
> > V6=3D (V9);
> > goto T24;
> > }
> > goto T26;
> > T26:;
> > goto T22;
> >
> > goto T22;
> > }
> > /* END (SYSTEM::LMAP SYSTEM::F SYSTEM::X)*/
> > goto T22;
> > T22:;
> > if(((V4))=3D=3DCnil){
> > goto T20;
> > }
> > /* END (SYSTEM::LMAPR SYSTEM::FUN LIST)*/
> > /* END (MAPL (LAMBDA (SYSTEM::X) (IF # #)) LIST)*/
> > goto T17;
> >
> > goto T20;
> > T20:;
> > {object V10 =3D Cnil;
> > VMR1(V10);}
> > goto T17;
> > T17:;
> > {object V11 =3D Cnil;
> > VMR1(V11);}}
> > /* END (MEMBER X Y)*/
> > }
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > symbol x, unknown y, (disassemble '(lambda (x y) (declare (symbol x))
> (member x y)))
> > loop not unrolled, eql->eq, no typing
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > static object LI1__CMP_ANON___gazonk_2205667_0(register object
> V3,object V4)
> > { VMB1 VMS1 VMV1
> > /*(MEMBER X Y)*/
> > /*(MAPL (LAMBDA (SYSTEM::X) (IF # #)) LIST)*/
> > /*(SYSTEM::LMAPR SYSTEM::FUN LIST)*/
> > /*(SYSTEM::LMAP SYSTEM::F SYSTEM::X)*/
> > {register object V5;
> > V5=3D (V4);
> > goto T9;
> > T9:;
> > if(((V5))=3D=3DCnil){
> > goto T11;
> > }
> > /*((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/
> > if(!(((V3))=3D=3D(/* (SYSTEM::KEY SYSTEM::Y) */(V5)->c.c_car))=
){
> > goto T18;
> > }
> > goto T17;
> >
> > goto T18;
> > T18:;
> > goto T15;
> >
> > /* END (SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))=
*/
> > /* END (SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > goto T17;
> > T17:;
> > {object V7 =3D (V5);
> > VMR1(V7);}
> > goto T15;
> > T15:;
> > /* END ((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > {object V8;
> > V8=3D /* (APPLIED CDR SYSTEM::X) */V5->c.c_cdr;
> > V5=3D (V8);
> > goto T9;
> > }
> > goto T11;
> > T11:;
> > goto T7;
> >
> > goto T7;
> > }
> > /* END (SYSTEM::LMAP SYSTEM::F SYSTEM::X)*/
> > goto T7;
> > T7:;
> > if(((V4))=3D=3DCnil){
> > goto T5;
> > }
> > /* END (SYSTEM::LMAPR SYSTEM::FUN LIST)*/
> > /* END (MAPL (LAMBDA (SYSTEM::X) (IF # #)) LIST)*/
> > goto T2;
> >
> > goto T5;
> > T5:;
> > {object V9 =3D Cnil;
> > VMR1(V9);}
> > goto T2;
> > T2:;
> > {object V10 =3D Cnil;
> > VMR1(V10);}
> > /* END (MEMBER X Y)*/
> > }
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > Unknown x, known list, (disassemble '(lambda (x y z w) (member x (lis=
t
> y z w))))
> > loop unrolled, type-of x pulled out
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > static object LI1__CMP_ANON___gazonk_2205667_1(object V5,object
> V6,object V7,object V8)
> > { VMB1 VMS1 VMV1
> > /*(MEMBER X (LIST Y Z ...))*/
> > {object V9;
> > V9=3D list(3,(V6),(V7),(V8));
> > {fixnum V10;
> > V10=3D 1;
> > /*(EQL-IS-EQ SYSTEM::ITEM)*/
> > switch(/* (APPLIED TP4 SYSTEM::X) */tp4(V5)){
> > case -1:
> > goto T8;
> > T8:;
> > goto T6;
> >
> > case 1:
> > goto T9;
> > T9:;
> > case 2:
> > goto T10;
> > T10:;
> > case 3:
> > goto T11;
> > T11:;
> > case 4:
> > goto T12;
> > T12:;
> > case 5:
> > goto T13;
> > T13:;
> > case 6:
> > goto T14;
> > T14:;
> > goto T4;
> >
> > default:
> > goto T15;
> > T15:;
> > goto T6;
> >
> > goto T4;
> > }
> > goto T4;
> >
> > /* END (EQL-IS-EQ SYSTEM::ITEM)*/
> > goto T6;
> > T6:;
> > V10=3D 0;
> > goto T3;
> >
> > goto T4;
> > T4:;
> > goto T3;
> > T3:;
> > /*(MAPL (LAMBDA (SYSTEM::X) (IF # #)) LIST)*/
> > /*(SYSTEM::LMAPR SYSTEM::FUN LIST)*/
> > /*(SYSTEM::LMAP SYSTEM::F SYSTEM::X)*/
> > /*((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/
> > switch(V10){
> > case 0:
> > goto T27;
> > T27:;
> > if(!(((V5))=3D=3D((V6)))){
> > goto T24;
> > }
> > goto T25;
> >
> > case 1:
> > goto T28;
> > T28:;
> > if(!(eql((V5),(V6)))){
> > goto T24;
> > }
> > goto T25;
> >
> > goto T24;
> > }
> > goto T24;
> >
> > goto T25;
> > T25:;
> > goto T23;
> >
> > goto T24;
> > T24:;
> > goto T21;
> >
> > /* END (SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))=
*/
> > /* END (SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > goto T23;
> > T23:;
> > {object V11 =3D (V9);
> > VMR1(V11);}
> > goto T21;
> > T21:;
> > /* END ((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::LMAP SYSTEM::F (CDR SYSTEM::X))*/
> > /*((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/
> > switch(V10){
> > case 0:
> > goto T37;
> > T37:;
> > if(!(((V5))=3D=3D((V7)))){
> > goto T34;
> > }
> > goto T35;
> >
> > case 1:
> > goto T38;
> > T38:;
> > if(!(eql((V5),(V7)))){
> > goto T34;
> > }
> > goto T35;
> >
> > goto T34;
> > }
> > goto T34;
> >
> > goto T35;
> > T35:;
> > goto T33;
> >
> > goto T34;
> > T34:;
> > goto T31;
> >
> > /* END (SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))=
*/
> > /* END (SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > goto T33;
> > T33:;
> > {object V12 =3D /* (CDR SYSTEM::X) */V9->c.c_cdr;
> > VMR1(V12);}
> > goto T31;
> > T31:;
> > /* END ((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::LMAP SYSTEM::F (CDR SYSTEM::X))*/
> > /*((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/
> > switch(V10){
> > case 0:
> > goto T47;
> > T47:;
> > if(!(((V5))=3D=3D((V8)))){
> > goto T44;
> > }
> > goto T45;
> >
> > case 1:
> > goto T48;
> > T48:;
> > if(!(eql((V5),(V8)))){
> > goto T44;
> > }
> > goto T45;
> >
> > goto T44;
> > }
> > goto T44;
> >
> > goto T45;
> > T45:;
> > goto T43;
> >
> > goto T44;
> > T44:;
> > goto T41;
> >
> > /* END (SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))=
*/
> > /* END (SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > goto T43;
> > T43:;
> > {object V13 =3D /* (CDR SYSTEM::X) */V9->c.c_cdr->c.c_cdr;
> > VMR1(V13);}
> > goto T41;
> > T41:;
> > /* END ((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /* END (SYSTEM::LMAP SYSTEM::F (CDR SYSTEM::X))*/
> > /* END (SYSTEM::LMAP SYSTEM::F (CDR SYSTEM::X))*/
> > /* END (SYSTEM::LMAP SYSTEM::F SYSTEM::X)*/
> > /* END (SYSTEM::LMAPR SYSTEM::FUN LIST)*/
> > /* END (MAPL (LAMBDA (SYSTEM::X) (IF # #)) LIST)*/
> > {object V14 =3D Cnil;
> > VMR1(V14);}}}
> > /* END (MEMBER X (LIST Y Z ...))*/
> > }
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > Known result, (disassemble '(lambda (x y z w) (declare (symbol z))
> > (member z (list 3 z w))))
> > loop eliminated
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > static object LI1__CMP_ANON___gazonk_2205667_1(object V5,object
> V6,object V7,object V8)
> > { VMB1 VMS1 VMV1
> > /*(MEMBER Z (LIST 3 Z ...))*/
> > {object V9;
> > V9=3D list(3,make_fixnum(3),(V7),(V8));
> > /*(MAPL (LAMBDA (SYSTEM::X) (IF # #)) LIST)*/
> > /*(SYSTEM::LMAPR SYSTEM::FUN LIST)*/
> > /*(SYSTEM::LMAP SYSTEM::F SYSTEM::X)*/
> > /*(SYSTEM::LMAP SYSTEM::F (CDR SYSTEM::X))*/
> > /*((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > {object V10 =3D /* (CDR SYSTEM::X) */V9->c.c_cdr;
> > VMR1(V10);}
> > /* END ((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /* END (SYSTEM::LMAP SYSTEM::F (CDR SYSTEM::X))*/
> > /* END (SYSTEM::LMAP SYSTEM::F SYSTEM::X)*/
> > /* END (SYSTEM::LMAPR SYSTEM::FUN LIST)*/
> > /* END (MAPL (LAMBDA (SYSTEM::X) (IF # #)) LIST)*/}
> > /* END (MEMBER Z (LIST 3 Z ...))*/
> > }
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > Unknown x, known list of symbols (disassemble '(lambda (x y z w)
> > (declare (symbol y z w )) (member x (list y z w))))
> > loop unrolled, type-of x pulled out, when x is e.g. integer eql still
> > optimized to eq element wise as all list elements are symbol.
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> > static object LI1__CMP_ANON___gazonk_2205667_1(object V5,object
> V6,object V7,object V8)
> > { VMB1 VMS1 VMV1
> > /*(MEMBER X (LIST Y Z ...))*/
> > {object V9;
> > V9=3D list(3,(V6),(V7),(V8));
> > {fixnum V10;
> > V10=3D 1;
> > /*(EQL-IS-EQ SYSTEM::ITEM)*/
> > switch(/* (APPLIED TP4 SYSTEM::X) */tp4(V5)){
> > case -1:
> > goto T8;
> > T8:;
> > goto T6;
> >
> > case 1:
> > goto T9;
> > T9:;
> > case 2:
> > goto T10;
> > T10:;
> > case 3:
> > goto T11;
> > T11:;
> > case 4:
> > goto T12;
> > T12:;
> > case 5:
> > goto T13;
> > T13:;
> > case 6:
> > goto T14;
> > T14:;
> > goto T4;
> >
> > default:
> > goto T15;
> > T15:;
> > goto T6;
> >
> > goto T4;
> > }
> > goto T4;
> >
> > /* END (EQL-IS-EQ SYSTEM::ITEM)*/
> > goto T6;
> > T6:;
> > V10=3D 0;
> > goto T3;
> >
> > goto T4;
> > T4:;
> > goto T3;
> > T3:;
> > /*(MAPL (LAMBDA (SYSTEM::X) (IF # #)) LIST)*/
> > /*(SYSTEM::LMAPR SYSTEM::FUN LIST)*/
> > /*(SYSTEM::LMAP SYSTEM::F SYSTEM::X)*/
> > /*((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/
> > switch(V10){
> > case 0:
> > goto T27;
> > T27:;
> > if(!(((V5))=3D=3D((V6)))){
> > goto T24;
> > }
> > goto T25;
> >
> > case 1:
> > goto T28;
> > T28:;
> > if(!(((V5))=3D=3D((V6)))){
> > goto T24;
> > }
> > goto T25;
> >
> > goto T24;
> > }
> > goto T24;
> >
> > goto T25;
> > T25:;
> > goto T23;
> >
> > goto T24;
> > T24:;
> > goto T21;
> >
> > /* END (SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))=
*/
> > /* END (SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > goto T23;
> > T23:;
> > {object V11 =3D (V9);
> > VMR1(V11);}
> > goto T21;
> > T21:;
> > /* END ((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::LMAP SYSTEM::F (CDR SYSTEM::X))*/
> > /*((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/
> > switch(V10){
> > case 0:
> > goto T37;
> > T37:;
> > if(!(((V5))=3D=3D((V7)))){
> > goto T34;
> > }
> > goto T35;
> >
> > case 1:
> > goto T38;
> > T38:;
> > if(!(((V5))=3D=3D((V7)))){
> > goto T34;
> > }
> > goto T35;
> >
> > goto T34;
> > }
> > goto T34;
> >
> > goto T35;
> > T35:;
> > goto T33;
> >
> > goto T34;
> > T34:;
> > goto T31;
> >
> > /* END (SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))=
*/
> > /* END (SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > goto T33;
> > T33:;
> > {object V12 =3D /* (CDR SYSTEM::X) */V9->c.c_cdr;
> > VMR1(V12);}
> > goto T31;
> > T31:;
> > /* END ((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::LMAP SYSTEM::F (CDR SYSTEM::X))*/
> > /*((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /*(SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/
> > switch(V10){
> > case 0:
> > goto T47;
> > T47:;
> > if(!(((V5))=3D=3D((V8)))){
> > goto T44;
> > }
> > goto T45;
> >
> > case 1:
> > goto T48;
> > T48:;
> > if(!(((V5))=3D=3D((V8)))){
> > goto T44;
> > }
> > goto T45;
> >
> > goto T44;
> > }
> > goto T44;
> >
> > goto T45;
> > T45:;
> > goto T43;
> >
> > goto T44;
> > T44:;
> > goto T41;
> >
> > /* END (SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))=
*/
> > /* END (SYSTEM::TEST SYSTEM::ITEM (CAR SYSTEM::X))*/
> > goto T43;
> > T43:;
> > {object V13 =3D /* (CDR SYSTEM::X) */V9->c.c_cdr->c.c_cdr;
> > VMR1(V13);}
> > goto T41;
> > T41:;
> > /* END ((LAMBDA (SYSTEM::X) (DECLARE #) ...) SYSTEM::X)*/
> > /* END (SYSTEM::LMAP SYSTEM::F (CDR SYSTEM::X))*/
> > /* END (SYSTEM::LMAP SYSTEM::F (CDR SYSTEM::X))*/
> > /* END (SYSTEM::LMAP SYSTEM::F SYSTEM::X)*/
> > /* END (SYSTEM::LMAPR SYSTEM::FUN LIST)*/
> > /* END (MAPL (LAMBDA (SYSTEM::X) (IF # #)) LIST)*/
> > {object V14 =3D Cnil;
> > VMR1(V14);}}}
> > /* END (MEMBER X (LIST Y Z ...))*/
> > }
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
> >
> > Take care,
> >
> > David Scherfgen via Maxima-discuss
> > <[email protected]> writes:
> >
> > > Hello,
> > >
> > > I noticed that GCL 2.7.1 compiles these functions differently:
> > >
> > > (defun f (x) (member x '(a b c)))
> > > (defun g (x) (member x '(a b c) :test #'eq))
> > >
> > > I suppose that's because F uses the default EQL as the test. I tried
> to understand the C code it generated, but it was incomprehensible to me.
> Anyways, I
> > saw
> > > that the second function, G, had inlined the MEMBER call into (OR (E=
Q
> X 'A) (EQ X 'B) (EQ Y 'C)), which is reasonable. But why does F get compi=
led
> > differently?
> > >
> > > Shouldn't the compiler notice that the second argument to MEMBER is =
a
> literal list of symbols and automatically use EQ instead of the default E=
QL
> test?
> > That
> > > would be an easy and safe optimization.
> > >
> > > The same goes for the case where the first argument to MEMBER is a
> literal symbol.
> > >
> > > Maxima is full of such instances where MEMBER is used as a shorter
> way to write (OR (EQ ...) (EQ ...) ...), and ":test #'eq" has mostly been
> removed because
> > it was
> > > believed that any modern Lisp compiler would apply this optimization
> automatically. At least SBCL does. (CCL doesn't, I have filed a report
> already.)
> > >
> > > Best regards
> > > David Scherfgen
> > >
> > > _______________________________________________
> > > Maxima-discuss mailing list
> > > [email protected]
> > > https://lists.sourceforge.net/lists/listinfo/maxima-discuss
> > >
> >
> > --
> > Camm Maguire
> [email protected]
> >
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > "The earth is but one country, and mankind its citizens." --
> Baha'u'llah
> >
> > _______________________________________________
> > Maxima-discuss mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/maxima-discuss
> >
>
> --
> Camm Maguire [email protected]=
g
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> "The earth is but one country, and mankind its citizens." -- Baha'u'lla=
h
>
>
> _______________________________________________
> Maxima-discuss mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/maxima-discuss
>
--000000000000032d6c063464ecf2
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div><span style=3D"color:rgb(51,0,0);font-family:georgia,=
serif"><span class=3D"gmail_default">Assuming that clause 2 applies to the =
loop in <b>member</b></span></span></div><div><span style=3D"color:rgb(51,0=
,0);font-family:georgia,serif"><span class=3D"gmail_default"><br></span></s=
pan></div><blockquote style=3D"margin:0 0 0 40px;border:none;padding:0px"><=
div><div class=3D"gmail_default" style=3D"font-family:georgia,serif;font-si=
ze:small;color:rgb(51,0,0)"><span style=3D"font-family:Arial,Helvetica,sans=
-serif;color:rgb(34,34,34)">2)=C2=A0</span><span class=3D"gmail-il" style=
=3D"font-family:Arial,Helvetica,sans-serif;color:rgb(34,34,34)">GCL</span><=
span style=3D"font-family:Arial,Helvetica,sans-serif;color:rgb(34,34,34)">=
=C2=A0will unroll loops over constant (and non-constant) lists up to</span>=
<span class=3D"gmail_default">=C2=A0</span><span style=3D"font-family:Arial=
,Helvetica,sans-serif;color:rgb(34,34,34)">*src-loop-unroll-limit* (default=
20)</span></div><div class=3D"gmail_default" style=3D"font-family:georgia,=
serif;font-size:small;color:rgb(51,0,0)"><br></div></div></blockquote><span=
style=3D"color:rgb(51,0,0);font-family:georgia,serif"><span class=3D"gmail=
_default" style=3D"font-family:georgia,serif;font-size:small;color:rgb(51,0=
,0)">then this whole discussion is moot, since the vast majority (95%) of c=
onstant lists of symbols are length 6 or less, and those are the often-used=
cases.</span></span><br><div><div class=3D"gmail_default" style=3D"font-fa=
mily:georgia,serif;font-size:small;color:rgb(51,0,0)"><br></div><div class=
=3D"gmail_default" style=3D"font-family:georgia,serif;font-size:small;color=
:rgb(51,0,0)">Re</div></div><blockquote style=3D"margin:0 0 0 40px;border:n=
one;padding:0px">5)=C2=A0<span class=3D"gmail-il">GCL</span>=C2=A0will not =
attempt to aggregate the types across all elements of a<span class=3D"gmail=
_default" style=3D"font-family:georgia,serif;font-size:small;color:rgb(51,0=
,0)">=C2=A0</span>list, i.e. this whole list is of type symbol, so pull tha=
t out of the<span class=3D"gmail_default" style=3D"font-family:georgia,seri=
f;font-size:small;color:rgb(51,0,0)">=C2=A0</span>loop as well.=C2=A0 This =
seems ill-advised and unpractical to me at least at<span class=3D"gmail_def=
ault" style=3D"font-family:georgia,serif;font-size:small;color:rgb(51,0,0)"=
>=C2=A0</span>the moment.<br></blockquote><div class=3D"gmail_default" styl=
e=3D"font-family:georgia,serif;font-size:small;color:rgb(51,0,0)"><br></div=
><div class=3D"gmail_default" style=3D"font-family:georgia,serif;font-size:=
small;color:rgb(51,0,0)">I'm surprised by this, and don't understan=
d why it would be "ill-advised and=C2=A0unpractical", but as I sa=
y it's moot if (2) is applied.</div><br><blockquote style=3D"margin:0 0=
0 40px;border:none;padding:0px"><div>3)=C2=A0<span class=3D"gmail-il">GCL<=
/span>=C2=A0will pull the type-of on unknown x out of the loop and use it a=
s<span class=3D"gmail_default" style=3D"font-family:georgia,serif;font-size=
:small;color:rgb(51,0,0)">=C2=A0</span>a key to a switch table inside the l=
oop.</div></blockquote><div><font color=3D"#330000" face=3D"georgia, serif"=
><br></font></div><div><font color=3D"#330000" face=3D"georgia, serif">O</f=
ont><span style=3D"color:rgb(51,0,0);font-family:georgia,serif">f course, t=
his is unnecessary=C2=A0<span class=3D"gmail_default" style=3D"font-family:=
georgia,serif;font-size:small;color:rgb(51,0,0)">if arg 2 is a list of symb=
ols, since <b>eq</b>=C2=A0applies to all data types. In some styles of code=
, it might be faster to test <b>(and (symbolp x) (or (eq x 'c1) (eq x &=
#39;c2) ...))</b>, but in the case of Maxima this will almost always slow t=
hings down rather than speed them up.</span></span></div><div><span style=
=3D"color:rgb(51,0,0);font-family:georgia,serif"><span class=3D"gmail_defau=
lt" style=3D"font-family:georgia,serif;font-size:small;color:rgb(51,0,0)"><=
br></span></span></div><div><span class=3D"gmail_default" style=3D"font-fam=
ily:georgia,serif;font-size:small;color:rgb(51,0,0)">The expression=C2=A0<b=
>(member x '(a b c...) :test #'eq)</b>=C2=A0strikes me as verbose a=
nd pedantic. Code should be easily <i>readable</i>=C2=A0by humans, and the =
extra clause is clearly semantically unnecessary. <b>memq</b>=C2=A0is a bit=
better, but shouldn't be necessary (there is nothing wrong with writin=
g functions which encapsulate some useful piece of Common Lisp functionalit=
y).=C2=A0</span><span style=3D"color:rgb(51,0,0);font-family:georgia,serif"=
>If a particular compiler chooses not to optimize that idiom, I'd say t=
hat's the compiler's problem. But according to Camm's explanati=
on, GCL </span><i style=3D"color:rgb(51,0,0);font-family:georgia,serif">doe=
s</i><span style=3D"color:rgb(51,0,0);font-family:georgia,serif">=C2=A0opti=
mize it. So there's no issue.</span></div><div><span class=3D"gmail_def=
ault" style=3D"font-family:georgia,serif;font-size:small;color:rgb(51,0,0)"=
><br></span></div><div><span class=3D"gmail_default" style=3D"font-family:g=
eorgia,serif;font-size:small;color:rgb(51,0,0)">=C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0 =C2=A0 =C2=A0-s</span></div></div><br><div class=3D"gmail_quote gma=
il_quote_container"><div dir=3D"ltr" class=3D"gmail_attr">On Sat, May 3, 20=
25 at 6:37=E2=80=AFAM Camm Maguire <<a href=3D"mailto:camm@maguirefamily=
.org">[email protected]</a>> wrote:<br></div><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204=
,204,204);padding-left:1ex">Greetings!<br>
<br>
This is what is happening, with a twist.<br>
<br>
Since we don't know that *all* elements of the list will allow eql->=
eq<br>
ahead of time (optimization 5), one runtime check on x is done outside<br>
the loop to see if we can do eql->eq on that basis, e.g. an integer x0<b=
r>
is computed.=C2=A0 The test then becomes (if x0 (eq a b) (eql a b)), and th=
en<br>
eql goes to eq based on b anyway, so at the C level we have (if x0 (eq a<br=
>
b) (eq a b)).=C2=A0 All eql code in the example you cite has been eliminate=
d.<br>
We have no optimization trying to recognize identical branches and<br>
eliminate the if.=C2=A0 So instead of one machine instruction, you have two=
,<br>
switch x0, (eq a b).<br>
<br>
Take care,<br>
<br>
David Scherfgen via Maxima-discuss<br>
<<a href=3D"mailto:[email protected]" target=3D"_blan=
k">[email protected]</a>> writes:<br>
<br>
> Thanks for the explanation, Camm.<br>
><br>
> Optimizations 2) and 1) should suffice for this very common case in Ma=
xima's source to be optimized in GCL (just like SBCL does), optimizatio=
n 5) shouldn't be<br>
> necessary.<br>
><br>
> Let's take the example (member x '(a b c)), i.e. unknown x and=
a list of literal symbols.<br>
><br>
> Via 2), GCL should unroll that into (or (eql x 'a) (eql x 'b) =
(eql x 'c)).<br>
><br>
> Via 1), GCL should replace each of the (eql ...) with (eq ...), as one=
of the arguments is a literal symbol.<br>
><br>
> But that doesn't seem to be what's happening, right?<br>
><br>
> Best regards<br>
> David Scherfgen<br>
><br>
> Camm Maguire <<a href=3D"mailto:[email protected]" target=3D"_=
blank">[email protected]</a>> schrieb am Fr., 2. Mai 2025, 22:28:<b=
r>
><br>
>=C2=A0 Greetings!=C2=A0 Glad you noticed this.<br>
><br>
>=C2=A0 This touches on 4 optimizations currently in place in the compil=
er, and<br>
>=C2=A0 one that is not.<br>
><br>
>=C2=A0 1) GCL will optimize eql to eq when it can infer the types on ei=
ther arg<br>
>=C2=A0 that would permit this.<br>
><br>
>=C2=A0 2) GCL will unroll loops over constant (and non-constant) lists =
up to<br>
>=C2=A0 *src-loop-unroll-limit* (default 20)<br>
><br>
>=C2=A0 3) GCL will pull the type-of on unknown x out of the loop and us=
e it as<br>
>=C2=A0 a key to a switch table inside the loop.<br>
><br>
>=C2=A0 4) GCL will replace the loop entirely with its known result when=
<br>
>=C2=A0 possible. <br>
><br>
>=C2=A0 5) GCL will not attempt to aggregate the types across all elemen=
ts of a<br>
>=C2=A0 list, i.e. this whole list is of type symbol, so pull that out o=
f the<br>
>=C2=A0 loop as well.=C2=A0 This seems ill-advised and unpractical to me=
at least at<br>
>=C2=A0 the moment.<br>
><br>
>=C2=A0 You can get more info on what is happening by setting<br>
>=C2=A0 compiler::*annotate* to t before running disassemble.=C2=A0 If y=
ou only want<br>
>=C2=A0 the C code and not the disassembly, (setq<br>
>=C2=A0 compiler::*disassemble-objdump* nil).<br>
><br>
>=C2=A0 You can also see the lisp source of member:<br>
><br>
>=C2=A0 ('si::fle is shorthand for 'function-lambda-expression)<=
br>
><br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 (si::fle 'member)<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 (LAMBDA<br>
>=C2=A0 =C2=A0(SYSTEM::ITEM LIST &KEY SYSTEM::KEY SYSTEM::TEST SYSTE=
M::TEST-NOT)<br>
>=C2=A0 =C2=A0(DECLARE (OPTIMIZE (SAFETY 1))) (CHECK-TYPE LIST PROPER-LI=
ST)<br>
>=C2=A0 =C2=A0(CHECK-TYPE SYSTEM::TEST (OR NULL SYSTEM::FUNCTION-DESIGNA=
TOR))<br>
>=C2=A0 =C2=A0(CHECK-TYPE SYSTEM::TEST-NOT (OR NULL SYSTEM::FUNCTION-DES=
IGNATOR))<br>
>=C2=A0 =C2=A0(CHECK-TYPE SYSTEM::KEY (OR NULL SYSTEM::FUNCTION-DESIGNAT=
OR))<br>
>=C2=A0 =C2=A0(BLOCK<br>
>=C2=A0 =C2=A0 MEMBER<br>
>=C2=A0 =C2=A0 (LET*<br>
>=C2=A0 =C2=A0 =C2=A0((#:G568<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0(COERCE (OR SYSTEM::TEST SYSTEM::TEST-NOT #&=
#39;EQL) 'FUNCTION))<br>
>=C2=A0 =C2=A0 =C2=A0 (#:G569<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0(IF<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (EQ #:G568 #'EQ) 0<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (IF<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(EQ #:G568 #'EQL) 1<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(IF<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (EQ #:G568 #'EQUAL) 2<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (IF (EQ #:G568 #'EQUALP) 3 (IF (=
EQ #:G568 #'FUNCALL) 4 5))))))<br>
>=C2=A0 =C2=A0 =C2=A0 (#:G570 (IF SYSTEM::KEY (COERCE SYSTEM::KEY 'F=
UNCTION)))<br>
>=C2=A0 =C2=A0 =C2=A0 (#:G570 (IF (NOT (EQ #:G570 #'IDENTITY)) #:G57=
0)))<br>
>=C2=A0 =C2=A0 =C2=A0(AND<br>
>=C2=A0 =C2=A0 =C2=A0 SYSTEM::TEST SYSTEM::TEST-NOT<br>
>=C2=A0 =C2=A0 =C2=A0 (ERROR "both test and test not supplied"=
))<br>
>=C2=A0 =C2=A0 =C2=A0(LET*<br>
>=C2=A0 =C2=A0 =C2=A0 NIL<br>
>=C2=A0 =C2=A0 =C2=A0 (LABELS<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0((SYSTEM::KEY<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(SYSTEM::X) (IF #:G570 (FUNCALL #:G57=
0 SYSTEM::X) SYSTEM::X))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (SYSTEM::TEST-NO-KEY<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(SYSTEM::X SYSTEM::Y)<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(IF<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (CASE<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0#:G569 (0 (EQ SYSTEM::X SYSTEM=
::Y))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(1 (EQL SYSTEM::X SYSTEM::Y)) =
(2 (EQUAL SYSTEM::X SYSTEM::Y))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(3 (EQUALP SYSTEM::X SYSTEM::Y=
))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(4 (FUNCALL SYSTEM::X SYSTEM::=
Y))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(OTHERWISE (FUNCALL #:G568 SYS=
TEM::X SYSTEM::Y)))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (NOT SYSTEM::TEST-NOT) SYSTEM::TEST-=
NOT))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (SYSTEM::TEST<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(SYSTEM::X SYSTEM::Y)<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(SYSTEM::TEST-NO-KEY SYSTEM::X (SYSTE=
M::KEY SYSTEM::Y))))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0(DECLARE (IGNORABLE #'SYSTEM::TEST))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0(IF<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (CASE<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0#:G569<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0((1 2 3)<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (OR<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(CASE<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 #:G569 (1 (EQL-IS-EQ SYSTEM::=
ITEM))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (2 (EQUAL-IS-EQ SYSTEM::ITEM)=
)<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (3 (EQUALP-IS-EQ SYSTEM::ITEM=
))))))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (SETQ #:G569 0))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0(MACROLET<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ((SYSTEM::COLLECT<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (SYSTEM::A SYSTEM::B SYSTEM::C)<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (LIST<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'LET (LIST (LIST 'SYST=
EM::TMP SYSTEM::A))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(LIST<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'SETQ SYSTEM::C<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (LIST<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'IF SYSTEM::C<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(LIST 'CDR (LIST &#=
39;RPLACD SYSTEM::C 'SYSTEM::TMP))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(LIST 'SETQ SYSTEM:=
:B 'SYSTEM::TMP))))))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (IF<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(NOT<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (MAPL<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(LAMBDA<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (SYSTEM::X)<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (IF<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(SYSTEM::TEST SYSTEM::I=
TEM (CAR SYSTEM::X))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(RETURN-FROM MEMBER SYS=
TEM::X)))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0NIL)))))))<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
><br>
>=C2=A0 Some examples:<br>
><br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 Unknown x & y, (disassemble '(lambda (x y) (member x y))=
<br>
>=C2=A0 loop not unrolled, type-of x pulled out, eql used unless runtime=
<br>
>=C2=A0 determination of x allows eq.<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 static object LI1__CMP_ANON___gazonk_2205667_0(register object V=
3,object V4)<br>
>=C2=A0 {=C2=A0 =C2=A0 =C2=A0 =C2=A0 VMB1 VMS1 VMV1<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MEMBER X Y)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {register fixnum V5;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V5=3D 1;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(EQL-IS-EQ SYSTEM::ITEM)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(/* (APPLIED TP4 SYSTEM::X) */=
tp4(V3)){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case -1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T7;<br>
>=C2=A0 T7:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T5;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T8;<br>
>=C2=A0 T8:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 2:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T9;<br>
>=C2=A0 T9:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 3:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T10;<br>
>=C2=A0 T10:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 4:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T11;<br>
>=C2=A0 T11:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 5:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T12;<br>
>=C2=A0 T12:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 6:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T13;<br>
>=C2=A0 T13:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 default:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T14;<br>
>=C2=A0 T14:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T5;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (EQL-IS-EQ SYSTEM::ITEM)*/<br=
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T5;<br>
>=C2=A0 T5:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V5=3D 0;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T2;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br>
>=C2=A0 T3:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T2;<br>
>=C2=A0 T2:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MAPL (LAMBDA (SYSTEM::X) (IF # #)=
) LIST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAPR SYSTEM::FUN LIST)*/=
<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F SYSTEM::X)=
*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {register object V6;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V6=3D (V4);<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
>=C2=A0 T24:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(((V6))=3D=3DCnil){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T26;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (DECLARE #) .=
..) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST SYSTEM::ITEM (CAR SY=
STEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SY=
STEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V5){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T36;<br>
>=C2=A0 T36:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V3))=3D=3D(/* (SYSTEM::KEY SY=
STEM::Y) */(V6)->c.c_car))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T37;<br>
>=C2=A0 T37:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(eql((V3),/* (SYSTEM::KEY SYSTEM=
::Y) */(V6)->c.c_car))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
>=C2=A0 T34:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T32;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br>
>=C2=A0 T33:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T30;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-KEY SYSTEM::=
X (SYSTEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYSTEM::ITEM (C=
AR SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T32;<br>
>=C2=A0 T32:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V8 =3D (V6);<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V8);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T30;<br>
>=C2=A0 T30:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END ((LAMBDA (SYSTEM::X) (DECLARE=
#) ...) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V9;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V9=3D /* (APPLIED CDR SYSTEM::X) */V=
6->c.c_cdr;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V6=3D (V9);<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T26;<br>
>=C2=A0 T26:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T22;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T22;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYSTEM::F SYSTE=
M::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T22;<br>
>=C2=A0 T22:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(((V4))=3D=3DCnil){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T20;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAPR SYSTEM::FUN LI=
ST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MAPL (LAMBDA (SYSTEM::X) (IF=
# #)) LIST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T17;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T20;<br>
>=C2=A0 T20:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V10 =3D Cnil;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V10);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T17;<br>
>=C2=A0 T17:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V11 =3D Cnil;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V11);}}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MEMBER X Y)*/<br>
>=C2=A0 }<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 symbol x, unknown y, (disassemble '(lambda (x y) (declare (s=
ymbol x)) (member x y)))<br>
>=C2=A0 loop not unrolled, eql->eq, no typing<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 static object LI1__CMP_ANON___gazonk_2205667_0(register object V=
3,object V4)<br>
>=C2=A0 {=C2=A0 =C2=A0 =C2=A0 =C2=A0 VMB1 VMS1 VMV1<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MEMBER X Y)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MAPL (LAMBDA (SYSTEM::X) (IF # #)=
) LIST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAPR SYSTEM::FUN LIST)*/=
<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F SYSTEM::X)=
*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {register object V5;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V5=3D (V4);<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T9;<br>
>=C2=A0 T9:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(((V5))=3D=3DCnil){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T11;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (DECLARE #) .=
..) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST SYSTEM::ITEM (CAR SY=
STEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SY=
STEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V3))=3D=3D(/* (SYSTEM::KEY SY=
STEM::Y) */(V5)->c.c_car))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T18;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T17;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T18;<br>
>=C2=A0 T18:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T15;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-KEY SYSTEM::=
X (SYSTEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYSTEM::ITEM (C=
AR SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T17;<br>
>=C2=A0 T17:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V7 =3D (V5);<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V7);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T15;<br>
>=C2=A0 T15:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END ((LAMBDA (SYSTEM::X) (DECLARE=
#) ...) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V8;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V8=3D /* (APPLIED CDR SYSTEM::X) */V=
5->c.c_cdr;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V5=3D (V8);<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T9;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T11;<br>
>=C2=A0 T11:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T7;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T7;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYSTEM::F SYSTE=
M::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T7;<br>
>=C2=A0 T7:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(((V4))=3D=3DCnil){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T5;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAPR SYSTEM::FUN LI=
ST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MAPL (LAMBDA (SYSTEM::X) (IF=
# #)) LIST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T2;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T5;<br>
>=C2=A0 T5:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V9 =3D Cnil;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V9);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T2;<br>
>=C2=A0 T2:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V10 =3D Cnil;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V10);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MEMBER X Y)*/<br>
>=C2=A0 }<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 Unknown x, known list, (disassemble '(lambda (x y z w)=C2=A0=
(member x (list y z w))))<br>
>=C2=A0 loop unrolled, type-of x pulled out<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 static object LI1__CMP_ANON___gazonk_2205667_1(object V5,object =
V6,object V7,object V8)<br>
>=C2=A0 {=C2=A0 =C2=A0 =C2=A0 =C2=A0 VMB1 VMS1 VMV1<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MEMBER X (LIST Y Z ...))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V9;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V9=3D list(3,(V6),(V7),(V8));<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {fixnum V10;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V10=3D 1;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(EQL-IS-EQ SYSTEM::ITEM)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(/* (APPLIED TP4 SYSTEM::X) */=
tp4(V5)){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case -1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T8;<br>
>=C2=A0 T8:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T6;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T9;<br>
>=C2=A0 T9:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 2:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T10;<br>
>=C2=A0 T10:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 3:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T11;<br>
>=C2=A0 T11:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 4:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T12;<br>
>=C2=A0 T12:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 5:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T13;<br>
>=C2=A0 T13:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 6:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T14;<br>
>=C2=A0 T14:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 default:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T15;<br>
>=C2=A0 T15:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T6;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (EQL-IS-EQ SYSTEM::ITEM)*/<br=
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T6;<br>
>=C2=A0 T6:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V10=3D 0;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br>
>=C2=A0 T4:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br>
>=C2=A0 T3:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MAPL (LAMBDA (SYSTEM::X) (IF # #)=
) LIST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAPR SYSTEM::FUN LIST)*/=
<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F SYSTEM::X)=
*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (DECLARE #) .=
..) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST SYSTEM::ITEM (CAR SY=
STEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SY=
STEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T27;<br>
>=C2=A0 T27:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V5))=3D=3D((V6)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T28;<br>
>=C2=A0 T28:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(eql((V5),(V6)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br>
>=C2=A0 T25:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T23;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
>=C2=A0 T24:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T21;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-KEY SYSTEM::=
X (SYSTEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYSTEM::ITEM (C=
AR SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T23;<br>
>=C2=A0 T23:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V11 =3D (V9);<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V11);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T21;<br>
>=C2=A0 T21:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END ((LAMBDA (SYSTEM::X) (DECLARE=
#) ...) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F (CDR SYSTE=
M::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (DECLARE #) .=
..) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST SYSTEM::ITEM (CAR SY=
STEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SY=
STEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T37;<br>
>=C2=A0 T37:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V5))=3D=3D((V7)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T38;<br>
>=C2=A0 T38:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(eql((V5),(V7)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br>
>=C2=A0 T35:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
>=C2=A0 T34:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T31;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-KEY SYSTEM::=
X (SYSTEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYSTEM::ITEM (C=
AR SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br>
>=C2=A0 T33:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V12 =3D /* (CDR SYSTEM::X) *=
/V9->c.c_cdr;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V12);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T31;<br>
>=C2=A0 T31:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END ((LAMBDA (SYSTEM::X) (DECLARE=
#) ...) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F (CDR SYSTE=
M::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (DECLARE #) .=
..) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST SYSTEM::ITEM (CAR SY=
STEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SY=
STEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T47;<br>
>=C2=A0 T47:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V5))=3D=3D((V8)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T48;<br>
>=C2=A0 T48:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(eql((V5),(V8)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br>
>=C2=A0 T45:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T43;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br>
>=C2=A0 T44:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T41;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-KEY SYSTEM::=
X (SYSTEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYSTEM::ITEM (C=
AR SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T43;<br>
>=C2=A0 T43:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V13 =3D /* (CDR SYSTEM::X) *=
/V9->c.c_cdr->c.c_cdr;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V13);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T41;<br>
>=C2=A0 T41:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END ((LAMBDA (SYSTEM::X) (DECLARE=
#) ...) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYSTEM::F (CDR =
SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYSTEM::F (CDR =
SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYSTEM::F SYSTE=
M::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAPR SYSTEM::FUN LI=
ST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MAPL (LAMBDA (SYSTEM::X) (IF=
# #)) LIST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V14 =3D Cnil;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V14);}}}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MEMBER X (LIST Y Z ...))*/<b=
r>
>=C2=A0 }<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 Known result, (disassemble '(lambda (x y z w)=C2=A0 (declare=
(symbol z))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (member z (list 3 z w))))<br>
>=C2=A0 loop eliminated<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 static object LI1__CMP_ANON___gazonk_2205667_1(object V5,object =
V6,object V7,object V8)<br>
>=C2=A0 {=C2=A0 =C2=A0 =C2=A0 =C2=A0 VMB1 VMS1 VMV1<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MEMBER Z (LIST 3 Z ...))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V9;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V9=3D list(3,make_fixnum(3),(V7),(V8=
));<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MAPL (LAMBDA (SYSTEM::X) (IF # #)=
) LIST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAPR SYSTEM::FUN LIST)*/=
<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F SYSTEM::X)=
*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F (CDR SYSTE=
M::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (DECLARE #) .=
..) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V10 =3D /* (CDR SYSTEM::X) *=
/V9->c.c_cdr;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V10);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END ((LAMBDA (SYSTEM::X) (DECLARE=
#) ...) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYSTEM::F (CDR =
SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYSTEM::F SYSTE=
M::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAPR SYSTEM::FUN LI=
ST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MAPL (LAMBDA (SYSTEM::X) (IF=
# #)) LIST)*/}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MEMBER Z (LIST 3 Z ...))*/<b=
r>
>=C2=A0 }<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 Unknown x, known list of symbols (disassemble '(lambda (x y =
z w)<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (declare (symbol y z w )) (member x =
(list y z w))))<br>
>=C2=A0 loop unrolled, type-of x pulled out, when x is e.g. integer eql =
still<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 optimized to eq element wise as all =
list elements are symbol.<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
>=C2=A0 static object LI1__CMP_ANON___gazonk_2205667_1(object V5,object =
V6,object V7,object V8)<br>
>=C2=A0 {=C2=A0 =C2=A0 =C2=A0 =C2=A0 VMB1 VMS1 VMV1<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MEMBER X (LIST Y Z ...))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V9;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V9=3D list(3,(V6),(V7),(V8));<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {fixnum V10;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V10=3D 1;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(EQL-IS-EQ SYSTEM::ITEM)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(/* (APPLIED TP4 SYSTEM::X) */=
tp4(V5)){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case -1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T8;<br>
>=C2=A0 T8:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T6;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T9;<br>
>=C2=A0 T9:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 2:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T10;<br>
>=C2=A0 T10:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 3:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T11;<br>
>=C2=A0 T11:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 4:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T12;<br>
>=C2=A0 T12:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 5:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T13;<br>
>=C2=A0 T13:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 6:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T14;<br>
>=C2=A0 T14:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 default:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T15;<br>
>=C2=A0 T15:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T6;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (EQL-IS-EQ SYSTEM::ITEM)*/<br=
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T6;<br>
>=C2=A0 T6:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V10=3D 0;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br>
>=C2=A0 T4:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br>
>=C2=A0 T3:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MAPL (LAMBDA (SYSTEM::X) (IF # #)=
) LIST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAPR SYSTEM::FUN LIST)*/=
<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F SYSTEM::X)=
*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (DECLARE #) .=
..) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST SYSTEM::ITEM (CAR SY=
STEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SY=
STEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T27;<br>
>=C2=A0 T27:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V5))=3D=3D((V6)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T28;<br>
>=C2=A0 T28:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V5))=3D=3D((V6)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br>
>=C2=A0 T25:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T23;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br>
>=C2=A0 T24:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T21;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-KEY SYSTEM::=
X (SYSTEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYSTEM::ITEM (C=
AR SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T23;<br>
>=C2=A0 T23:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V11 =3D (V9);<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V11);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T21;<br>
>=C2=A0 T21:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END ((LAMBDA (SYSTEM::X) (DECLARE=
#) ...) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F (CDR SYSTE=
M::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (DECLARE #) .=
..) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST SYSTEM::ITEM (CAR SY=
STEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SY=
STEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T37;<br>
>=C2=A0 T37:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V5))=3D=3D((V7)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T38;<br>
>=C2=A0 T38:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V5))=3D=3D((V7)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br>
>=C2=A0 T35:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br>
>=C2=A0 T34:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T31;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-KEY SYSTEM::=
X (SYSTEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYSTEM::ITEM (C=
AR SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br>
>=C2=A0 T33:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V12 =3D /* (CDR SYSTEM::X) *=
/V9->c.c_cdr;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V12);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T31;<br>
>=C2=A0 T31:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END ((LAMBDA (SYSTEM::X) (DECLARE=
#) ...) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F (CDR SYSTE=
M::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (DECLARE #) .=
..) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST SYSTEM::ITEM (CAR SY=
STEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::TEST-NO-KEY SYSTEM::X (SY=
STEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T47;<br>
>=C2=A0 T47:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V5))=3D=3D((V8)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T48;<br>
>=C2=A0 T48:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V5))=3D=3D((V8)))){<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br>
>=C2=A0 T45:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T43;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br>
>=C2=A0 T44:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T41;<br>
><br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-KEY SYSTEM::=
X (SYSTEM::KEY SYSTEM::Y))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYSTEM::ITEM (C=
AR SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T43;<br>
>=C2=A0 T43:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V13 =3D /* (CDR SYSTEM::X) *=
/V9->c.c_cdr->c.c_cdr;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V13);}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T41;<br>
>=C2=A0 T41:;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END ((LAMBDA (SYSTEM::X) (DECLARE=
#) ...) SYSTEM::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYSTEM::F (CDR =
SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYSTEM::F (CDR =
SYSTEM::X))*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYSTEM::F SYSTE=
M::X)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAPR SYSTEM::FUN LI=
ST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MAPL (LAMBDA (SYSTEM::X) (IF=
# #)) LIST)*/<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V14 =3D Cnil;<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V14);}}}<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MEMBER X (LIST Y Z ...))*/<b=
r>
>=C2=A0 }<br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D<br>
><br>
>=C2=A0 Take care,<br>
><br>
>=C2=A0 David Scherfgen via Maxima-discuss<br>
>=C2=A0 <<a href=3D"mailto:[email protected]" targ=
et=3D"_blank">[email protected]</a>> writes:<br>
><br>
>=C2=A0 > Hello,<br>
>=C2=A0 ><br>
>=C2=A0 > I noticed that GCL 2.7.1 compiles these functions different=
ly:<br>
>=C2=A0 ><br>
>=C2=A0 > (defun f (x) (member x '(a b c)))<br>
>=C2=A0 > (defun g (x) (member x '(a b c) :test #'eq))<br>
>=C2=A0 ><br>
>=C2=A0 > I suppose that's because F uses the default EQL as the =
test. I tried to understand the C code it generated, but it was incomprehen=
sible to me. Anyways, I<br>
>=C2=A0 saw<br>
>=C2=A0 > that the second function, G, had inlined the MEMBER call in=
to (OR (EQ X 'A) (EQ X 'B) (EQ Y 'C)), which is reasonable. But=
why does F get compiled<br>
>=C2=A0 differently?<br>
>=C2=A0 ><br>
>=C2=A0 > Shouldn't the compiler notice that the second argument =
to MEMBER is a literal list of symbols and automatically use EQ instead of =
the default EQL test?<br>
>=C2=A0 That<br>
>=C2=A0 > would be an easy and safe optimization.<br>
>=C2=A0 ><br>
>=C2=A0 > The same goes for the case where the first argument to MEMB=
ER is a literal symbol.<br>
>=C2=A0 ><br>
>=C2=A0 > Maxima is full of such instances where MEMBER is used as a =
shorter way to write (OR (EQ ...) (EQ ...) ...), and ":test #'eq&q=
uot; has mostly been removed because<br>
>=C2=A0 it was<br>
>=C2=A0 > believed that any modern Lisp compiler would apply this opt=
imization automatically. At least SBCL does. (CCL doesn't, I have filed=
a report already.)<br>
>=C2=A0 ><br>
>=C2=A0 > Best regards<br>
>=C2=A0 > David Scherfgen<br>
>=C2=A0 ><br>
>=C2=A0 > _______________________________________________<br>
>=C2=A0 > Maxima-discuss mailing list<br>
>=C2=A0 > <a href=3D"mailto:[email protected]" tar=
get=3D"_blank">[email protected]</a><br>
>=C2=A0 > <a href=3D"https://lists.sourceforge.net/lists/listinfo/max=
ima-discuss" rel=3D"noreferrer" target=3D"_blank">https://lists.sourceforge=
.net/lists/listinfo/maxima-discuss</a><br>
>=C2=A0 ><br>
><br>
>=C2=A0 -- <br>
>=C2=A0 Camm Maguire=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 <a href=3D"mailto:[email protected]" target=3D"_blank">c=
[email protected]</a><br>
>=C2=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D<br>
>=C2=A0 "The earth is but one country, and mankind its citizens.&qu=
ot;=C2=A0 --=C2=A0 Baha'u'llah<br>
><br>
> _______________________________________________<br>
> Maxima-discuss mailing list<br>
> <a href=3D"mailto:[email protected]" target=3D"_bla=
nk">[email protected]</a><br>
> <a href=3D"https://lists.sourceforge.net/lists/listinfo/maxima-discuss=
" rel=3D"noreferrer" target=3D"_blank">https://lists.sourceforge.net/lists/=
listinfo/maxima-discuss</a><br>
><br>
<br>
-- <br>
Camm Maguire=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 <a href=3D"mailto:[email protected]" target=3D"_blank">camm@maguir=
efamily.org</a><br>
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D<br=
>
"The earth is but one country, and mankind its citizens."=C2=A0 -=
-=C2=A0 Baha'u'llah<br>
<br>
<br>
_______________________________________________<br>
Maxima-discuss mailing list<br>
<a href=3D"mailto:[email protected]" target=3D"_blank">M=
[email protected]</a><br>
<a href=3D"https://lists.sourceforge.net/lists/listinfo/maxima-discuss" rel=
=3D"noreferrer" target=3D"_blank">https://lists.sourceforge.net/lists/listi=
nfo/maxima-discuss</a><br>
</blockquote></div>
--000000000000032d6c063464ecf2--
--===============4711146879791035584==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
--===============4711146879791035584==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
Maxima-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/maxima-discuss
--===============4711146879791035584==--