LINUX.ORG.RU

Какую реализацию Lisp учить?


0

0

Доброго времени суток. Вот выдалось свободное время и по присутсвии оного, решил взяться за Lisp, но оказалось что существует давольно много реализаций сего чуда: Сommon Lisp, Scheme, Arc, Clojure и т.д. Прошу вашего совета за какой взяться?
Спасибо.



Последнее исправление: shk (всего исправлений: 1)

Ответ на: комментарий от dmitry_vk

>Треды в clisp'е есть (начиная с 2.48)

там они ещё experimantal, и с того момента слишком много было исправлений с ними связанными... Так-что для использования лучше таки подождать 2.49 :)

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

>видимо для рестартов, не?

Вы путаете курицу и яйцо. Рестарты нужны для дебаггера, а не наоборот. Рестарты и компилятор не зависят друг от друга.

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

> Ты удивишься, скольким людям оно не нужно, толстый анонимус :)

Зачем тогда спрашиваешь? иди дальше лабай на «лучших» современных язычках.

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

>«Захапанная» память фактически не используется

И в какой же момент запустится gc? Когда будет использована вся захапанная память?

Компилятор нужен, т.к. ряд техник программирования...

Что же это за техники такие? eval?

В дополнение, компилятор + дебаггер позволяют дописывать и обновлять систему без перезапуска.

Забыл дописать: «в теории». На практике придется сильно обломаться, особенно при использовании CLOS: в приложении будут жить экземпляры «старых» и «новых» классов. Это может к таким фантастическим эффектам приводить, что лучше перезапуститься.

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

>на винде хорошо работают:

ну у каждого свои «[не]хорошо» :)

ecl/mingw


последний релиз собирается с тредами без бубна? с кодировками (консоль, dir, текущий/рабочий каталог, прочее) всё в порядке?

abcl


MOP?

clisp(в т.ч. с мультитредингом)


треды не доделаны

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

>видимо для рестартов, не?

Зачем? setjmp/longjmp в C работают безо всякого встраивания компилятора в бинарник. А это по сути своей те же самые рестарты.

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

> Забыл дописать: «в теории». На практике придется сильно обломаться, особенно при использовании CLOS: в приложении будут жить экземпляры «старых» и «новых» классов. Это может к таким фантастическим эффектам приводить, что лучше перезапуститься.

Ты забыл добавить - IMHO.

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

> Зачем? setjmp/longjmp в C работают безо всякого встраивания компилятора в бинарник. А это по сути своей те же самые рестарты.

т.е. они позволяют скомпилировать и выполнить любой введенный пользователем текст кода на С?

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

>Ты забыл добавить - IMHO.

Нет, это ты забыл уточнить, что твое знакомство с лиспом ограничивается толстым троллингом. Ты либо тролль, либо искренне никогда не пользовался CLOS'ом. Радуйся, что ты аноним и не можешь быть заклеймлен позором.

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

Для тебя полторы штуки - такие большие деньги?

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

Погодите, погодите. Да, функции компилятся в нативный код, с этим я не спорю. Но получаемые нативные бинарники: это весь лисп + ваш образ... Я не совсем это имею ввиду.

satanic-mechanic
()
Ответ на: комментарий от korvin_

>т.е. они позволяют скомпилировать и выполнить любой введенный пользователем текст кода на С?

Вообще-то use/store value не в каждом рестарте присутствует. Более того, сишное приложение с ошибкой такого рода просто не скомпилируется. Статические проверки кода, понимаешь.

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

> Радуйся, что ты аноним и не можешь быть заклеймлен позором.

ой-ёй-ёй, я так испуган.

Ты всего лишь тролль, который лезет в топик про лисп и начинает троллитьо том чего не знает.

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

>Я не совсем это имею ввиду.

Ну а чего ты хотел от языка, у которого в стандартной библиотеке есть compile-function и load? В той же java компилятор тоже есть, но он в рантайме, а рантайм лежит в сторонке. Здесь же просто рантайм запихивают в бинарник.

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

Серьезно в сторону оптимизации не копал, так как редко нужна реальная производительность на уровне Java.

Но за ссылку спасибо, вопрос все же интересен и достоен внимания. Попробую покопать сам. Тем более за полгода много чего изменилось в Clojure, в том числе и по поводу возможностей оптимизации. Так что попробую и попробую довести.

А вообще, с такой легкой интеграцией с Java можно некоторые части приложения без проблем и на ней писать.

satanic-mechanic
()
Ответ на: комментарий от linuxfan

