From: Alexey Voinov <voins@voins.program.ru> To: "культурный офтопик" <smoke-room@lists.altlinux.org> Subject: Re: [room] Вопрос по Lisp Date: Sun, 28 Jan 2007 11:33:39 +0300 Message-ID: <m3odoja6u4.fsf@voins.program.ru> (raw) In-Reply-To: <20070128051952.GC8647@mw.local.seiros.ru> (=?utf-8?B?0JQ=?= =?utf-8?B?0LXQvdC40YEg0KHQvNC40YDQvdC+0LIncw==?= message of "Sun\, 28 Jan 2007 08\:19\:52 +0300") Денис Смирнов <mithraen@altlinux.ru> writes: > On Sat, Jan 27, 2007 at 02:28:26PM +0300, Alexey Voinov wrote: > > AV> Не, ты не понимаешь. :) Тупо - это вот так (используем srfi-1): > AV> (define (trim-zeroes-right data) > AV> (reverse (drop-while zero? (reverse data))) > > Гм. Логично. В описании к тому же nyquist я почему-то drop-while не нашел > :-/ Это из http://srfi.schemers.org/srfi-1/srfi-1.html В Сommon Lisp наверняка аналогичная функция есть в стандартной библиотеке. :) > AV> (define (trim-zeroes-right data) > AV> (let loop ((newlen (vector-length data))) > AV> (let ((index (- newlen 1))) > AV> (cond ((zero? newlen) > AV> '#()) > AV> ((zero? (vector-ref data index)) > AV> (loop index)) > AV> (else > AV> (vector-copy data 0 newlen)))))) > > Только эту конструкцию я не смог прочитать: > > AV> (cond ((zero? newlen) > AV> '#()) > AV> ((zero? (vector-ref data index)) > AV> (loop index)) Если мы в подсчёте нулей дошли до начала вектора (длина нового вектора равна 0), то возвращаем сразу пустой вектор, не дёргая копирования и выйдем из цикла. Если элемент в текущей позиции (index всегда на единицу меньше newlen) равен 0, то повторить процедуру сначала, уменьшив длину нового вектора на единицу (т.е. взять вместо длины - индекс). (let <name> ...) - очень удобная и полезная конструкция в scheme. :) На CL наверняка этот цикл будет проще записать каким-нибудь другим способом. Если мы нашли первый не-нуль от конца, то скопируем все нужные элементы и выйдем из цикла. -- Voins
next prev parent reply other threads:[~2007-01-28 8:33 UTC|newest] Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top 2007-01-26 4:24 Денис Смирнов 2007-01-27 11:28 ` Alexey Voinov 2007-01-28 5:19 ` Денис Смирнов 2007-01-28 8:33 ` Alexey Voinov [this message] 2007-02-06 16:28 ` Денис Смирнов 2007-02-06 17:53 ` Alexey Voinov 2007-02-08 21:50 ` Денис Смирнов 2007-02-14 16:22 ` [room] mpc кракозябры в ID тэгах Денис Смирнов 2007-02-14 14:38 ` Timur Batyrshin 2007-02-19 10:57 ` Денис Смирнов 2007-02-19 20:25 ` Aleksey Korotkov 2007-02-20 5:58 ` Andrew Borodin 2007-02-19 14:29 ` Nick S. Grechukh 2007-02-06 18:20 ` [room] Вопрос по Lisp Maxim Tyurin 2007-02-06 18:34 ` Alexey Voinov 2007-02-07 8:19 ` Maxim Tyurin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=m3odoja6u4.fsf@voins.program.ru \ --to=voins@voins.program.ru \ --cc=smoke-room@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Культурный офтопик This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/smoke-room/0 smoke-room/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 smoke-room smoke-room/ http://lore.altlinux.org/smoke-room \ smoke-room@lists.altlinux.org smoke-room@lists.altlinux.ru smoke-room@lists.altlinux.com smoke-room@altlinux.ru smoke-room@altlinux.org smoke-room@altlinux.com public-inbox-index smoke-room Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.smoke-room AGPL code for this site: git clone https://public-inbox.org/public-inbox.git