Path: csiph.com!weretis.net!feeder8.news.weretis.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: Fri, 08 Mar 2024 17:12:25 -0300 Organization: A noiseless patient Spider Lines: 87 Message-ID: <8734t0iity.fsf@example.com> References: <87edcxza4m.fsf@example.com> <87le74la4b.fsf@lispclub.com> <87ttlst7px.fsf@example.com> <878r2wsa0o.fsf@example.com> <87v860qomo.fsf@example.com> <87jzmgqnyl.fsf@example.com> <87cys8qnvt.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="709217590c1a7d211dc83a3985170039"; logging-data="1995763"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+XnB5c7rN1lBCjRe180bPSFGZc39QgoOo=" Cancel-Lock: sha1:xz3Vd6dvz3BUQqBVt9WH5/8HdUY= sha1:NgQxyRQoF9h1oXd+TkSx4lkAmpA= Xref: csiph.com pt.comp.programacao:273 Patricia Ferreira writes: > Patricia Ferreira writes: > >> Patricia Ferreira writes: >> >> [...] >> >>> 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. >> >> Não sei o que fazer se o rename não ocorrer, mas ficamos a versão final: >> >> (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)))))) >> (if (ignore-errors (rename-file name "accounts.lisp")) >> *accounts* >> (format t "could not rename ~a to account.lisp" name)))) > > Lol. Não é isso que quero, não. O que quero é: > > (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)))))) > (if (ignore-errors (rename-file name "accounts.lisp")) > *accounts* > (format nil "could not rename ~a to accounts.lisp" name)))) > > PACKAGE> (write-accounts) > "could not rename wqjjpdlifi.tmp to accounts.lisp" > > Agora sim. Lol. Eis meu terceiro loop. (defun size-of-longest-username () (loop for u in *accounts* maximizing (length (account-username u)))) Escrevi isso sem nem ter que olhar nada pra relembrar. Estou gostando de loop. Esse é o fato. De fato são coisas que a gente faz muito. A comunidade Lisp tem sabedoria aí.