Я об этом и говорю. Такой же фокус и с java сделать особых проблем не должно составлять. С небольшой разницей в том, что нативный код будет получаться в рантайме. А внешне это будет такой же «нативный» бинарник.

satanic-mechanic
()
Ответ на: комментарий от linuxfan

> Ты либо тролль, либо искренне никогда не пользовался CLOS'ом

Я активно пользуюсь CLOS'ом, и активно пользуюсь как компилятором, так порой и дебагером на боевых серверах. И почти никогда их не перезапускаю, предпочитая обновлять код «на живую». Это потрясающе удобно. Если бы вы имели реальный опыт использования CL, то почти наверняка тоже так считали бы. Вот и возникает вопрос: а кто здесь тролль?

archimag ★★★
()
Ответ на: комментарий от satanic-mechanic

>С небольшой разницей в том, что нативный код будет получаться в рантайме.

Ты, наверное, хотел сказать: «С той только разницей, что нативного кода я никогда не увижу»? Java не генерирует нативный код. Маркетоидный JIT _может_ производить некоторые трансляции, но производительности .NET'а жабе не достичь.

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

> Вообще-то use/store value не в каждом рестарте присутствует.

эт я знаю, но ведь во многих присутствуют + никто не мешает для своего кода написать и юзать свои рестарты

Более того, сишное приложение с ошибкой такого рода просто не скомпилируется. Статические проверки кода, понимаешь.

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

korvin_ ★★★★★
()
Ответ на: комментарий от satanic-mechanic

>А вообще, с такой легкой интеграцией с Java можно некоторые части приложения без проблем и на ней писать.

Да не вопрос! Просто говорить о том, что clojure _может_ генерить код, по скорости приближающийся к java - это значит оставить «за кадром» очень, очень много «тонкостей». А вот о том, что без оптимизации и типизации clojure может порождать тормоз до чуть-ли не до 2-х десятичный порядков по сравнению с java - об этом что-то все стараются умалчивать. Зачем? У языка много «плюшек», чтобы стыдливо пытаться прикрыть фиговым листком имеющиеся (возможно - пока) проблемы со скоростью.

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

>Если бы вы имели реальный опыт использования CL

Пытался заюзать cl-xmpp и в какой-то момент переопределил метод у класса с уже существующим экземпляром. Думаешь, в существующем экземпляре что-то поменялось? Нет. Пришлось создавать новый экземпляр класса, т. к. старый вызывал старый метод.

Слова «боевые сервера на лиспе» вызывают у меня скепсис несколько иного рода. Особенно в контексте «запускаю дебаггер». Это такой эксклюзивный сервер для локалхоста с одним-единственным клиентом?

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

Лисперы такие лисперы. Умудряются в лиспосраче одновременно гнать про «лисп такой простой что не знать его может только идиот», и на каждого с ними несогласного наезжать что он мол «ничего не знает».

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

>эт я знаю, но ведь во многих присутствуют + никто не мешает для своего кода написать и юзать свои рестарты

Точно также и в сишке никто не мешает написать свои рестарты, благо все средства для этого есть.

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

Вообще-то именно эта проверка на 100% убирает ваши use-value. undefined symbol — это ведь аналог необъявленной переменной в C.

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

А зачем мне видеть нативный код?

Java генерирует нативный код, но не для всего и вся.

Не знаю, что вы понимаете под «производит некоторые трансляции»? Если то, что она пытается оценить (вопрос насколько успешно), где узкие места и сгенерировать нативный код, то да, соглашусь.

Не знаю о сравнениях производительности .NET (так как он уж совсем не интересен) и JVM (тоже особо неинтересна была до недавнего времени). Ткните пальцем, пожалуйста.

satanic-mechanic
()
Ответ на: комментарий от linuxfan

> Вообще-то именно эта проверка на 100% убирает ваши use-value. undefined symbol — это ведь аналог необъявленной переменной в C.

не совсем понял о чем Вы? при чем тут неопределенные переменные?

korvin_ ★★★★★
()
Ответ на: комментарий от satanic-mechanic

>Java генерирует нативный код

javac не генерирует. Рантайм _может_ отдельные фрагменты байткода компилировать в машинный код целевой системы, но это все полная фигня, пригодная разве что для оптимизации холостых циклов.

Не знаю о сравнениях производительности .NET

У .NET и JVM разные принципы работы: JVM интерпретирует байткод, .NET-овская vm компилирует байткод в нативный код и затем выполняет.

linuxfan
()
Ответ на: комментарий от satanic-mechanic

>Не знаю о сравнениях производительности .NET (так как он уж совсем не интересен)

