Re: (MEMBER ...) with literal symbol(s)
David Scherfgen via Maxima-discuss <[email protected]> Mon, 5 May 2025 19:31:46 +0200
| Newsgroups | gmane.comp.mathematics.maxima.general,gmane.lisp.gcl.devel |
|---|---|
| Message-ID | <CAMTHLKgUkzwzWLq_SjsnGhT+UuqvMtGYcngqYQv0PvMRAL=iWQ@mail.gmail.com> |
--===============7952386591091155800== Content-Type: multipart/alternative; boundary="0000000000000719f4063466e2fe" --0000000000000719f4063466e2fe Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On that note, I found something strange. In GCL 2.7.1, (member x '(a b c d e f)) is often much faster than the same with :test #'eq. It depends on whether the element is a member of the list or not, and at which position it is. Maybe something is wrong with my testing? Camm, maybe you know what's happening there? This is what I did: (defun f (x) (member x '(a b c d e f))) (defun g (x) (member x '(a b c d e f) :test #'eq)) (compile 'f) (compile 'g) (defun test-f (x n) (dotimes (i n) (f x))) (defun test-g (x n) (dotimes (i n) (g x))) (compile 'test-f) (compile 'test-g) (time (test-f 'a 10000000000)) -> 13.09 s (time (test-g 'a 10000000000)) -> 15.21 s -> *:test #'eq is slower!* ... timings increase slightly when testing for 'b, 'c, 'd - not surprising, as larger parts of the list have to be searched. But then, when testing for 'e or 'f, things start to turn around: (time (test-f 'e 10000000000)) -> 15.35 s -> *suddenly much slower!* (time (test-g 'e 10000000000)) -> 15.36 s (time (test-f 'f 10000000000)) -> 17.52 s -> *even slower!* (time (test-g 'f 10000000000)) -> 15.4 s -> *now :test #'eq is faster!* Testing for a member not in the list: (time (test-f 'g 10000000000)) -> 13.12 s -> *faster than searching for 'e, even though it has to search the entire list?!* (time (test-g 'g 10000000000)) -> 15.3 s I thought that maybe it is related to member returning a sublist and not just t or nil. So I defined f and g as follows, to not return the sublist returned by member, but only t or nil: (defun f (x) (if (member x '(a b c d e f)) t)) (defun g (x) (if (member x '(a b c d e f) :test #'eq) t)) Then f gets much slower and g gets much faster. This is very confusing. Am Mo., 5. Mai 2025 um 18:59 Uhr schrieb Camm Maguire < [email protected]>: > Greetings, and thanks for your feedback! > > Stavros Macrakis <[email protected]> writes: > > > 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. > > > > Unrolling the loop just allows the compiler to easily see the type of > each element one at a time. But as this is later than the decision to > compute the type integer on x, and as one does not know the unroll will > succeed until it does, it will not help in avoiding the former unless > there is an additional pass, or a backup/retry. Backup/retries can be > exponentially bad in compile time in egregious nested cases. > > > Re > > > > 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 loo= p > 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-advise= d > and unpractical", but as I say it's moot if (2) is applied. > > The cleanest optimizations are lisp code inserts in the function source > which make sense in the generic case, and can be pruned by the compiler > in special cases. Setting separate compiler-macros, inline property > strings, or special compiler handler functions for a given function is > fragile and error prone. We've made a lot of progress cleaning up a lot > of the latter. > > It would be easy to add a check on the list alongside the check on x in > the source to prune this extra branch in the test, but at the cost of an > extra traversal of the list in the generic case, which seems like a > loser. > > > > > 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. > > > > 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 encapsulat= e > 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 optimize it. So there's no issue. > > I agree in preferring the simple expression and relying on the compiler > to do the right thing. I cannot think at the moment of any instance in > GCL's own code which specifies :test #'eq. > > Take care, > > > > > -s > > > > On Sat, May 3, 2025 at 6:37=E2=80=AFAM Camm Maguire <camm@maguirefamily= .org> > 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 th= en > > 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 eliminate= d. > > 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 lis= t > of 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, > and > > > one that is not. > > > > > > 1) GCL will optimize eql to eq when it can infer the types on eithe= r > arg > > > 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 i= t > as > > > 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 t= he > > > loop as well. This seems ill-advised and unpractical to me at leas= t > at > > > the moment. > > > > > > You can get more info on what is happening by setting > > > compiler::*annotate* to t before running disassemble. If you only > want > > > 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_ca= r))){ > > > 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_ca= r))){ > > > 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 > (list 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 sti= ll > > > optimized to eq element wise as all list elements are symbo= l. > > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=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 > (EQ X 'A) (EQ X 'B) (EQ Y 'C)), which is reasonable. But why does F get > compiled > > > 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 EQL 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 shorte= r > 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 file= d > 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] > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=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 > --0000000000000719f4063466e2fe Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><p dir=3D"ltr">On that note, I found something strange. In= GCL 2.7.1, <font face=3D"monospace">(member x '(a b c d e f))</font> i= s often much faster than the same with <font face=3D"monospace">:test #'= ;eq</font>. It depends on whether the element is a member of the list or no= t, and at which position it is.</p><p dir=3D"ltr">Maybe something is wrong = with my testing? Camm, maybe you know what's happening there? This is w= hat I did:</p><p dir=3D"ltr"><font face=3D"monospace">(defun f (x) (member = x '(a b c d e f)))<br>(defun g (x) (member x '(a b c d e f) :test #= 'eq))<br>(compile 'f)<br>(compile 'g)<br><br>(defun test-f (x n= ) (dotimes (i n) (f x)))<br>(defun test-g (x n) (dotimes (i n) (g x)))<br>(= compile 'test-f)<br>(compile 'test-g)<br><br>(time (test-f 'a= =C2=A010000000000)) -> 13.09 s<br>(time (test-g 'a=C2=A010000000000)= ) -> 15.21 s -> <b>:test #'eq is slower!</b></font><br><br>... ti= mings increase slightly when testing for <font face=3D"monospace">'b</f= ont>, <font face=3D"monospace">'c</font>, <font face=3D"monospace">'= ;d</font>=C2=A0- not surprising, as larger parts of the list have to be sea= rched.<br>But then, when testing for <font face=3D"monospace">'e</font>= or <font face=3D"monospace">'f</font>, things start to turn around:</p= ><p dir=3D"ltr"><font face=3D"monospace">(time (test-f 'e 10000000000))= -> 15.35 s -> <b>suddenly much slower!</b><br>(time (test-g 'e 1= 0000000000)) -> 15.36 s<br><br>(time (test-f 'f 10000000000)) -> = 17.52 s -> <b>even slower!</b><br>(time (test-g 'f 10000000000)) -&g= t; 15.4 s -> <b>now :test #'eq is faster!</b></font><br><br>Testing = for a member not in the list:<br><br><font face=3D"monospace">(time (test-f= 'g 10000000000)) -> 13.12 s -> <b>faster than searching for '= ;e, even though it has to search the entire list?!</b><br>(time (test-g = 9;g 10000000000)) -> 15.3 s</font></p><p>I thought that maybe it is rela= ted to <font face=3D"monospace">member</font> returning a sublist and not j= ust <font face=3D"monospace">t</font> or <font face=3D"monospace">nil</font= >.<br>So I defined=C2=A0<font face=3D"monospace">f</font> and <font face=3D= "monospace">g</font> as follows, to not return the sublist returned by <fon= t face=3D"monospace">member</font>, but only <font face=3D"monospace">t</fo= nt> or <font face=3D"monospace">nil</font>:</p><p><font face=3D"monospace">= (defun f (x) (if (member x '(a b c d e f)) t))<br>(defun g (x) (if (mem= ber x '(a b c d e f) :test #'eq) t))</font></p><p>Then <font face= =3D"monospace">f</font> gets much slower and <font face=3D"monospace">g</fo= nt> gets much faster.</p><p>This is very confusing.</p></div><br><div class= =3D"gmail_quote gmail_quote_container"><div dir=3D"ltr" class=3D"gmail_attr= ">Am Mo., 5. Mai 2025 um 18:59=C2=A0Uhr schrieb Camm Maguire <<a href=3D= "mailto:[email protected]">[email protected]</a>>:<br></div><b= lockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-le= ft:1px solid rgb(204,204,204);padding-left:1ex">Greetings, and thanks for y= our feedback!<br> <br> Stavros Macrakis <<a href=3D"mailto:[email protected]" target=3D"_blank= ">[email protected]</a>> writes:<br> <br> > Assuming that clause 2 applies to the loop in member<br> ><br> >=C2=A0 2) GCL will unroll loops over constant (and non-constant) lists = up to *src-loop-unroll-limit* (default 20)<br> ><br> > 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.<br> ><br> <br> Unrolling the loop just allows the compiler to easily see the type of<br> each element one at a time.=C2=A0 But as this is later than the decision to= <br> compute the type integer on x, and as one does not know the unroll will<br> succeed until it does, it will not help in avoiding the former unless<br> there is an additional pass, or a backup/retry.=C2=A0 Backup/retries can be= <br> exponentially bad in compile time in egregious nested cases.<br> <br> > Re<br> ><br> >=C2=A0 5) GCL will not attempt to aggregate the types across all elemen= ts of a list, i.e. this whole list is of type symbol, so pull that out of t= he loop as well.=C2=A0 This<br> >=C2=A0 seems ill-advised and unpractical to me at least at the moment.<= br> ><br> > I'm surprised by this, and don't understand why it would be &q= uot;ill-advised and unpractical", but as I say it's moot if (2) is= applied.<br> <br> The cleanest optimizations are lisp code inserts in the function source<br> which make sense in the generic case, and can be pruned by the compiler<br> in special cases.=C2=A0 Setting separate compiler-macros, inline property<b= r> strings, or special compiler handler functions for a given function is<br> fragile and error prone.=C2=A0 We've made a lot of progress cleaning up= a lot<br> of the latter.<br> <br> It would be easy to add a check on the list alongside the check on x in<br> the source to prune this extra branch in the test, but at the cost of an<br= > extra traversal of the list in the generic case, which seems like a<br> loser.<br> <br> ><br> >=C2=A0 3) GCL will pull the type-of on unknown x out of the loop and us= e it as a key to a switch table inside the loop.<br> ><br> > 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 t= est (and (symbolp x) (or<br> > (eq x 'c1) (eq x 'c2) ...)), but in the case of Maxima this wi= ll almost always slow things down rather than speed them up.<br> ><br> > The expression (member x '(a b c...) :test #'eq) strikes me as= verbose and pedantic. Code should be easily readable by humans, and the ex= tra clause is clearly<br> > semantically unnecessary. memq is a bit better, but shouldn't be n= ecessary (there is nothing wrong with writing functions which encapsulate s= ome useful piece<br> > of Common Lisp functionality). If a particular compiler chooses not to= optimize that idiom, I'd say that's the compiler's problem. Bu= t according to Camm's<br> > explanation, GCL does optimize it. So there's no issue.<br> <br> I agree in preferring the simple expression and relying on the compiler<br> to do the right thing.=C2=A0 I cannot think at the moment of any instance i= n<br> GCL's own code which specifies :test #'eq.<br> <br> Take care,<br> <br> ><br> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -s<br> ><br> > On Sat, May 3, 2025 at 6:37=E2=80=AFAM Camm Maguire <<a href=3D"mai= lto:[email protected]" target=3D"_blank">[email protected]</a>>= ; wrote:<br> ><br> >=C2=A0 Greetings!<br> ><br> >=C2=A0 This is what is happening, with a twist.<br> ><br> >=C2=A0 Since we don't know that *all* elements of the list will all= ow eql->eq<br> >=C2=A0 ahead of time (optimization 5), one runtime check on x is done o= utside<br> >=C2=A0 the loop to see if we can do eql->eq on that basis, e.g. an i= nteger x0<br> >=C2=A0 is computed.=C2=A0 The test then becomes (if x0 (eq a b) (eql a = b)), and then<br> >=C2=A0 eql goes to eq based on b anyway, so at the C level we have (if = x0 (eq a<br> >=C2=A0 b) (eq a b)).=C2=A0 All eql code in the example you cite has bee= n eliminated.<br> >=C2=A0 We have no optimization trying to recognize identical branches a= nd<br> >=C2=A0 eliminate the if.=C2=A0 So instead of one machine instruction, y= ou have two,<br> >=C2=A0 switch x0, (eq a b).<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 > Thanks for the explanation, Camm.<br> >=C2=A0 ><br> >=C2=A0 > Optimizations 2) and 1) should suffice for this very common= case in Maxima's source to be optimized in GCL (just like SBCL does), = optimization 5) shouldn't<br> >=C2=A0 be<br> >=C2=A0 > necessary.<br> >=C2=A0 ><br> >=C2=A0 > Let's take the example (member x '(a b c)), i.e. un= known x and a list of literal symbols.<br> >=C2=A0 ><br> >=C2=A0 > Via 2), GCL should unroll that into (or (eql x 'a) (eql= x 'b) (eql x 'c)).<br> >=C2=A0 ><br> >=C2=A0 > Via 1), GCL should replace each of the (eql ...) with (eq .= ..), as one of the arguments is a literal symbol.<br> >=C2=A0 ><br> >=C2=A0 > But that doesn't seem to be what's happening, right= ?<br> >=C2=A0 ><br> >=C2=A0 > Best regards<br> >=C2=A0 > David Scherfgen<br> >=C2=A0 ><br> >=C2=A0 > Camm Maguire <<a href=3D"mailto:[email protected]" = target=3D"_blank">[email protected]</a>> schrieb am Fr., 2. Mai 202= 5, 22:28:<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 Greetings!=C2=A0 Glad you noticed this.<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 This touches on 4 optimizations currently in place in= the compiler, and<br> >=C2=A0 >=C2=A0 one that is not.<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 1) GCL will optimize eql to eq when it can infer the = types on either arg<br> >=C2=A0 >=C2=A0 that would permit this.<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 2) GCL will unroll loops over constant (and non-const= ant) lists up to<br> >=C2=A0 >=C2=A0 *src-loop-unroll-limit* (default 20)<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 3) GCL will pull the type-of on unknown x out of the = loop and use it as<br> >=C2=A0 >=C2=A0 a key to a switch table inside the loop.<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 4) GCL will replace the loop entirely with its known = result when<br> >=C2=A0 >=C2=A0 possible. <br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 5) GCL will not attempt to aggregate the types across= all elements of a<br> >=C2=A0 >=C2=A0 list, i.e. this whole list is of type symbol, so pull= that out of the<br> >=C2=A0 >=C2=A0 loop as well.=C2=A0 This seems ill-advised and unprac= tical to me at least at<br> >=C2=A0 >=C2=A0 the moment.<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 You can get more info on what is happening by setting= <br> >=C2=A0 >=C2=A0 compiler::*annotate* to t before running disassemble.= =C2=A0 If you only want<br> >=C2=A0 >=C2=A0 the C code and not the disassembly, (setq<br> >=C2=A0 >=C2=A0 compiler::*disassemble-objdump* nil).<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 You can also see the lisp source of member:<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 ('si::fle is shorthand for 'function-lambda-e= xpression)<br> >=C2=A0 ><br> >=C2=A0 >=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 >=C2=A0 (si::fle 'member)<br> >=C2=A0 >=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 >=C2=A0 (LAMBDA<br> >=C2=A0 >=C2=A0 =C2=A0(SYSTEM::ITEM LIST &KEY SYSTEM::KEY SYSTEM:= :TEST SYSTEM::TEST-NOT)<br> >=C2=A0 >=C2=A0 =C2=A0(DECLARE (OPTIMIZE (SAFETY 1))) (CHECK-TYPE LIS= T PROPER-LIST)<br> >=C2=A0 >=C2=A0 =C2=A0(CHECK-TYPE SYSTEM::TEST (OR NULL SYSTEM::FUNCT= ION-DESIGNATOR))<br> >=C2=A0 >=C2=A0 =C2=A0(CHECK-TYPE SYSTEM::TEST-NOT (OR NULL SYSTEM::F= UNCTION-DESIGNATOR))<br> >=C2=A0 >=C2=A0 =C2=A0(CHECK-TYPE SYSTEM::KEY (OR NULL SYSTEM::FUNCTI= ON-DESIGNATOR))<br> >=C2=A0 >=C2=A0 =C2=A0(BLOCK<br> >=C2=A0 >=C2=A0 =C2=A0 MEMBER<br> >=C2=A0 >=C2=A0 =C2=A0 (LET*<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0((#:G568<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0(COERCE (OR SYSTEM::TEST SYSTEM::= TEST-NOT #'EQL) 'FUNCTION))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 (#:G569<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 #'EQ) 0<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 (IF<br> >=C2=A0 >=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 =C2=A0(IF<br> >=C2=A0 >=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 =C2=A0 (IF (EQ #:G568 #'EQUA= LP) 3 (IF (EQ #:G568 #'FUNCALL) 4 5))))))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 (#:G570 (IF SYSTEM::KEY (COERCE SYSTEM:= :KEY 'FUNCTION)))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 (#:G570 (IF (NOT (EQ #:G570 #'IDENT= ITY)) #:G570)))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0(AND<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 SYSTEM::TEST SYSTEM::TEST-NOT<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 (ERROR "both test and test not sup= plied"))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0(LET*<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 NIL<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 (LABELS<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0((SYSTEM::KEY<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(SYSTEM::X) (IF #:G570 (FU= NCALL #:G570 SYSTEM::X) SYSTEM::X))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 (SYSTEM::TEST-NO-KEY<br> >=C2=A0 >=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 =C2=A0(IF<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 =C2=A0#:G569 (0 (EQ SYSTE= M::X SYSTEM::Y))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(1 (EQL SYSTEM::X S= YSTEM::Y)) (2 (EQUAL SYSTEM::X SYSTEM::Y))<br> >=C2=A0 >=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 =C2=A0(4 (FUNCALL SYSTEM:= :X SYSTEM::Y))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(OTHERWISE (FUNCALL= #:G568 SYSTEM::X SYSTEM::Y)))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (NOT SYSTEM::TEST-NOT) SY= STEM::TEST-NOT))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 (SYSTEM::TEST<br> >=C2=A0 >=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 =C2=A0(SYSTEM::TEST-NO-KEY SYSTE= M::X (SYSTEM::KEY SYSTEM::Y))))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0(DECLARE (IGNORABLE #'SYSTEM:= :TEST))<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<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0((1 2 3)<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (OR<br> >=C2=A0 >=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 =C2=A0 #:G569 (1 (EQL-IS-= EQ SYSTEM::ITEM))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (2 (EQUAL-IS-EQ SY= STEM::ITEM))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (3 (EQUALP-IS-EQ S= YSTEM::ITEM))))))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 (SETQ #:G569 0))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0(MACROLET<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 ((SYSTEM::COLLECT<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (SYSTEM::A SYSTEM::B SYST= EM::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'LET (LIST (LIS= T 'SYSTEM::TMP SYSTEM::A))<br> >=C2=A0 >=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 'SETQ SYSTEM::= C<br> >=C2=A0 >=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 =C2=A0'IF SYST= EM::C<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(LIST 'C= DR (LIST 'RPLACD SYSTEM::C 'SYSTEM::TMP))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(LIST 'S= ETQ SYSTEM::B 'SYSTEM::TMP))))))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 (IF<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(NOT<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (MAPL<br> >=C2=A0 >=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 =C2=A0 (SYSTEM::X)<br> >=C2=A0 >=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 =C2=A0(SYSTEM::TES= T SYSTEM::ITEM (CAR SYSTEM::X))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(RETURN-FROM= MEMBER SYSTEM::X)))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST))<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0NIL)))))))<br> >=C2=A0 >=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 ><br> >=C2=A0 >=C2=A0 Some examples:<br> >=C2=A0 ><br> >=C2=A0 >=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 >=C2=A0 Unknown x & y, (disassemble '(lambda (x y) (m= ember x y))<br> >=C2=A0 >=C2=A0 loop not unrolled, type-of x pulled out, eql used unl= ess runtime<br> >=C2=A0 >=C2=A0 determination of x allows eq.<br> >=C2=A0 >=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 >=C2=A0 static object LI1__CMP_ANON___gazonk_2205667_0(regist= er object V3,object V4)<br> >=C2=A0 >=C2=A0 {=C2=A0 =C2=A0 =C2=A0 =C2=A0 VMB1 VMS1 VMV1<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MEMBER X Y)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {register fixnum V5;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V5=3D 1;<br> >=C2=A0 >=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 =C2=A0 switch(/* (APPLIED TP4 SY= STEM::X) */tp4(V3)){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case -1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T7;<br> >=C2=A0 >=C2=A0 T7:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T5;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T8;<br> >=C2=A0 >=C2=A0 T8:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 2:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T9;<br> >=C2=A0 >=C2=A0 T9:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 3:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T10;<br> >=C2=A0 >=C2=A0 T10:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 4:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T11;<br> >=C2=A0 >=C2=A0 T11:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 5:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T12;<br> >=C2=A0 >=C2=A0 T12:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 6:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T13;<br> >=C2=A0 >=C2=A0 T13:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 default:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T14;<br> >=C2=A0 >=C2=A0 T14:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T5;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br> >=C2=A0 ><br> >=C2=A0 >=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 =C2=A0 goto T5;<br> >=C2=A0 >=C2=A0 T5:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V5=3D 0;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T2;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br> >=C2=A0 >=C2=A0 T3:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T2;<br> >=C2=A0 >=C2=A0 T2:;<br> >=C2=A0 >=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 =C2=A0 /*(SYSTEM::LMAPR SYSTEM::= FUN LIST)*/<br> >=C2=A0 >=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 =C2=A0 {register object V6;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V6=3D (V4);<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br> >=C2=A0 >=C2=A0 T24:;<br> >=C2=A0 >=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 =C2=A0 goto T26;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (D= ECLARE #) ...) SYSTEM::X)*/<br> >=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 /*(SYSTEM::TEST-NO-KEY SY= STEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V5){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T36;<br> >=C2=A0 >=C2=A0 T36:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V3))=3D=3D(/* (SYS= TEM::KEY SYSTEM::Y) */(V6)->c.c_car))){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T37;<br> >=C2=A0 >=C2=A0 T37:;<br> >=C2=A0 >=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 =C2=A0 goto T33;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br> >=C2=A0 >=C2=A0 T34:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T32;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br> >=C2=A0 >=C2=A0 T33:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T30;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-K= EY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYST= EM::ITEM (CAR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T32;<br> >=C2=A0 >=C2=A0 T32:;<br> >=C2=A0 >=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 =C2=A0 VMR1(V8);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T30;<br> >=C2=A0 >=C2=A0 T30:;<br> >=C2=A0 >=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 =C2=A0 {object V9;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V9=3D /* (APPLIED CDR SYS= TEM::X) */V6->c.c_cdr;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V6=3D (V9);<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T26;<br> >=C2=A0 >=C2=A0 T26:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T22;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T22;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYST= EM::F SYSTEM::X)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T22;<br> >=C2=A0 >=C2=A0 T22:;<br> >=C2=A0 >=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 =C2=A0 goto T20;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAPR SYS= TEM::FUN LIST)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MAPL (LAMBDA (SYS= TEM::X) (IF # #)) LIST)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T17;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T20;<br> >=C2=A0 >=C2=A0 T20:;<br> >=C2=A0 >=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 =C2=A0 VMR1(V10);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T17;<br> >=C2=A0 >=C2=A0 T17:;<br> >=C2=A0 >=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 =C2=A0 VMR1(V11);}}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MEMBER X Y)*/<br> >=C2=A0 >=C2=A0 }<br> >=C2=A0 >=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 >=C2=A0 symbol x, unknown y, (disassemble '(lambda (x y) = (declare (symbol x)) (member x y)))<br> >=C2=A0 >=C2=A0 loop not unrolled, eql->eq, no typing<br> >=C2=A0 >=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 >=C2=A0 static object LI1__CMP_ANON___gazonk_2205667_0(regist= er object V3,object V4)<br> >=C2=A0 >=C2=A0 {=C2=A0 =C2=A0 =C2=A0 =C2=A0 VMB1 VMS1 VMV1<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(MEMBER X Y)*/<br> >=C2=A0 >=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 =C2=A0 /*(SYSTEM::LMAPR SYSTEM::= FUN LIST)*/<br> >=C2=A0 >=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 =C2=A0 {register object V5;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V5=3D (V4);<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T9;<br> >=C2=A0 >=C2=A0 T9:;<br> >=C2=A0 >=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 =C2=A0 goto T11;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (D= ECLARE #) ...) SYSTEM::X)*/<br> >=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 /*(SYSTEM::TEST-NO-KEY SY= STEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(!(((V3))=3D=3D(/* (SYS= TEM::KEY SYSTEM::Y) */(V5)->c.c_car))){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T18;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T17;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T18;<br> >=C2=A0 >=C2=A0 T18:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T15;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-K= EY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYST= EM::ITEM (CAR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T17;<br> >=C2=A0 >=C2=A0 T17:;<br> >=C2=A0 >=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 =C2=A0 VMR1(V7);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T15;<br> >=C2=A0 >=C2=A0 T15:;<br> >=C2=A0 >=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 =C2=A0 {object V8;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V8=3D /* (APPLIED CDR SYS= TEM::X) */V5->c.c_cdr;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V5=3D (V8);<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T9;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T11;<br> >=C2=A0 >=C2=A0 T11:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T7;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T7;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYST= EM::F SYSTEM::X)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T7;<br> >=C2=A0 >=C2=A0 T7:;<br> >=C2=A0 >=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 =C2=A0 goto T5;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAPR SYS= TEM::FUN LIST)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MAPL (LAMBDA (SYS= TEM::X) (IF # #)) LIST)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T2;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T5;<br> >=C2=A0 >=C2=A0 T5:;<br> >=C2=A0 >=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 =C2=A0 VMR1(V9);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T2;<br> >=C2=A0 >=C2=A0 T2:;<br> >=C2=A0 >=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 =C2=A0 VMR1(V10);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MEMBER X Y)*/<br> >=C2=A0 >=C2=A0 }<br> >=C2=A0 >=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 >=C2=A0 Unknown x, known list, (disassemble '(lambda (x y= z w)=C2=A0 (member x (list y z w))))<br> >=C2=A0 >=C2=A0 loop unrolled, type-of x pulled out<br> >=C2=A0 >=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 >=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 =C2=A0 VMB1 VMS1 VMV1<br> >=C2=A0 >=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 =C2=A0 {object V9;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V9=3D list(3,(V6),(V7),(V= 8));<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {fixnum V10;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V10=3D 1;<br> >=C2=A0 >=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 =C2=A0 switch(/* (APPLIED TP4 SY= STEM::X) */tp4(V5)){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case -1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T8;<br> >=C2=A0 >=C2=A0 T8:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T6;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T9;<br> >=C2=A0 >=C2=A0 T9:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 2:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T10;<br> >=C2=A0 >=C2=A0 T10:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 3:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T11;<br> >=C2=A0 >=C2=A0 T11:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 4:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T12;<br> >=C2=A0 >=C2=A0 T12:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 5:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T13;<br> >=C2=A0 >=C2=A0 T13:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 6:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T14;<br> >=C2=A0 >=C2=A0 T14:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 default:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T15;<br> >=C2=A0 >=C2=A0 T15:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T6;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br> >=C2=A0 ><br> >=C2=A0 >=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 =C2=A0 goto T6;<br> >=C2=A0 >=C2=A0 T6:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V10=3D 0;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br> >=C2=A0 >=C2=A0 T4:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br> >=C2=A0 >=C2=A0 T3:;<br> >=C2=A0 >=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 =C2=A0 /*(SYSTEM::LMAPR SYSTEM::= FUN LIST)*/<br> >=C2=A0 >=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 =C2=A0 /*((LAMBDA (SYSTEM::X) (D= ECLARE #) ...) SYSTEM::X)*/<br> >=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 /*(SYSTEM::TEST-NO-KEY SY= STEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T27;<br> >=C2=A0 >=C2=A0 T27:;<br> >=C2=A0 >=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 =C2=A0 goto T24;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T28;<br> >=C2=A0 >=C2=A0 T28:;<br> >=C2=A0 >=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 =C2=A0 goto T24;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br> >=C2=A0 >=C2=A0 T25:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T23;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br> >=C2=A0 >=C2=A0 T24:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T21;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-K= EY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYST= EM::ITEM (CAR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T23;<br> >=C2=A0 >=C2=A0 T23:;<br> >=C2=A0 >=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 =C2=A0 VMR1(V11);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T21;<br> >=C2=A0 >=C2=A0 T21:;<br> >=C2=A0 >=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 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F= (CDR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (D= ECLARE #) ...) SYSTEM::X)*/<br> >=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 /*(SYSTEM::TEST-NO-KEY SY= STEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T37;<br> >=C2=A0 >=C2=A0 T37:;<br> >=C2=A0 >=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 =C2=A0 goto T34;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T38;<br> >=C2=A0 >=C2=A0 T38:;<br> >=C2=A0 >=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 =C2=A0 goto T34;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br> >=C2=A0 >=C2=A0 T35:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br> >=C2=A0 >=C2=A0 T34:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T31;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-K= EY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYST= EM::ITEM (CAR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br> >=C2=A0 >=C2=A0 T33:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V12 =3D /* (CDR S= YSTEM::X) */V9->c.c_cdr;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V12);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T31;<br> >=C2=A0 >=C2=A0 T31:;<br> >=C2=A0 >=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 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F= (CDR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (D= ECLARE #) ...) SYSTEM::X)*/<br> >=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 /*(SYSTEM::TEST-NO-KEY SY= STEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T47;<br> >=C2=A0 >=C2=A0 T47:;<br> >=C2=A0 >=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 =C2=A0 goto T44;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T48;<br> >=C2=A0 >=C2=A0 T48:;<br> >=C2=A0 >=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 =C2=A0 goto T44;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br> >=C2=A0 >=C2=A0 T45:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T43;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br> >=C2=A0 >=C2=A0 T44:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T41;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-K= EY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYST= EM::ITEM (CAR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T43;<br> >=C2=A0 >=C2=A0 T43:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V13 =3D /* (CDR S= YSTEM::X) */V9->c.c_cdr->c.c_cdr;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V13);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T41;<br> >=C2=A0 >=C2=A0 T41:;<br> >=C2=A0 >=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 =C2=A0 /* END (SYSTEM::LMAP SYST= EM::F (CDR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYST= EM::F (CDR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYST= EM::F SYSTEM::X)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAPR SYS= TEM::FUN LIST)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MAPL (LAMBDA (SYS= TEM::X) (IF # #)) LIST)*/<br> >=C2=A0 >=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 =C2=A0 VMR1(V14);}}}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MEMBER X (LIST Y = Z ...))*/<br> >=C2=A0 >=C2=A0 }<br> >=C2=A0 >=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 >=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 =C2=A0 (member z (list 3 z w))))= <br> >=C2=A0 >=C2=A0 loop eliminated<br> >=C2=A0 >=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 >=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 =C2=A0 VMB1 VMS1 VMV1<br> >=C2=A0 >=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 =C2=A0 {object V9;<br> >=C2=A0 >=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 =C2=A0 /*(MAPL (LAMBDA (SYSTEM::= X) (IF # #)) LIST)*/<br> >=C2=A0 >=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 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F= SYSTEM::X)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F= (CDR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (D= ECLARE #) ...) SYSTEM::X)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V10 =3D /* (CDR S= YSTEM::X) */V9->c.c_cdr;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V10);}<br> >=C2=A0 >=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 =C2=A0 /* END (SYSTEM::LMAP SYST= EM::F (CDR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYST= EM::F SYSTEM::X)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAPR SYS= TEM::FUN LIST)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MAPL (LAMBDA (SYS= TEM::X) (IF # #)) LIST)*/}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MEMBER Z (LIST 3 = Z ...))*/<br> >=C2=A0 >=C2=A0 }<br> >=C2=A0 >=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 >=C2=A0 Unknown x, known list of symbols (disassemble '(l= ambda (x y z w)<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (declare (symbol y z w ))= (member x (list y z w))))<br> >=C2=A0 >=C2=A0 loop unrolled, type-of x pulled out, when x is e.g. i= nteger eql still<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 optimized to eq element w= ise as all list elements are symbol.<br> >=C2=A0 >=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 >=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 =C2=A0 VMB1 VMS1 VMV1<br> >=C2=A0 >=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 =C2=A0 {object V9;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V9=3D list(3,(V6),(V7),(V= 8));<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {fixnum V10;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V10=3D 1;<br> >=C2=A0 >=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 =C2=A0 switch(/* (APPLIED TP4 SY= STEM::X) */tp4(V5)){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case -1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T8;<br> >=C2=A0 >=C2=A0 T8:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T6;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T9;<br> >=C2=A0 >=C2=A0 T9:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 2:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T10;<br> >=C2=A0 >=C2=A0 T10:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 3:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T11;<br> >=C2=A0 >=C2=A0 T11:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 4:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T12;<br> >=C2=A0 >=C2=A0 T12:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 5:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T13;<br> >=C2=A0 >=C2=A0 T13:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 6:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T14;<br> >=C2=A0 >=C2=A0 T14:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 default:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T15;<br> >=C2=A0 >=C2=A0 T15:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T6;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br> >=C2=A0 ><br> >=C2=A0 >=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 =C2=A0 goto T6;<br> >=C2=A0 >=C2=A0 T6:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 V10=3D 0;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T4;<br> >=C2=A0 >=C2=A0 T4:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T3;<br> >=C2=A0 >=C2=A0 T3:;<br> >=C2=A0 >=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 =C2=A0 /*(SYSTEM::LMAPR SYSTEM::= FUN LIST)*/<br> >=C2=A0 >=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 =C2=A0 /*((LAMBDA (SYSTEM::X) (D= ECLARE #) ...) SYSTEM::X)*/<br> >=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 /*(SYSTEM::TEST-NO-KEY SY= STEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T27;<br> >=C2=A0 >=C2=A0 T27:;<br> >=C2=A0 >=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 =C2=A0 goto T24;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T28;<br> >=C2=A0 >=C2=A0 T28:;<br> >=C2=A0 >=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 =C2=A0 goto T24;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T25;<br> >=C2=A0 >=C2=A0 T25:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T23;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T24;<br> >=C2=A0 >=C2=A0 T24:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T21;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-K= EY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYST= EM::ITEM (CAR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T23;<br> >=C2=A0 >=C2=A0 T23:;<br> >=C2=A0 >=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 =C2=A0 VMR1(V11);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T21;<br> >=C2=A0 >=C2=A0 T21:;<br> >=C2=A0 >=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 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F= (CDR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (D= ECLARE #) ...) SYSTEM::X)*/<br> >=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 /*(SYSTEM::TEST-NO-KEY SY= STEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T37;<br> >=C2=A0 >=C2=A0 T37:;<br> >=C2=A0 >=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 =C2=A0 goto T34;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T38;<br> >=C2=A0 >=C2=A0 T38:;<br> >=C2=A0 >=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 =C2=A0 goto T34;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T35;<br> >=C2=A0 >=C2=A0 T35:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T34;<br> >=C2=A0 >=C2=A0 T34:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T31;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-K= EY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYST= EM::ITEM (CAR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T33;<br> >=C2=A0 >=C2=A0 T33:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V12 =3D /* (CDR S= YSTEM::X) */V9->c.c_cdr;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V12);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T31;<br> >=C2=A0 >=C2=A0 T31:;<br> >=C2=A0 >=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 =C2=A0 /*(SYSTEM::LMAP SYSTEM::F= (CDR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*((LAMBDA (SYSTEM::X) (D= ECLARE #) ...) SYSTEM::X)*/<br> >=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 /*(SYSTEM::TEST-NO-KEY SY= STEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(V10){<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 0:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T47;<br> >=C2=A0 >=C2=A0 T47:;<br> >=C2=A0 >=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 =C2=A0 goto T44;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 1:<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T48;<br> >=C2=A0 >=C2=A0 T48:;<br> >=C2=A0 >=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 =C2=A0 goto T44;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T45;<br> >=C2=A0 >=C2=A0 T45:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T43;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T44;<br> >=C2=A0 >=C2=A0 T44:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T41;<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST-NO-K= EY SYSTEM::X (SYSTEM::KEY SYSTEM::Y))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::TEST SYST= EM::ITEM (CAR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T43;<br> >=C2=A0 >=C2=A0 T43:;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {object V13 =3D /* (CDR S= YSTEM::X) */V9->c.c_cdr->c.c_cdr;<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 VMR1(V13);}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto T41;<br> >=C2=A0 >=C2=A0 T41:;<br> >=C2=A0 >=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 =C2=A0 /* END (SYSTEM::LMAP SYST= EM::F (CDR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYST= EM::F (CDR SYSTEM::X))*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAP SYST= EM::F SYSTEM::X)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (SYSTEM::LMAPR SYS= TEM::FUN LIST)*/<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MAPL (LAMBDA (SYS= TEM::X) (IF # #)) LIST)*/<br> >=C2=A0 >=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 =C2=A0 VMR1(V14);}}}<br> >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* END (MEMBER X (LIST Y = Z ...))*/<br> >=C2=A0 >=C2=A0 }<br> >=C2=A0 >=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 ><br> >=C2=A0 >=C2=A0 Take care,<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 David Scherfgen via Maxima-discuss<br> >=C2=A0 >=C2=A0 <<a href=3D"mailto:[email protected]= e.net" target=3D"_blank">[email protected]</a>> write= s:<br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 > Hello,<br> >=C2=A0 >=C2=A0 ><br> >=C2=A0 >=C2=A0 > I noticed that GCL 2.7.1 compiles these function= s differently:<br> >=C2=A0 >=C2=A0 ><br> >=C2=A0 >=C2=A0 > (defun f (x) (member x '(a b c)))<br> >=C2=A0 >=C2=A0 > (defun g (x) (member x '(a b c) :test #'= eq))<br> >=C2=A0 >=C2=A0 ><br> >=C2=A0 >=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 = incomprehensible to me. Anyways,<br> >=C2=A0 I<br> >=C2=A0 >=C2=A0 saw<br> >=C2=A0 >=C2=A0 > that the second function, G, had inlined the MEM= BER call into (OR (EQ X 'A) (EQ X 'B) (EQ Y 'C)), which is reas= onable. But why does F get compiled<br> >=C2=A0 >=C2=A0 differently?<br> >=C2=A0 >=C2=A0 ><br> >=C2=A0 >=C2=A0 > Shouldn't the compiler notice that the secon= d argument to MEMBER is a literal list of symbols and automatically use EQ = instead of the default EQL test?<br> >=C2=A0 >=C2=A0 That<br> >=C2=A0 >=C2=A0 > would be an easy and safe optimization.<br> >=C2=A0 >=C2=A0 ><br> >=C2=A0 >=C2=A0 > The same goes for the case where the first argum= ent to MEMBER is a literal symbol.<br> >=C2=A0 >=C2=A0 ><br> >=C2=A0 >=C2=A0 > 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<br> >=C2=A0 because<br> >=C2=A0 >=C2=A0 it was<br> >=C2=A0 >=C2=A0 > believed that any modern Lisp compiler would app= ly this optimization automatically. At least SBCL does. (CCL doesn't, I= have filed a report already.)<br> >=C2=A0 >=C2=A0 ><br> >=C2=A0 >=C2=A0 > Best regards<br> >=C2=A0 >=C2=A0 > David Scherfgen<br> >=C2=A0 >=C2=A0 ><br> >=C2=A0 >=C2=A0 > _______________________________________________<= br> >=C2=A0 >=C2=A0 > Maxima-discuss mailing list<br> >=C2=A0 >=C2=A0 > <a href=3D"mailto:[email protected]= ge.net" target=3D"_blank">[email protected]</a><br> >=C2=A0 >=C2=A0 > <a href=3D"https://lists.sourceforge.net/lists/l= istinfo/maxima-discuss" rel=3D"noreferrer" target=3D"_blank">https://lists.= sourceforge.net/lists/listinfo/maxima-discuss</a><br> >=C2=A0 >=C2=A0 ><br> >=C2=A0 ><br> >=C2=A0 >=C2=A0 -- <br> >=C2=A0 >=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">[email protected]</a><br> >=C2=A0 >=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 >=C2=A0 "The earth is but one country, and mankind its c= itizens."=C2=A0 --=C2=A0 Baha'u'llah<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> >=C2=A0 _______________________________________________<br> >=C2=A0 Maxima-discuss mailing list<br> >=C2=A0 <a href=3D"mailto:[email protected]" target= =3D"_blank">[email protected]</a><br> >=C2=A0 <a href=3D"https://lists.sourceforge.net/lists/listinfo/maxima-d= iscuss" 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> --0000000000000719f4063466e2fe-- --===============7952386591091155800== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline --===============7952386591091155800== 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 --===============7952386591091155800==--