Культурный офтопик
 help / color / mirror / Atom feed
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@


  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