во-во, гораздо интереснее сравнение производительности JVM c mono =)

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

Да погодите. Как-раз таки некоторые CL'щики начали о производительности, мне этот вопрос не жизненно важен, хоть порой он и встает «в полный рост».

Так вот, Хики утверждает, что при должной помощи может... И он постоянно над этим работает. Конечно Хики является лицом заинтересованным, но вообще кажется достаточно адекватным человеком. Разумеется достижение производительности означает использование типизации, мутабельности и так далее... Да в конце концов использование родных java'вских контейнеров и т.п. И в самом последнем случае, остается возможность написать критические части на самой Java или C.

А то, что без всяких оптимизаций clojure будет куда менее, ИМХО понятно каждому.

satanic-mechanic
()
Ответ на: комментарий от linuxfan

> Пытался заюзать cl-xmpp и в какой-то момент переопределил метод у

класса с уже существующим экземпляром. Думаешь, в существующем

экземпляре что-то поменялось? Нет. Пришлось создавать новый экземпляр


класса, т. к. старый вызывал старый метод.



Издеваетесь? Это абсолютно полный бред. Я не знаю, что вы там делали, но только методы не принадлежат классу или объекту и никакой разницы старый это объект или нет просто не существует.

Это такой эксклюзивный сервер для локалхоста с

одним-единственным клиентом?



Очень смешно, смайл забыли поставить.

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

>при чем тут неопределенные переменные?

А когда нам еще предлагают использовать значение?

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

>> У .NET и JVM разные принципы работы: JVM интерпретирует байткод, .NET-овская vm компилирует байткод в нативный код и затем выполняет.

JVM тоже компилит в нативный код и если мне память не изменяет, то это можно «заоптимизировать» настолько, что JIT будет делать это при первом же обращении к байткоду.

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

> У .NET и JVM разные принципы работы: JVM интерпретирует байткод, .NET-овская vm компилирует байткод в нативный код и затем выполняет.

Ну и какая разница? У .NET компиляция тормозит загрузку приложения, у JVM она размазывается на первые секунды его работы. В результате всё равно исполнятся будет нативный код.

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

>пригодная разве что для оптимизации холостых циклов.

ну было же уже на ЛОРе - виртуальные (или интерфейсные - точно не помню) вызовы одного единственного класса (других в коде не было) не просто «джитились», а «перегонялись» в статику, в результате только на вызовах метода (да, тест совершенно синтетический) jvm экономила столько, что «уделывала» плюсатый «аналог в лоб». Тест не показательный, но я бы не говорил, что «это все полная фигня, пригодная разве что для оптимизации холостых циклов».

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

>Забыл дописать: «в теории».

И в теории, и на практике. Когда пишу код, постоянно обновляю определения классов, методов, функций и прочего.

Если вы не знаете, то при обновлении определения класса все его инстансы также обновляются. Так что бред про «старые и новые классы» можете оставить в сторонке.

И в какой же момент запустится gc? Когда будет использована вся захапанная память?

Нет, gc запускается чаще. Имеется в виду, что память аллокейтится, но не используется, поэтому менеджере виртуальной памяти в ОСи не выделяет страницы памяти.

ну у каждого свои «[не]хорошо» :)

Покажите «нехорошо» для Clozure.

В той же java компилятор тоже есть, но он в рантайме, а рантайм лежит в сторонке. Здесь же просто рантайм запихивают в бинарник.

Ну в таком случае в лиспе рантайм лежит в сторонке, а код приложения - в сторонке. Фактически, .fasl и .class — это похожие вещи.

Пытался заюзать cl-xmpp и в какой-то момент переопределил метод у класса с уже существующим экземпляром. Думаешь, в существующем экземпляре что-то поменялось? Нет. Пришлось создавать новый экземпляр класса, т. к. старый вызывал старый метод.

Этим высказыванием вы показываете, что совершенно не знаете лисп. Методов у класса нет. Переопределение/доопределение методов для обобщенных функций прекрасно работает во всех реализациях лиспа и является очень удобным в разработке.

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

> javac не генерирует. Рантайм _может_ отдельные фрагменты байткода компилировать в машинный код целевой системы

Я нигде не говорил, что javac генерирует. А вот рантайм, если иметь ввиду HotSpot -server может компилировать и может это делать довольно агрессивно.

У .NET и JVM разные принципы работы: JVM интерпретирует байткод, .NET-овская vm компилирует байткод в нативный код и затем выполняет.

