Опубликована статья о возможностях языка LISP и его скриптового кросс-платформенного диалекта newLISP.
Надеюсь, будет полезна всем, кто еще не знаком с этими замечательными языками.
1. "Большинство языков программирования (за исключением BASICа ;-) разрабатывались с целью упрощения решения определенных задач" - вызывающе неверная информация (по части BASIC - ср. brainfuck, whitespace, unlambda, intercal).
2. (setq a "test") -> "test" Афигенная функциональщина...
я так понимаю в newLisp динамическая область видимости? Так об этом надо написать. А вообще динамическая видисомть (без возможнсти статической) - отстой.
> Статья хорошая, но зачем было создавать ещё один нестандартный диалект Лиспа? Хаоса и так предостаточно.
Этот экземпляр имеет самостоятельную ценность за счет кросс-платформенности (Win* + *nix), миниатюрности, простоты и возможностей.
Его надо сравнивать, скорее не с CL, а с Perl.
>1. "Большинство языков программирования (за исключением BASICа ;-) разрабатывались с целью упрощения решения определенных задач" - вызывающе неверная информация (по части BASIC - ср. brainfuck, whitespace, unlambda, intercal).
:-) и что, на кто-то пытался "решать задачи"? А на Васике - до сих пор.
>2. (setq a "test") -> "test" Афигенная функциональщина... Рассматривай в контексте примеров. Кроме того, не было цели показать "чистый функциональный стиль" - скорее акцент на возможностях, имеющих практический интерес для "процедурщиков" - про академический и так достаточно написано.
>я так понимаю в newLisp динамическая область видимости? Так об этом надо написать. А вообще динамическая видисомть (без возможнсти статической) - отстой.
Динамическая. Статическая реализована через контексты. Жить можно, многие, говорят, плакали, когда в CL ее нормально не включили ;-) Описание нюансов newLISP - не цель статьи.
>Присваивание неописанной переменной? А интерпретатор хоть warning выдаст по этому поводу? не выдаст. они вообще не описываются.
>3. Однако в ЛИСПе использование кода как данных является "повседневной" практикой, применяемой при любой необходимости (а также и вовсе без оной ;-).
>Угу вот только через макры, и очень редко через eval. А apply в нормальных лиспах вообще никакого отношения к этому не имеет.
В нормальных лиспах будет примерно то же, но с "funcall", насколько я понимаю. Углубляться в сравнение с CL - слишком много надо еще приплести. Кто им заинтересуется - найдет нормальную документацию.
Понятно, что Лисп сам по себе язык интересный. И для обучения никогда не помешает освоить.
Но вот если взять чисто с прагматической точки зрения. В сравнении с тем же перлом/питоном/руби (подставить кому что нравится), есть ли реальный прирост в скорости написания мелких и средних задачах?
> Но вот если взять чисто с прагматической точки зрения. В сравнении с тем же перлом/питоном/руби (подставить кому что нравится), есть ли реальный прирост в скорости написания мелких и средних задачах?
Для этого нужен человек, активно использующий и то, и другое.
>Но вот если взять чисто с прагматической точки зрения. В сравнении с тем же перлом/питоном/руби (подставить кому что нравится), есть ли реальный прирост в скорости написания мелких и средних задачах?
За ЛИСП не скажу - только документацию читал :-) На newLISP длина скриптов выходит сравнимая с Perl (+-10%). Зато код прозрачнее и писать субъективно приятнее.
Есть библиотека для CGI (не такая навороченная, как у Perl), есть HTTP функции get-url, put-url, post-url, есть CMS (на ней newlisp.org работает).
Язык приятный по многим параметрам, но сколько я не читал комментариев,
не понял, как реализовать в нём наследование в стиле ООП. Контексты
позволяют создавать объекты, но этого явно мало. Если нет наследования,
то чем его можно заменить? В доке "Design Patterns in newLISP" ничего
похожего не нашёл.
Дык, в его письме было просто "Лисп", а не newLisp. Хотя каюсь, в любом случае поступил некорректно, ибо это в моём сугубо личном понимании определения "лисп" и CL совпадают практически всегда :)
Кому ви таки впариваете!?
Вот вам квота с http://sbcl.sourceforge.net/
"Steel Bank Common Lisp (SBCL) is an open source (free software) compiler and runtime system for ANSI Common Lisp."
>как реализовать в нём наследование в стиле ООП
например, так:
(context 'parent) ; создаем класс-родителя
(define (var-value v) (if v (setq var v) var))
(context MAIN)
(context 'child) ; создаем класс-потомка
(new 'parent) ; копируем в него родителя
(setq var-value-parent var-value) ; сохраняем метод
(define (var-value) ; переопределяем
(unless (int? v)
(throw-error "only integer allowed")
(var-value-parent v)))
(context MAIN)
(new child 'object) ; создаем экземпляр
На самом деле - parent, child и object - просто разные контексты.
Теоретически, можно придумать макрос для некоторой автоматизации...
> Можно, без особого преувеличения, сказать, что список в ЛИСПе - единственный структурный тип данных. Записей - аналогов struct или record в ЛИСПе нет.
> Конечно, современные реализации имеют встроенную поддержку массивов и хэшей, однако реально они используются только в случаях, когда для алгоритма действительно нужны массивы или хэши, т.е., как ни удивительно, достаточно редко.
Как ни удивительно, при разработке в 1988-м году очередной своей Лисп-машины сотрудники LMI пришли к прямо противоположному выводу --- в общей массе данных списки занимают далеко не первое место, более того, их доля была сочтена настолько незначительной, что из аппаратуры выкинули поддержку CDR coding (заявленный в свое время, как одна из отличительных особенностей Лисп-машин).
>правда, что в newLisp аргументы всегда передаются по значению? Правда. Это такой способ забить на garbage collection :-)
Аргумент автора - "скорость копирования областей памяти на нынешних процах это позволяет". Я пол-года пытался его уличить в том, что со ссылками быстрее - но ни один мой тест этого не показал (по крайней мере на уровне _данного_ интерпретатора).
При обработке больших объемов данных (мег 50-150) приходится иногда брать в голову, что они могут _временно_ дублироваться.
С другой стороны - в newLISP динамическая область видимости, т.е., если в функции не переопределять символ (через let или список аргументов), то всегда виден последний определенный из стека. Т.е., его не обязательно передавать в функцию явно и работа с ним не вызывает копирования. Возможность спорная, но до CL она была и в ЛИСПе и многие ее любили...
> А про лисп машину - банально: посчитали, что софтовая реализация CDR выгоднее аппаратной :)
Ну, вообще-то cdr coding просто выкинули, даже без программной эмуляции. Ибо экономия памяти, которую он дает, оказалась мизерной. В данном же контексте интересно не это следствие, а его мотив:
Analysis of the storage on existing Lisp Machines indicated that only about 20 percent of the storage was actually stored in lists (the rest being vectors, structures, or classes)
(когда-то это лежало по адресу fare.tunes.org/tmp/emergent/kmachine.htm)
Это к вопросу о том, что в Лиспе список --- далеко не самая популярная структура данных. Да, так было в 1959-м, но кое-что изменилось.
Я раньше пользовался онли вимом и считал, что круче него редактора быть не может. Но когда начал учить РоР, решил попробовать емакс (типа чтобы самому поюзать, а потом смело его обсырать и говорить, что вим круто =]). Сначала не хватало очень многих вещей. Но были ништяки вроде авто-дополняющихся скобок и кавычек.
Потом поставил себе ваш rails-плагин и тебе под РоР только емаксом :). Особенно понравился набор снипетов и хот-кеи для быстрого перехода по каталогам.
>поэтому newLisp для демагогов. программисты уже выбрали php. :)
Ерунда. В отличии от PHP (на котором я в основном и пишу сейчас), newLisp замечателен тем, что умеет создавать компактные бинари, которые собираются под любую платформу + не требуют сторонних библиотек). Плюс newlisp-tk - очень легко писать кроссплатформенные ГУИ приложения. PHP тут вообще никаким боком... Да и еще во многих местах newLISP поудобнее PHP... а вещи типа net-eval? (выполнение кода на remote newLISP серверах) - что нам может PHP предложить аналогичного?
> Ну, вообще-то cdr coding просто выкинули, даже без программной эмуляции. Ибо экономия памяти, которую он дает, оказалась мизерной. В данном же контексте интересно не это следствие, а его мотив:
> Analysis of the storage on existing Lisp Machines indicated that only about 20 percent of the storage was actually stored in lists (the rest being vectors, structures, or classes)
Может у них лисп был другой? :)
Да одних только &rest &body хренова туча - это то, что первое приходит мне "на ум" :)
Я согласен, если имеется в виду "при первом взгляде" для тех, кто раньше
ничего подобного не видел. Но выгоды налицо, а привыкнуть можно. Есть
ведь человеческие языки, которые читают справа налево или сверху вниз!
И ничего, проблем не вызывают.
Не компилятор. Нет статической видимости. Говняные макры. Втопку. Я компилятор любого лиспообразного языка под любую заданную платформу за две недели пишу под ключ, а они хрен знает сколько не могут приличной фигулины выродить.
может еще и ссылкой кинешь, где можно посмотреть на твои чудо-newlisp-tk приложения? если -- нет -- в топку эти недотехнологии! =)
зы: http://www.newlisp.org/index.cgi?page=Code_Snippets
;; Get the current working directory on Win32 or UNIX
;;
;; by Sam Cox
;;
;; example:
;; (cwd) => "C:\\newlisp" ; on Win32
;;
;; (cwd) => "/home/newlisp" ; on Unix
;;
(if (= (& 0xF (last (sys-info))) 6)
(import "kernel32.dll" "GetCurrentDirectoryA"))
(define (cwd , buff)
(if (= (& 0xF (last (sys-info))) 6)
(begin
(setq buff (dup "\000" 260))
(GetCurrentDirectoryA 259 buff)
(trim buff))
;else for UNIX
(first (exec "pwd"))))
если так пишут "кроссплатформенные приложения" на newLisp'е, то php,
по сравнению с "этим", -- само совершенство, удобство и переносимость:
<?php getcwd(); ?> :)
>(if (= (& 0xF (last (sys-info))) 6)
> (import "kernel32.dll" "GetCurrentDirectoryA"))
>если так пишут "кроссплатформенные приложения" на newLisp'е, то php,
>по сравнению с "этим", -- само совершенство, удобство и переносимость
Так пишут вызовы к библиотекам. А на php их не пишут никак.
Это старый код, сейчас можно говорить: (real-path ".")
Для примера newlisp-tk приложения запусти newlisp-tk - это оно.
>Не компилятор. Нет статической видимости. Говняные макры. Втопку. Я компилятор любого лиспообразного языка под любую заданную платформу за две недели пишу под ключ
Угу. С адекватным набором библиотек. Кросс-платформенный. Интегрируемый с ОСью. Маленький. Универсальный для большинства скриптовых задач. Такой, чтобы было удобно использовать, а не только пальцы гнуть. И все за две недели.
Не надо писать, хотя бы скажи, где взять такой :-)