LINUX.ORG.RU

newLISP - 8.4.0 - Новый Лисп


0

0

В свете недавнего выхода newLISP 8.4.0 хотелось бы обратить внимание общественности на этот интересный язык. Являясь диалектом LISP, newLISP в первую очередь оптимизирован для _быстрого_ написания современных Web-ориентированных приложений, а также приложений общего назначения.

Сайт проекта: http://newlisp.org Автор: Луц Мюллер (Lutz Mueller) Страница Download: http://newlisp.org/index.cgi?page=Dow...

Отличительные черты: 1) Эффективность и быстрота исполнения кода. Здесь: http://newlisp.org/benchmarks/ можно посмотреть бенчмарки - сравнивался newLISP, Perl и Python на 25 примерах задач. Также обратите внимания на размер исходников. 2) компактность. В 300кб (бинарный пакет под Slackware) входит сам newLISP, документация, готовые модули для работы с CGI,FTP,POP3,SMTP,MySQL,SQLite,ODBC,XML- RPC, а также newlisp-tk (для написания GUI Tcl/Tk newLISP приложений). 3) кроссплатформенность: GNU/LINUX, FreeBSD, Mac OSX, Solaris, CYGWIN and Win32 (EXE or DLL)/ есть версия newLISP с поддержкой unicode/UTF-8 4) легкость добавления новых модулей. Для примера кросс-платформенная версия OpenGL демки glut ( трехмерный чайник, вращающийся мышкой), работающая через SDL и OpenGL весит около 7кб с учетом импорта функций из внешних библиотек SDL/OpenGL. 5) большое количество интересных приложений и образцов кода по которым можно изучить язык, например: http сервер (http://newlisp.org/httpd.txt) , чат-скрипты, TCP/UDP порт сканнер, RSS-ticker (http://www.nodep.nl/newlisp/index.html) , простенькая IDE (http://newlisp.org/downloads/newlisp-...), а также Wiki написанная на newLISP: http://newlisp.org/wiki и многое другое...

>>> Подробности



Проверено: Pi ()
Ответ на: комментарий от Moridin

> Да кто ж тебе мешает? Удаляй! define-macro, и вперёд! Из Лиспа с истинными макрами можно сделать ЛЮБОЙ язык. Именно по этой причине Лисп вообще ни с какими языками сравнивать нельзя (надо же, тут блин нашлись олухи, которые с ЖАБОЙ (!!!!) сравнили) - Лисп содержит в себе ВСЕ свойства ВСЕХ других языков. Он - общий. Другие - частные.

Блестяще! Я долго аплодировал.

hbee ★★★★
()
Ответ на: комментарий от Moridin

ты что дядя, кде предлагаешь в виде скрипта держать? ау на бронепоез... тьфу, на суперкомпьютере, слезайте!

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

Да даже JavaScript-еры или Tcl-еры, если захотят. Только у них всё равно нет полноценной среды метапрограммирования - только некоторые (но не все) возможности.

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

Дружище, я на Лиспе ваял с 83-го до 95-го. Вернее, разработал на нем свое IDE, на коем под ваш космос написал ряд программулин (типа оперативное и долгосрочное планирование наземного контура управления системой "ГЛОНАСС", стояли на дежурстве лет 7, справки о внедрении могу выслать).

Эта штука посильнее, чем...

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

> разработал на нем свое IDE, на коем под ваш космос написал ряд программулин

Очень интересно! А статью-воспоминание об этих проектах типа "Редкой профессии" Е. Зуева написать не хотите? Конечно, если соотв. подписка позволяет. Лично я был бы очень благодарен за такую информацию.

--

SVK

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

>Если честно, то я не понимаю где именно имеет смысл применять функциоальные языки программирования. Понятно, что для определенных мат. задач. а где еще? И на кой на них гуй писать?

>P.S. Плз воздеритесь от флейма. Я серьезно спрашиваю.

XML знаешь? JSP знаешь? Ну вот. Это оно и есть. Custom Tags - вместо defmacro.

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

>Гм... гладко излагаешь, как будто только что Пола Грэма прочитал :-) А примеры полезных приложений, построенных "снизу вверх" существуют?

Всё, что J2EE

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

>В сторону фанов лиспа: А поезд к сожалению прошел...

:) Точнее сказать ещё не пришёл. Как верно было замечено современные технологии медленно, но верно к приближаются к CL.

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

>ИМХО Рынок снова заставит обратиться к таким языкам как Лисп.

Уже. Например jelly ...или ещё какой OSworkflow

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

Еще занятно, как совпали цели проектов и выбор инструмента:

