[room] Вопрос по Lisp
Денис Смирнов
=?iso-8859-1?q?mithraen_=CE=C1_altlinux=2Eru?=
Вт Фев 6 19:28:51 MSK 2007
On Sun, Jan 28, 2007 at 11:33:39AM +0300, Alexey Voinov wrote:
> AV>> Не, ты не понимаешь. :) Тупо - это вот так (используем srfi-1):
> AV>> (define (trim-zeroes-right data)
> AV>> (reverse (drop-while zero? (reverse data)))
>> Гм. Логично. В описании к тому же nyquist я почему-то drop-while не нашел
>> :-/
AV> Это из http://srfi.schemers.org/srfi-1/srfi-1.html
AV> В Сommon Lisp наверняка аналогичная функция есть в стандартной
AV> библиотеке. :)
Понял, буду искать. В nyquist (на базе xlisp), где мне это было надо,
ненашел.
> 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))
AV> Если мы в подсчёте нулей дошли до начала вектора (длина нового вектора
AV> равна 0), то возвращаем сразу пустой вектор, не дёргая копирования и
AV> выйдем из цикла.
AV> Если элемент в текущей позиции (index всегда на единицу меньше newlen)
AV> равен 0, то повторить процедуру сначала, уменьшив длину нового вектора
AV> на единицу (т.е. взять вместо длины - индекс). (let <name> ...) -
AV> очень удобная и полезная конструкция в scheme. :) На CL наверняка этот
AV> цикл будет проще записать каким-нибудь другим способом.
AV> Если мы нашли первый не-нуль от конца, то скопируем все нужные
AV> элементы и выйдем из цикла.
А в чем вообще принципиальнальное различие между scheme и lisp? man что на
предмет истории развития этих языков?
--
С уважением, Денис
http://freesource.info
----------------------------------------------------------------------------
Небезопасная это штука - wget.
-- ldv in sisyphus@
Подробная информация о списке рассылки smoke-room