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: sobre loops em common lisp Date: Tue, 05 Mar 2024 19:50:55 -0300 Organization: A noiseless patient Spider Lines: 51 Message-ID: <87v860qomo.fsf@example.com> References: <87edcxza4m.fsf@example.com> <87le74la4b.fsf@lispclub.com> <87ttlst7px.fsf@example.com> <878r2wsa0o.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="ab975914da06ca00ebe394476dbacea4"; logging-data="14606"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+k4l6s4rc79CFS/seYC6y/A0Uh2kDm4X8=" Cancel-Lock: sha1:R+2K/yVHFdWL+NeQQ6qmrwIVPHw= sha1:g8u4HyGk7VZhwOSQ927z3W/LJOc= Xref: csiph.com pt.comp.programacao:269 Patricia Ferreira writes: > Patricia Ferreira writes: > > [...] > >>> Oi Patricia. O PCL explica isso dos loops. O livro está aberto online em >>> https://gigamonkeys.com/book/ . >>> >>> Bons processamentos. >> >> Thanks. Vou ler o ``LOOP for black belts''. Mas não sei se pretendo >> usar esses truques todos, não. Parece difícil de entender como essas >> coisas funcionam. Ainda não sei o que vai acontecer. De repente vou >> usar pra caramba. :) > > Meu primeiro loop: > > (defun get-account (username) > (loop for u in *accounts* > do (when (eq username (account-username u)) > (return u)))) > > Acho que estou é gostando muito de /loop/. Dificilmente vou usar toda > essa expressividade, mas certamente vou usá-lo diariamente daqui pra > frente. Eis meu segundo. Gere um nome (de arquivo) aleatório e tente usá-lo. Se calhar de alguém já tê-lo escolhido, tente de novo (com outro nome). Feito isso, retorne-nos esse nome sortudo e pra que a gente possa renomeá-lo pro seu nome final---accounts.lisp. (defun write-accounts () (let ((name (loop (let* ((tmp (random-string 10)) (name (format nil "~a.tmp" tmp))) (when (ignore-errors (with-open-file (s name :direction :output :if-exists :error :if-does-not-exist :create) (write *accounts* :stream s))) (return name)))))) (rename-file name "accounts.lisp") *accounts*)) Tecnicamente temos um problema com esse procedimento. Se o rename-file não obtiver sucesso, nem vamos saber.