> оперативное и долгосрочное планирование

www.aiai.ed.ac.uk/~oplan/oplan/applications.html

The areas in which O-Plan has already been applied are as follows:

 ...

 * Non-Combatant Evacuation Operations
 * Crisis Response
 * Air Campaign Planning Workflow

Для скептиков: штучка эта написана на Common Lisp и какое-то время 
разрабатывалась на деньги USAF (и, наверное, не только от любопытства).

--
SVK

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

А подписки уже ... Я как-бы в другой стране :((( Какая собственно информация интересует? По предмет. области no, а по самим средстам - пожалста. З.Ы. насчет "редкой профессии" ирония неуместна, ну не довелось тебе в серьезных проектах поучаствовать, так может и к лучшему, не о чем жалеть.

bob_vk
()

а чем оно лучше например Ruby on Rails ?

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

> Какая собственно информация интересует?

Спасибо. Интересует, собственно, ФСЁ, что не секретно. Например, какая Лисп-система использовалась, хотя бы примерное описание, для каких задач софт разрабатывался, какие особо удачные/специфические архитектурные решения, которые в ходе работы возникли, ну и собственно, впечатления от самого процесса, что получилось, как хотелось, а что --- не очень.

> насчет "редкой профессии" ирония неуместна

Я не иронизирую и сожалею, если Вас это задело. Просто так называлась статья, написанная человеком действительно редкой специализации --- разработчиком компиляторов. И пределом мечтаний было бы прочесть что-то в таком вот стиле:

http://beda.stup.ac.ru/psf/ziss/wmaster/books/magazine/pcmag/9705s/05S979.htm

Думаю, это будет интересно не мне одному. Но если почтой, то пожалуйста, сюда:

(format nil "~A@~A" (map 'string #'char-downcase (reverse "naMhcneHaDBmaL")) "rambler.ru")

Заранее благодарен.

-- SVK

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

Конечно к Лиспу это имеет мало отношения, но огромное спасибо SVK за приведенную в последней мессаге статью. Как сказал один мой друг однокашник: "Я когда встретил слово YACC чуть не зарыдал =)"

Вот, тоже одна из лучших, западающая в душу статья, правда не документальная, а оформленная в виде художественного рассказа: http://bayanov.net/text-komp/history-one-byte.php

-- выпускник кафедры СПО, Одесса

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


> Вот, тоже одна из лучших, западающая в душу статья, правда не
> документальная, а оформленная в виде художественного рассказа:
> http://bayanov.net/text-komp/history-one-byte.php

Недаром мудрецы говорят, что и рай и ад находится в голове человека.
Он довел себя до такого состояния сам и даже не попытался взглянуть
на это отвлеченно, просто как на работу, которую не получилось
сделать вовремя из-за собственной непредусмотрительности и внезапного изменения требований (что часто случается и в мире неограниченной памяти и супер-быстрых машин). И, главное, с пафосом так. Нет, авралы на любой
работе случаются, но чтобы так ... Рассказ следовало бы назвать
"Как сходят с ума гребущие на каяках по океанам однокристальщики" %)


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

>Любой здравомыслящий человек взглянув на исходник Лиспа и сравнив >скажем с Джавой скажет что читается последняя горрраздо проще

есть две оценки читаемости (понятности) языков <br> по-маленькому и по-большому

В Jave и др. функциональных языках читаемость по-маленькому хорошая, но читаемость по-большому - не очень. У функциональных языков - все наоборот.

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

В Jave и др. ИМПЕРАТИВНЫХ ...

простите, заработался. :))

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

>В Jave и др. функциональных языках читаемость по-маленькому хорошая, но читаемость по-большому - не очень. У функциональных языков - все наоборот.

Может и АСМ удобочитаемый по большому.

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

2 Василий Кондратьев

Запустил такой примерчик на guile

#!/usr/bin/guile -s
!#
(define (sum n)
(if (zero? n) 1
(+ n (sum (- n 1)))))

(display (sum (string->number (cadr (command-line)))))
(newline)

И обнаружил такую непонятную константу на моей машине: 985

bash-2.05b$
bash-2.05b$ ./sum.scm 983
483637
bash-2.05b$ ./sum.scm 984
484621
bash-2.05b$ ./sum.scm 985
ERROR: Stack overflow
bash-2.05b$ ./sum.scm 986
ERROR: Stack overflow
bash-2.05b$ ./sum.scm 987
ERROR: Stack overflow
bash-2.05b$

Что бы это значило? Как обойти это ограничение?
Ведь для больших систем - это удавка, насколько я понимаю.
_______________________________________________
_SJB_

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

