From: "Денис Смирнов" <mithraen@altlinux.ru>
To: "культурный офтопик" <smoke-room@lists.altlinux.org>
Subject: Re: [room] Вопрос по Lisp
Date: Sun, 28 Jan 2007 08:19:52 +0300
Message-ID: <20070128051952.GC8647@mw.local.seiros.ru> (raw)
In-Reply-To: <m3k5z8zp2d.fsf@voins.program.ru>
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 не нашел
:-/
AV> Здесь по сути два полных прохода по списку и один проход только по
AV> нулям в хвосте. Памяти требует немного (оно tail-recursive).
AV> Можно это сократить до гарантированных двух проходов, за счёт
AV> несколько более громоздкого кода:
AV> (define (trim-zeroes-right data)
AV> (let loop ((data data)
AV> (result '())
AV> (zeroes '()))
AV> (cond ((null? data) (reverse result))
AV> ((zero? (car data)) (loop (cdr data)
AV> result
AV> (cons 0 zeroes)))
AV> ((null? zeroes) (loop (cdr data)
AV> (cons (car data) result)
AV> zeroes))
AV> (else (loop (cdr data)
AV> (cons (car data)
AV> (append zeroes result))
AV> '())))))
AV> А если данные к нам приходят вектором, то получаем один проход по
AV> нулям и одно копирование субвектора (используем srfi-43):
Увы, данные приходят именно что массивом.
Вернее не так. Это на самом деле свертка (convolution). Генерируется
свертка немеряной длины, потом по ней прогоняются фильтры, получается
результирующая свертка. Это array. Нули на конце только увеличивают
длительность работы (да ещё и нелинейно), потому их так важно все
отрезать.
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> Т.е. последняя функция осуществляет всего один полный проход по всем
AV> элементам. В чём оно принципиально отличается от решения на C, я не
AV> вижу, честно говоря.
Гм. А Кажется ничем.
Только эту конструкцию я не смог прочитать:
AV> (cond ((zero? newlen)
AV> '#())
AV> ((zero? (vector-ref data index))
AV> (loop index))
>> Можно ли такое решить на голом лиспе, или нужно таки не выпендриваться и
>> написать на C?
>> ----------------------------------------------------------------------------
>> <Voins> посади дебианщика за alt так он сразу локали сломает! :)))
AV> Это ты специально фортунку со мной в такое письмо вставил? :))
У меня фортунка с модулями ясновидения и телепатии, а также умеет
самостоятельно составлять заклинания вызова :)
--
С уважением, Денис
http://freesource.info
----------------------------------------------------------------------------
Мастер достоин того, чтобы ради него купить DVD :)
-- mithraen in community@
next prev parent reply other threads:[~2007-01-28 5:19 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 ` Денис Смирнов [this message]
2007-01-28 8:33 ` Alexey Voinov
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=20070128051952.GC8647@mw.local.seiros.ru \
--to=mithraen@altlinux.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