Вот. Вскрытие показало, что Common Lisp можно было вылечить... Но стоит ли оно того? Интересно, какие есть подходы к созданию быстрой среды исполнения Python?
Как рантайм-среда лисп, конечно же, на четыре головы выше питона. Но... в жизни имеют значение много факторов. А лисп всё же стоит знать, потому что рантайм-сред такого качества больше в природе нет. Наверное, нужно знать не Common Lisp, а один из его предшественников. Или одну из реализаций (лучше всего - Allegro).
А есть кто пользует Pyrex? Насколько это хорошая вещь? Такой вариант, как "прототип на питоне - боевое приложение на Pyrex" имеет смысл? Тормознутость питона всё же пугает меня.
Одного старого игрока на скачках спросили: "вы играете уже 40 лет. Вы чаще выигрывали или проигрывали?" Он ответил: "бывало разное, но всё же, честно говоря, чаще я проигрывал". - "А зачем же Вы тогда играли?" - "Я получал от этого удовольствие".
> Тогда пиши на Си. Или сразу на ассемблере
Ну вообще-то есть высокоуровневые и при этом быстрые языки, как-то:
ocaml/F#, haskell, common lisp/clojure, ну и и ещё много чего. Питон в этом отношении малость... э... убогенький уродился. >> Такой вариант, как "прототип на питоне - боевое приложение на Pyrex" имеет смысл?
>Нет. Pyrex создавался для написания _фрагментов_ приложений.
Ага. Значит "прототип на питоне - переписывание узких мест на Cython"?
> Ну вообще-то есть высокоуровневые и при этом быстрые языки, как-то: ocaml/F#, haskell, common lisp/clojure, ну и и ещё много чего. Питон в этом отношении малость... э... убогенький уродился.
Ну так переходи на них, в чем проблема?
> Значит "прототип на питоне - переписывание узких мест на Cython"?
А, вот и ещё вопрос. После лиспа меня шокировало, что я не могу вырезать пример из веб-страницы и бухнуть его в REPL. Мешают поганые многоточия. Есть ли способ решения этой проблемы? Также меня очень сильно обломало то, что при нажатии M-P в Emacs мне выходит не всё предложение целиком? а только одна строчка. Т.е., я не нашёл способа, как мне вызвать в REPL предыдущее предложение, подправить его и запустить по-новой. В лиспе я этим занимаюсь постоянно и это естественно, как дыхание.
Нет. Успел поработать только на CL и хорошо прочувствовал обе его стороны. Лисп гениален, но он сливает современным языкам из-за нескольких довольно небольших (но неизлечимых) проблем. На ocaml поработал мой товарищ и говорит, что он хуже хаскеля и энергия перетекает от окамля в хаскель. Соответственно, окамль (который и так никому был не нужен) умирает окончательно. Хаскель же мне не нравится извращённым отношением к жизни и это мнение - окончательное. Кроме того, и Хаскель тоже никому не нужен (вакансий - около нуля). Clojure - это тоже лисп, со всеми его проблемами, да к тому же ещё в болоте, где жабы водятся. Кроме того, Clojure подхватил от хаскеля нездоровый ген чистой функциональности.
У питона только два недостатка - это тормоза и отсутствие макросов (хотя наличие exec и тройных кавычек отчасти искупает второй недостаток).
А вообще, в какой среде запускают питоновый REPL и редактируют питоновые программы? Чтоб там был completion, definition search. Я не смотрел пока, может это и в EMACS можно, но из этого не следует, что им нужно пользоваться :)
>Хаскель тоже никому не нужен (вакансий - около нуля).
Хаскель изучают не для устройства на работу, а для создания ультимативной программы, вычисляющей Ответ на главный вопрос жизни, вселенной и всего такого
Спасибо за ключевое слово EasyExtend, я давно искал, где же там макросы. Хотя более интересен макропроцессор собственно для python, в стиле common-lisp:defmacro. Есть такое в природе?
За PyDev тоже спасибо, буду смотреть. А что, в нём разве нет встроенного REPL? Странно это после лиспа...
>>Лисп гениален, но он сливает современным языкам из-за нескольких довольно небольших (но неизлечимых) проблем. > тема не раскрыта
> можно поподробней?
Ну вообще, о покойниках лучше или хорошее, или никак. Чем гениален:
- динамичный рантайм, где можно элементарно создавать и менять классы и функции в рантайме, при этом можно генерить и нативный код с инлайнами и type inference. Если класс поменялся, то все не затронутые данные живущих экземпляров этого класса сохраняются.
- не только функции, но даже идентификаторы в лиспе являются первоклассными объектами, в отличие, например, от того же хаскеля (если я не путаю про хаскель).
- мощный REPL. s-выражения не особо хорошо читать, зато ими очень удобно жонглировать в редакторе, т.к. их границы видны.
- возобновляемые ошибки. Есть такое понятие "restart". Если происходит ошибка времени выполнения, в большом количестве случаев можно что-то подкрутить и попробовать ещё раз, не разворачивая стека до обработчика исключений, как в какой-нибудь жабе. Также можно делать свои ошибки с возможность рестарта.
- ООП с множественной диспетчеризацией (можно делать виртуальные функции, в которых конкретный код определяется типом нескольких параметров, а не только одного, как в С++ и жабе).
- макросы и расширяемый компилятор. Новые конструкции языка делаются ну совершенно с полпинка. Шаблоны С++ нервно курят в сторонке (рядом курит и Nemerle)
- достаточно быстр для языка со сборкой мусора и динамической типизацией. Едва отстаёт по скорости от серверной жабы, при этом жрёт меньше памяти раза в два-три.
- ФП сегодня никого не удивишь, но в лиспе нет нужды в поделиях типа STL. Те идеи, которые в STL реализованы через задницу, в лиспе реализуются очень естественно (хотя я не буду говорить о скорости выполнения - просто не знаю)
Чем плох?
- Плохо устроена модульность
- класс не создаёт пространства имён, как в Java и C++.
- статической типизации по сути нет, из-за этого ООП несколько тормозит (хотя я думаю, всё ещё в разы быстрее того же питона)
- ООП плохо масштабируется, поскольку функции не принадлежат классам. В С++ можно иметь foo::add(один аргумент) и bar::add(два аргумента)
а в лиспе сигнатура функции фиксирована и не зависит от типов.
- во многих конструкциях действительно есть лишние скобки
- компилятор редко показывает конкретную строчку с ошибкой
- вообще, со сборкой плоховато
- лисперы - в основном теоретики и редко доводят хорошие идеи до
полного и полезного воплощения
Python :
могу писать на нем - и не пишу:)))
читаю любой исходный код питона - непонятное и непреодолимое отвращение
охватывает...
может, надо уже за деньги кодить на таком ? - ибо ,для души это все не канает.
:))
> Вроде были какие-то проекты по скрещиванию PyPy c LLVM.
Что-то я в это как-то не верю. Может быть, зря...
Да я вообще не верю в JIT, по правде говоря. Что-то в нём есть такое...
лохотронистое... Именно, что блекджек и шлюхи. Cython кажется идейно гораздо более правильным (и кстати, видимо, гораздо более простым по устройству).
> возобновляемые ошибки. Есть такое понятие "restart". Если происходит ошибка времени выполнения, в большом количестве случаев можно что-то подкрутить и попробовать ещё раз, не разворачивая стека до обработчика исключений, как в какой-нибудь жабе. Также можно делать свои ошибки с возможность рестарта.
Тут поподробней пожалуста. Пример что ли. Чем это отличается от обработчика в объемлющем блоке.
> www_linux_org_ru, а ты меня обидел - не привёл пример как разбоксить в С++. Приведи пример и будет снова мир и дружба.
Весьма НЕ советую использовать С++, не понимая его до конца -- это надо было понять, а не обижаться. Если очень хочется разбоксинг, (на всякий случай) опиши контекст -- где зачем для чего.
Кстати, вся эта история имеет положительный момент, т.к. из нее я понял, что лисп юзают ради poor man's algebraic data types.
>ООП плохо масштабируется, поскольку функции не принадлежат классам. В С++ можно иметь foo::add(один аргумент) и bar::add(два аргумента)
а в лиспе сигнатура функции фиксирована и не зависит от типов.
Не вижу проблем:
(defclass foo () ())
(defclass bar () ())
(defgeneric add (object &key))
(defmethod add ((object foo) &key (x 0))
(1+ x))
(defmethod add ((object bar) &key (a 0) (b 0))
(+ x y))