Опять же, JVM может на ходу немалое количество этого самого байткода скомпилировать в нативный. При исопользовании довольно большого кэша и воспоминаниях о принципе Парето можно покрыть почти все критические части. В случае .NET более приличный оверхед должен получается при старте приложения, но в целом виртуальная машина будет проще, что ИМХО правильно.

satanic-mechanic
()
Ответ на: комментарий от archimag

Издеваетесь? Это абсолютно полный бред. Я не знаю, что вы там делали, но только методы не принадлежат классу или объекту и никакой разницы старый это объект или нет просто не существует.

я думаю речь в данном случае не о методах, а о слотах.

кстати, разве CLOS не позволяет настроить поведение системы при смене класса? ну там указать процедуру копирования данных старых слотов в новые при смене класса живого объекта?

хотя конечно можно и просто процедуру или макрос написать, типа

(change-class obj 'class-1 'class-2
  (class-1-slot-1 class-2-slot-1)
  (class-1-slot-2 class-2-slot-2)
  ...)

а скорее всего что-то такое уже есть готовое в CLOS

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

а, черт, поспешил. ну теперь я тоже знаю как дело обстоит =)

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

>кстати, разве CLOS не позволяет настроить поведение системы при смене класса? ну там указать процедуру копирования данных старых слотов в новые при смене класса живого объекта?

Для этого есть протокол (ре-)инициализации в CLOS (lispnik недавно перевел статью про него: http://lispnik.livejournal.com/242522.html).

По умолчанию старые слоты копируются, а для новых слотов вызывается initform. При этом объекты сохраняют свою идентичность.

А change-class — это функция в CLOS, которая меняет тип объекта, ее писать не надо, она уже есть.

dmitry_vk ★★★
()
Ответ на: комментарий от satanic-mechanic

>Так вот, Хики утверждает, что при должной помощи может...

угу, в некоторых условиях. А в иных - не может =)

Конечно Хики является лицом заинтересованным, но вообще кажется достаточно адекватным человеком.


не спорю. Он так иногда и говорит: «Ну перепишите этот кусок на Java и отстаньте» =)

И в самом последнем случае, остается возможность написать критические части на самой Java или C.


Так, блин, и для питона (не к ночи будь помянут) можно писать критические части на С. Но при этом ни кто не говорит, что оный приближается по скорости к С =)

А то, что без всяких оптимизаций clojure будет куда менее, ИМХО понятно каждому.


Даже со всеми оптимизациями clojure _может_ очень сильно отстать от java. Как full-OO-C++ от pure-C. Вот только в отличии от этой связки, на clojure нельзя писать pure-Java код :)

Ладно, устал «брюзжать и брызгать слюной». Все мои претензии - в общем случае нельзя говорить, что код на clojure по скорости приближается к Java. Даже со всеми типизациями и оптимизациями - может приблизится, а может и нет :)

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

>Покажите «нехорошо» для Clozure.

я уже писал - не могу, ибо давно не ковырял :)

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

> Все мои претензии - в общем случае нельзя говорить, что код на clojure по скорости приближается к Java.

Я и не говорил, что всегда. Хотя в уверенности своей может и перегнул палку. Соглашусь с вами, не нужно больше «брюзжать».

satanic-mechanic
()

Лисп лучше не учить. А если учить, то CL. Если использовать(а лучше его не использовать) - Clojure.

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

Просто на данный момент им никто заниматься не хочет.

да занимаются им - Тарвер с Шапиро на пару занялись

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

>Пытался заюзать cl-xmpp и в какой-то момент переопределил метод у класса с уже существующим экземпляром. Думаешь, в существующем экземпляре что-то поменялось? Нет. Пришлось создавать новый экземпляр класса, т. к. старый вызывал старый метод.

Э-э-э, дружище. Ты что-то не то пишешь. Для удаления метода по конкретным спецификаторам и квалификаторам в рантайм есть remove-method. То есть, если ты сперва добавил методод my:generic-fn :before, который специфицирован для объектов класса my:foo, например, а потом он тебе стал не нужен, то ты его можешь удалить. Для этого уже нужные ручки могут быть в IDE. А без ручек это может выглядеть вот так, например:

(remove-method #'my:generic-fn (find-method #'my:generic-fn '(:before) (mapcar #'find-class '(my:foo))))

Если хочешь удалить дженерик, то

(fmakunbound ...)

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

>> Покажите «нехорошо» для Clozure.

Да, тоже интересно.


Ну вот то, что остановило все мои попытки поковырять его ещё раз: SSE2 - мой Athlon XP 2600+ «пролетает как фанера над Парижем» :(

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