> Ага, страница кода конечно лучше, чем два десятка строк - вопросов нет!.. :)
Кода у меня больше, но как раз из-за того что у меня это написано как нормальный production код, а у них грязыный хак.
>> 1. Отдельный класс на парсер. У них просто разбирают строки в main-e У меня есть возможность использовать Parser повторно
> А на лиспе кто-то запрещает код использовать повтороно? Там только пример. Переделать на функции - больше кода не станет :)
Сделаешь функцию, появится лишняя строка. Я могу использовать функцию parse(), а не клас Parser, на этом я сэкономлю строки 4, но я этого делать просто не хочу.
>> 2. Отдельный классы на SystemObject, ServiceCall, Usage. Т.е. возможность объявить разные методы у разных классов.
> Ну а там лепи себе defmapping под свои нужды - и всех делов. Хоть ещё для десятка типов. В чём твоё преимущество?
Они создают пустой класс, в том что у меня используются _разные_ классы ServiceCall и Usage объявленные отдельно (4 строки), у них же в макросе создаётся пустой класс, т.е. нет возможности добавить к разным классам разные методы и т.д. Конечно, можно объявить класс отдельно, и передать его в макрос вместе с параметрами строки для разбора, но это опять таки приведёт к росту кода.
>> 3. Переопределённый __str__. У них насколько я понял, используется стандартное строковое представление объектов.
> Вот тут я тебя не понял.
В Питоне, если ты отправишь на печять объект для которого не определён __str__(), просто напишет что это объект такого-то класса по такому-то адресу, а значения атрибутов объекта не выведет. Я этот метод определил для своих объектов (3 строки). В том примере, насколько я понял, используется стандартный вывод Лисповых объектов.
>> 4. Четвёрка у меня именнованная константа, у них magic number
> Это даже не смешно. Это же был пример на скорую руку. Ещё одна строка кода - всего-то. Или более того - вынести не 4-ку, а (subseq line 0 4) (а то и вместе с internal) в функциональную переменную, и определяй себе тип как твоей душе угодно.
Ну не скажите Фёдор Михалыч, десять старушек --- рубль.
Вот, так у них там сэкномили пару строк, здесь сэкономили. Вот и получился код компактный. На питоне, тоже можно довести этот пример до одной строки (см. Obfuscated Python выше :-), но я просто не хочу и не буду этого делать. Readability Counts
> Кода у меня больше, но как раз из-за того что у меня это написано как нормальный production код, а у них грязыный хак.
Хак на лиспе? Это что-то новенькое... ;)
> Я могу использовать функцию parse(), а не клас Parser, на этом я сэкономлю строки 4, но я этого делать просто не хочу.
Т.е. на голом месте добавил новую сущность и рад по уши? :)
Ладно, "нравится" тебе питон - используй его. А раз маленькие примеры тебя "не вдохновляют" (хотя может и дейсвительно ты ещё не увидел чему здесь вдохновляться) - посмотри что-нибудь по-больше. Не хочешь loop смотреть - посмотри на CLSQL. Он понятнее :)
2. Если ты встретил гоязный хак на лиспе, смотри пункт 1 o_O
> Ладно, "нравится" тебе питон - используй его. А раз маленькие примеры тебя "не вдохновляют" (хотя может и дейсвительно ты ещё не увидел чему здесь вдохновляться) - посмотри что-нибудь по-больше. Не хочешь loop смотреть - посмотри на CLSQL. Он понятнее :)
Да надо будет как-нибудь посмотреть...когда время будет.
А какой реализацией Лиспа лучше пользоваться, чтобы работал на Win32, были ебилды и чтоб был байндинг к Qt или wx, и желательно open-source?
> Ты действительно думаешь что критерий качества кода только один --- минимальный размер?
Я считаю что критерием качества кода является минимальный _логический_ размер. см. те же перестановки. Для осуществления пришлось применять ряд сущностей, которые не нужны для решения задачи но являются необходимыми чтобы объяснить компу, что от него собственно требуется.
> грязных хаков
если под грязым хаком понимать использование не предусмотренной конструкторами языка возможности или особенности, в лиспе грязных хаков не бывает. Потому что операции там слишком абстрактны от природы чтобы не подходить изначально для чего-нибудь.
> А какой реализацией Лиспа лучше пользоваться, чтобы работал на Win32, были ебилды и чтоб был байндинг к Qt или wx, и желательно open-source?
Если есть ебилды cLisp - бери его. Если не страшно заниматься сборкой sbcl под винду (он там вроде собирается только сам собой - надо тянуть с sf.net бинарник не самой свежей версии и собирать) - бери его: скорость порадует (особенно по сравнению с питоном :))
"байдинги" ищи отдельно на cliki.net common-lisp.net www.cl-user.net
Раз уж затеяли сей импровизированный PR для лиспа, еще два вопроса:
1. Есть ли какие региональные lisp community (user groups) в России или Украине?
2. Есть ли нормальные русскоязычные ресурсы по лиспу?
По аналогии с питоном тыкнулся в lisp.ru и lisp.org.ru. Первый 'Under construction' ;-), а второй -- англоязычен. По гуглу нашел вот это: http://lisp.ystok.ru/ru/links.html. Как я понял, это только набор ссылок, хотя и не плохих.
Более конкретно, чем пользуются лисперы (совсем конкретно -- уважаемые yyk и bugmaker) для междусобойчиков? Или от недостатка ресурсов живут на общих типа ЛОР?
> Более конкретно, чем пользуются лисперы (совсем конкретно -- уважаемые yyk и bugmaker) для междусобойчиков?
Лично я не вижу необходимости в "междусобойчиках". Лисп настолько простая штука, как полено, что обсуждать безсмысленно а все проблемы решены годы и десятилетия назад. Впрочем иногда не прочь поболтать на канале #lisp в irc.freenode.net.
Вот здесь есь стартовый пакет, с учебниками, факами и прочим:
Особое внимание ИМХО стоит уделять HyperSpec и http://cliki.net. Первое - справочное пособие которое лучше всегда держать под рукой, второе - хорошо коментированный набор ссылок на разнообразные штуковины, полезные для разработчика: библиотеки, реализации лисп-машин и прочее.
>А какой реализацией Лиспа лучше пользоваться, чтобы работал на Win32, были ебилды и чтоб был байндинг к Qt или wx, и желательно open-source?
Пока рекомендую CLISP, если желательно open-source. SBCL для Windows имеет только экспериментальную поддержку в CVS. Это означает, что запустить, наверное, что-то сможешь, но полную поддержку пока не получишь. Будешь сам собирать? Компилятор SBCL на 99% сам на себе написан. Я пока не рисковал этим заниматься. Я только колупался в исходниках из любопытства, чтобы посмотреть, как SBCL генерирует машинные коды и как оптимизирует. :)
A very basic attempt based on the dynamic Qt capabilities (see QMetaObject). Currently it's (maybe) more of a toy and still in planning phase. To extend it you need some Qt knowledge.
Should work with any CFFI enabled Lisp (currently FreeBSD, Linux, Win32) Tested with CLISP (Linux, Win32), ECL (Linux, Win32) and SBCL (FreeBSD, Linux).
> 1. Есть ли какие региональные lisp community (user groups) в России или Украине?
Мне такие не известны.
> 2. Есть ли нормальные русскоязычные ресурсы по лиспу?
Что есть "нормальные"?
есть fido7.ru.lisp. Народу там не много, и тишина почти всегда, но за эхой следят и отвечают на вопросы почти всегда :)
> Более конкретно, чем пользуются лисперы (совсем конкретно -- уважаемые yyk и bugmaker) для междусобойчиков? Или от недостатка ресурсов живут на общих типа ЛОР?
Если сил перевести свой вопрос на английский нет - в указанную эху. А так чаще в форуме конкретного лиспа либо на comp.lang.lisp со всем непрофильным :)
> Да, не удивишь. Но догнать его так никто и не смог...
Мне одному вспомнился анекдот про неуловимого Джо? 8)
> Или уже есть язык, в котором всю его мощь можно использовать для кодогенерации, причём в теле основной программы, а не внешним/сторонними трансляторами?
Мне упорно приходит на ум PL/I. Что-то очень похожее там было. Но я на PL/I уже почти 15 лет не работаю.
>... Охренеть можно.
Это было перечисление заботливо разложенных подводных камней и граблей Лиспа? Или Перла? По-моему, в Лиспе макросы можно вдурную использовать - как два байта переслать.
> хотя питону такое и не снилось
> какой Гвидо решил создать синтаксис, таким вы пользоваться и будете. А тут пиши себе свой хоть по одному на каждый день недели...
Ну да, в понедельник пишем синтаксис, в пятницу - вспоминаем, что там что значит 8)
> Мне одному вспомнился анекдот про неуловимого Джо? 8)
Ах ты блин... Как по одному, так "этим никого не удивишь", а как всё вместе - "а нафиг кому надо"... Неа, не нужен вам лисп :)Ь
> Это было перечисление заботливо разложенных подводных камней и граблей Лиспа? Или Перла? По-моему, в Лиспе макросы можно вдурную использовать - как два байта переслать.
Лиспа. А "вдурную" - это не к языку, а к кодеру :)
> Ну да, в понедельник пишем синтаксис, в пятницу - вспоминаем, что там что значит 8)
Ок, в надцатый раз: loop, CLSQL, etc...
> В Питоне тоже можно сделать расширяемый синтаксис...
> Э нет... loop - это стандарт, CLSQL - тоже, в общем-то. А речь шла о _своих_ синтаксисах, разве нет?
Значит, отбрасываем XML, HTML, прочие структурные форматы... Конечно, каждый день и для каждой проги свой синтаксис не нужен. Но по анологии с with-open-file свои with-XXX пишутся практически в каждой второй проге. В любом случае, это млжно сделать в любой момент "здесь и сейчас", а потом подгрузить при надобности. А не писать патч к самому языку (компилятору/интерпретатору) или макрокомпилатор к нему и потом тащить это от версии к версии и использовать через... ну, вы в курсе :)
> Ибо не труЪ, ибо не Лисп.
Ибо не предусмотрено стандартом языка, и, как следствие, это уже не питон, а "грязный хак" и нечто питонообразное... :)
>> В Питоне тоже можно сделать расширяемый синтаксис
> А лисп сам по себе расширяемый синтаксис. Чуем разницу?
Честно говоря, нет (некоторые, кстати, считают, что в Лиспе вообще отсуствует синтаксис).
Как в Лиспе определить, например, Си-шный синтаксис для for? Чтобы с ';' и фигурными скобками? Или Питоновский синтаксис для list comprehensions? Да хоть что-нибудь, _не_ являющееся правильным Лисповым списком? По-моему, _синтаксис_ Лиспа не расширяем вообще - всё в прокрустовом ложе списков.
Там выше по треду есь ссыло на sweet-code. Эта приблуда позволяет лиспобыдлокодить в более привычном синтаксисе - открывающяяся скопка после имени функции, инфиксные оператоы итп. Посмотри как там сделано.
Так это просто парсер, написанный на лиспе. Такое можно и на Питоне сделать, и на Си. Правда, сложнее получиться, да.
Интересная вещь - кучу инструментов, написанных на Лиспе, его любители засчитывают как возможности _самого языка_. При этом аналогичные инструменты, написанные на других языках - "кастыли".
>Как в Лиспе определить, например, Си-шный синтаксис для for? Чтобы с ';' и фигурными скобками? Или Питоновский синтаксис для list comprehensions? Да хоть что-нибудь, _не_ являющееся правильным Лисповым списком? По-моему, _синтаксис_ Лиспа не расширяем вообще - всё в прокрустовом ложе списков.
Первое, что я хочу сказать: Мсье извращенец? Во-первых, это просто не нужно. Но если очень нужно, то
Второе. Можно! Все лисповые функции читаются функцией read, которая и есть парсер. Изначально он "натаскан" на LISP-программы в виде s-expressions). И вот этот самый read настолько параметризуем (в самой же LISP-программе!), что ты можешь даже Lisp не узнать. То есть у тебя будет тот же самый REPL, но ты сможешь пользоваться новым синтаксисом, но он внутри LISP после эвалуации превратится в нормальный лисповый объект.
Пример: REPL> #c(0 1)
Это не s-expression. Внутри себя видит как (complex 0 1). В onlisp естьпримерчик реализации
REPL> #[2 7] (2 3 4 5 6 7)
Насчет реализации синтаксиса C и Python через read я не слышал (только психу это может понадобиться). Однако есть проект, в котором реализован python. Он называется CLPython. Прямо в REPL программируешь на питоне, а он тебе в результате LISP-объекты создает и работает. Недавно где-то саныч новость об этом постил.
Вау! На Лиспе можно написать парсер! Да, такое не каждому языку под силу. А потом результат работы прасера можно скормить интерпретатору Лиспа? Ну афигеть, вау!
Нет, постой... Это ж такое на любом интерпретируемом языке жожно сделать. А! _Любой_ язык имеет расширяемый синтаксис! Вот что хотели сказать лисперы!
Для тех, кто в танке - насколько можно расширить синтаксис Лиспа, не прибегая к написанию специальных парсеров? Не переопределяя read, read-table, или еще что-нибудь такое.
Ты не повериш, даже на асме можно. И на любом тьюринг-полном. Это же не причина всё бросать и юзать всякие брайнфак, уайтспейс и питон. Хотя на сях, бывает, имеет смысл делать. Эзотерический смысл, добавил по совету супруги.
> Правда, сложнее получиться, да.
Не суть важно что сложнее, а суть _почему_ сложнее.
>Не суть важно что сложнее, а суть _почему_ сложнее.
Если синтаксис будет отличаться от Лиспового, то написать парсер на Лиспе - не проще, чем на Питоне. А то, что в Лиспе парсер входного языка интегрирован в runtime и может быть заменен - интересная фишка, которая ни на что особо не влияет.
Фактически, в лиспе два языка с одинаковым синтаксисом - язык исполняемый и язык макросов. Интерпретатор можно на любом езыке произвести, а вот для метапрограммирования нужен достаточно мощный язык макросов, тьюринг-полный. Метапрограммирование - это не написание интерпретатора и не настройка парсера, а как раз преобразование исходников.
> По-моему, _синтаксис_ Лиспа не расширяем вообще - всё в прокрустовом ложе списков.
Ну, строки-то они как-то умудрились расширить. Правда, совершенно не представляю себе, как можно реализовать текстовые фильтры, где обычно рулят sed/awk/sort/perl, исключительно с помощью средств Лиспа.
Ну вот, скажем такая задачка: во сколько строк на Лиспе реализуется нечто, аналогичное sed, awk или sort?
Кстати, никто так и не ответил мне, есть ли в emacs строково-системные фильтры в стиле vi?
> Лисп настолько простая штука, как полено, что обсуждать безсмысленно а все проблемы решены годы и десятилетия назад.
Аха. Особенно проблемы биндинга к gtk. Особенно для меня ;-).
Новичков нужно любить -- они могут оказаться потенциальными лисперами. Будьте проще -- и люди к вам потянутся.
Может быть, проблема маргинальности лиспа именно в этом? В том, что каждый лиспер -- сам себе мудрец в башне из слоновой кости? Впрочем, по стилю yyk в это легко поверить ;-).
> Аха. Особенно проблемы биндинга к gtk. Особенно для меня ;-).
Извиняй, что не отписался щё как обещял. Меня не будет в сети ближайшие нескко суток, я ращитывал по возвращению. А какая может быть трабла с биндингом? Там вроде всё просто совсем. Прям в форум можеш вопросы запостить, может быстрее хто ответит.
> В том, что каждый лиспер -- сам себе мудрец в башне из слоновой кости?
На ирц нормальный пипл тусуецо, нефих бочку катить. А так, да, лисп-дзен извесное явление, нужное и полезное.
>Ну, строки-то они как-то умудрились расширить. Правда, совершенно не представляю себе, как можно реализовать текстовые фильтры, где обычно рулят sed/awk/sort/perl, исключительно с помощью средств Лиспа.
Ну никто тут не бросится писать awk или sed на лиспе (вопрос здравого смысла: "а зачем реализовывать awk на лиспе?". Спортивный интерес?). Максимум, что можно сделать -- это ткнуть куда-нибудь новом в то, что кто-то сделал.
> вопрос здравого смысла: "а зачем реализовывать awk на лиспе?". Спортивный интерес?
Ответ очень простой: практический интерес. Ежедневная рутина по обработке логов. Или (о ужас!) правоверные лисперы признают, что кроме Лисп нужно знать еще что-то?
*** - USE-PACKAGE: There is no package with name "GTK" The following restarts are available: USE-VALUE :R1 You may input a value to be used instead. ABORT :R2 ABORT ABORT :R3 ABORT
То есть, я понимаю, что у меня gtk нет, не тупой. Но что делать? Где взять и куда положить, чтоб поехало? Вообще, есть какая-то step-by-step howto? Или, как всегда у лисперов -- сплошной дзен?
>Ответ очень простой: практический интерес. Ежедневная рутина по обработке логов. Или (о ужас!) правоверные лисперы признают, что кроме Лисп нужно знать еще что-то?
Я сейчас начну объяснять, а ты взамен начнешь мне предлагать что-то реализовать. :) Гы.
Объясняю. Выше я дал ссылку на проект реализации быстрых регэкспов (заявляют, что быстрее перловых. подкреплено внизу тестами). Есть фильтрация. Как делается она понятно? Создаешь функцию, которая что-то делает, когда срабатывает регэксп (примеры выше). Чтение/запись из файлов есть. Функции по работе со строками есть. Вместо awk выступает сам Common Lisp. Вот я и спрашиваю: зачем awk, когда есть все? Самодостаточная система же.
> Вот я и спрашиваю: зачем awk, когда есть все? Самодостаточная система же.
Аха. Самодостаточная система. Как Лего. "Собери сам себе велсипед" называется ;-). Не, ну чо. Я однажды даже роликовые коньки из Лего собранные видел. Ничо так...
>Аха. Самодостаточная система. Как Лего. "Собери сам себе велсипед" называется ;-). Не, ну чо. Я однажды даже роликовые коньки из Лего собранные видел. Ничо так...
Бугога. А awk сам пишет программы? а sed сам скрипты генерирует? Регэкспы сами рисуются? Разве GNU -- это не строительные блоки? Здесь же ты имеешь один и тот же инструмент для такого рода работы, который уместнее сравнивать не с awk/sed/... , а с perl! Тебя не возмущает, что ему awk не нужен? :)
Когда-то я угробил уйму времени на выбор любимого языка. Потом -- любимой СУБД. Недавно закончил выбор любимого ГИП-тулкита. Теперь у меня появилась новая игрушка -- выбор любимого диалекта Lisp.
Кажется, жизнь опять начинает приобретать смысл!
Народ, а не забодяжить ли нам ветку clisp vs sbcl vs gcl? Может, и слаку переплюнем?
> Как в Лиспе определить, например, Си-шный синтаксис для for? Чтобы с ';' и фигурными скобками? Или Питоновский синтаксис для list comprehensions? Да хоть что-нибудь, _не_ являющееся правильным Лисповым списком? По-моему, _синтаксис_ Лиспа не расширяем вообще - всё в прокрустовом ложе списков.
Ну ты же знаешь ответ - посмотри loop и CLSQL :)))))
А на деле - это никому нафиг не надо. Хотя можно.
А что не является _правильным лисповым списком_? Списком можно обозвать всё (и соответственно обработать на лиспе) у чего есть начало и конец. И за твоим "прокрустовым ложем" списков очень сильно проглядывает "затрахали ваши скобочки", хоть ты и стараешься от этого уйти. Ну, ты уже понял, что список - это не скобочки? :)