LINUX.ORG.RU

lisp: loop vs series


0

0

Доброго дня! Кто пользовался в common lisp альтернативами расширенному loop, например, http://series.sourceforge.net или http://common-lisp.net/project/iterate/

Мне расширенный loop (http://www.lispworks.com/documentation/HyperSpec/Body/m_loop.htm) почти всем нравится, но кое-чем всё же не нравится. Критично не нравится невозможность создавать органичные расширения (а как это будет по-рюсски?). Например, в www.ap5.com loop просто полностью переопределён ради создания только одного нового clause, но это же нехорошо!

Хочется иметь решение, не менее гибкое, чем loop, но к тому же и имеющее стандартный механизм для расширения. У кого какие идеи?

★★★★★

Посмотри CLSQL - они там как раз и расширением loop-а тоже занимались. Заодно узнаешь какие из cl-ей поддерживают расширение loop-а а какие нет.

yyk ★★★★★
()

Я пользовался iterate. В целом, есть все, что есть в loop + некоторые свои более удобные вещи + более общие и более расширенные концепции + простая возможность расширения (можно описывать свои клаузы).

Только что плохо в iterate — я не видел для него готового расширения для cl-sql (в комплекте есть для pg-sql), но по образцу из cl-sql можно написать.

Из простого еще pygen — это итератор в стиле питона. Пишутся очень просто, но ограничены возможности: это не полноценный цикл, а всего лишь итерация.

mo3r
()
Ответ на: комментарий от mo3r

Доброго дня!
Спасибо всем за ответы. Я тут кстати, сам нашёл вот такой документ под заголовком: don't loop - iterate,

http://common-lisp.net/project/iterate/doc/Don_0027t-Loop-Iterate.html

там приводится сравнительный анализ разных вариантов итерации, правда, зачастую выбор в пользу iterate обосновывается лишь вкусом. Мне в iterate понравилось, что он внешне похож на loop, а loop я уже более-менее бегло пишу. Т.е., просто вместо
(loop for i from 1 to 10 when (< 2 i 5) collect (sqr i))
нужно писать
(iter (for i from 1 to 10) (when (< 2 i 5) (collect (sqrt i))))

На cl-sql тоже посмотрел. Файл расширения содержит примерно 9кб. Loop не имеет переносимого способа расширяться, но почти все реализации имеют свои способы, и эти способы зачастую совпадают.
Итого, расширение реализовано в cl-sql по сути, двумя разными способами, один для lispworks, другой - для
#+(or allegro clisp-aloop cmu openmcl sbcl scl)
но при этом для clisp loop ещё вдобавок полностью переопределён кодом, взятым из CMUCL. В общем, как-то это выглядит не особо весело для написания своих расширений, хотя могло бы быть и хуже...

Ну и чтобы два раза не вставать...
Есть такая вещь в лиспворксе для винды (случайно наткнулся):
в вызовах из интерпретатора можно опускать внешнюю пару скобок, например:
> + (* 2 2) 3
7
Правда, годится только для вызовов с параметрами. Если один токен в строке, то он воспринимается как переменная. Ну и две строки так не введёшь.
Очень удобно!
Хочется в слиме такое же сделать. У кого идеи - сложно это или нет?

den73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.