Китайский язык тоже нечитабелен для людей его не знающих. Читаемость --- дело привычки и опыта.

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

Дык - чем более высокие уровни абстракции допускает язык, тем потенциально он читабельнее. Java - язык для очень недалёких людей, не способных и не привычных мыслить абстракциями, и, соответственно, уровень абстрактности его - очень ограниченный.

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

(debug-options #t) чтобы посмотреть размер стека (у меня 20000). (debug-set! stack 100000) чтобы увеличить. А лучше использовать хвостовую рекурсию наверное.

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

   (define sum (lambda (n) 
                (let loop ((i n)(res 0)) 
                 (if (= i 0) 
                  res 
                  (loop (- i 1) (+ res i))))))

   (display "(sum 1000): ")
   (display (sum 1000))
   (newline)
(exit)

bash-2.05b$ guile -l sum.scm 
(sum 1000): 500500
bash-2.05b$ 

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

>Ну да, ведь только хвостовая оптимизируется.
>
> hbee * (*) (26.01.2005 11:03:21)

А где про это можно почитать?

_SJB_

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

ну ты зверь, человека сразу с шашкой на голо на танки посылать :)

пусть ищет tail recursion optimization в гугле.

guile - это scheme ? в scheme по стандарту должна быть такая оптимизация, а если стандарт не поддерживает, то тады ой :)

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

2 tigra,hbee

Извиняюсь за свою необразованность, но почему
размер стека задаётся статически до начала работы?
Почему бы не сделать его динамическим, чтобы избежать
рантайм error? Вопросы оптимизации можно оставить на потом,
лишь бы программа проще была.

_SJB_

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

Тут уже не оптимизация, когда перерасход памяти (при очень глубокой рекурсии) становится заметной долей всей используемой памяти - это уже вопрос выживания :-) Динамический стек - другая философия программирования (см. Forth).

hbee ★★★★
()
Ответ на: комментарий от Moridin

боржоми пил? кде заработает. проги для кде от тхирдпати не заработают.

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

2 hbee

А тогда есть ли средства типа try {}
в guile и newLisp, чтобы программа не падала (error)
а продолжала работу в этом случае (с обработкой ошибок)?

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

Любая Scheme поддерживает call-with-current-continuation, каковой суть есть куда как бОльший рулез, чем всякие там try... catch...

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

Получай (правда, это Scheme):

(define (push stack item) (cons item stack))
(define (top stack) (car stack))
(define (pop stack) (cdr stack))

(define trystack '())

(define-macro (try guarded catchfilter)
  `(let ((result (call-with-current-continuation 
                  (lambda (guardblock) 
                    (set! trystack (push trystack guardblock)) ; Запомним обработчик исключений в стеке обработчиков
                    ,guarded ; Защищяемый код
                    (set! trystack (pop trystack)) ; Снимем со стека обработчик исключений
                    (guardblock #f))))) ; (*) Все ОК, передаем обработчику исключений #f - нет ошибки
     (,catchfilter result))) ; Вызовем обработчик исключения с результатом call/cc,
                             ; это либо нормальный выход в строчке (*), либо выброс исключения (**)

(define-macro (catch exc catchbody)
  `(lambda (,exc) ; Обработчик исключения - просто функция с одним параметром, исключением
     (cond (,exc ,catchbody)))) ; Пропускаем, если #f (нет ошибки)

(define-macro (throw exception)
  `(let ((catchblock (top trystack))) ; Возьмем обработчик с вершины стека обработчиков
     (set! trystack (pop trystack)) ; Снимем его с вершины
     (catchblock ,exception))) ; (**) Вызовем обработчик, передавая исключение в качестве параметра

Использование:

(try (begin 
       (display "Before")
       (throw 10)
       (display "After"))
     (catch x (begin 
                (display "Exception: ")
                (display x))))

Это моя самая первая программа на Scheme (если, конечно, не считать всякие (+ 10 20)), поэтому воспринимать соответственно.

Проблем куча:

1. не поддерживается finally
2. не поддерживается несколько catch-фильтров на один try
2. макросы не "гигиеничны"
3. макросы "старые" (legacy)
4. макросы с побочными эффектами (catch, два раза exc вычисляется)
5. не работает (скорее всего) в нескольких потоках
6. catch обрабатывает все исключения (а надо: если не обработал
(обработчик вернул #f), то вызвать следующий обработчик)

Пункт 6 делается через хвостовую рекурсию в макросе throw, но лень.

Но думаю как первая программа за 30 минут - пойдет. :) 

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