Path: csiph.com!news.mixmin.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Patricia Ferreira Newsgroups: pt.comp.programacao Subject: Re: mais sobre loops em common lisp Date: Sun, 10 Mar 2024 19:33:48 -0300 Organization: A noiseless patient Spider Lines: 65 Message-ID: <878r2pogxf.fsf@example.com> References: <87frwxoh5l.fsf@example.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Info: dont-email.me; posting-host="3676b724aa3c0867a5e40ead515e7a4e"; logging-data="3368165"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19/fNe7rYFQpZsmAwg7fK4xDZ9HybiOYRo=" Cancel-Lock: sha1:eqjJiuZWNEXa6vg/wtwd1YYyu7Y= sha1:mGP1/w689i8bG+LjNTub6RjD0cA= Xref: csiph.com pt.comp.programacao:281 Patricia Ferreira writes: > Eis uma alternativa a loop. Em vez de escrever, por exemplo, > > (loop for e in ls > when (> e 3) > collect e) > > podemos escrever > > (iter (for e in ls) > (when (> e 3) > (collect e))). Vamos comparar as expansĂ”es. Praticamente idĂȘnticas. ITER> (macroexpand '(loop for e in ls when (> e 3) collect e)) (BLOCK NIL (LET ((E NIL) (#:LOOP-LIST-339 (SB-KERNEL:THE* (LIST :USE-ANNOTATIONS T :SOURCE-FORM LS) LS))) (DECLARE (IGNORABLE #:LOOP-LIST-339) (IGNORABLE E)) (SB-LOOP::WITH-LOOP-LIST-COLLECTION-HEAD (#:LOOP-LIST-HEAD-340 #:LOOP-LIST-TAIL-341) (TAGBODY SB-LOOP::NEXT-LOOP (WHEN (ENDP #:LOOP-LIST-339) (GO SB-LOOP::END-LOOP)) (SB-LOOP::LOOP-DESETQ E (CAR #:LOOP-LIST-339)) (SB-LOOP::LOOP-DESETQ #:LOOP-LIST-339 (CDR #:LOOP-LIST-339)) (IF (> E 3) (SB-LOOP::LOOP-COLLECT-RPLACD (#:LOOP-LIST-HEAD-340 #:LOOP-LIST-TAIL-341) (LIST E))) (GO SB-LOOP::NEXT-LOOP) SB-LOOP::END-LOOP (RETURN-FROM NIL (SB-LOOP::LOOP-COLLECT-ANSWER #:LOOP-LIST-HEAD-340)))))) T ITER> (macroexpand '(iterate (for e in ls) (when (> e 3) (collect e)))) (LET* ((#:LIST5 NIL) (E NIL) (#:RESULT4 NIL) (#:END-POINTER6 NIL) (#:TEMP7 NIL)) (BLOCK NIL (BLOCK #:ITERATE342 (TAGBODY (PROGN (SETQ #:LIST5 LS)) LOOP-TOP-NIL (PROGN (IF (ENDP #:LIST5) (GO LOOP-END-NIL)) (SETQ E (CAR #:LIST5)) (SETQ #:LIST5 (CDR #:LIST5)) (IF (> E 3) (PROGN (SETQ #:TEMP7 (LIST E)) (SETQ #:END-POINTER6 (IF #:RESULT4 (SETF (CDR #:END-POINTER6) #:TEMP7) (SETQ #:RESULT4 #:TEMP7))) #:RESULT4))) (PROGN) (GO LOOP-TOP-NIL) LOOP-END-NIL (PROGN)) #:RESULT4))) T