LINUX.ORG.RU

Приходилось ли вам писать на Лиспе?


2

2

Ну, что ж, в Development так в Development, хотя Лисп давно перестал быть мемом одного лишь Development'а (и даже одного ЛОРа). Итак, сабж!

[ ] Да, профессионально и за деньги
[ ] Да, just for fun и для самообразования
[ ] Да, участвовал в opensource-проекте
[ ] Да, пилил скрипты Emacs/GIMP/AutoCAD/Lilypond etc.
[ ] Да, в рамках образовательной работы (лаба, курсовик, диплом)
[ ] Да, в рамках академической работы (диссертация, статья, монография)
[ ] Да, мне сказали, что лисперов любят девушки
[ ] Нет, но собираюсь
[ ] Нет, и не собираюсь
[ ] Вообще-то я Джон МакКарти, а вы кто такие?
[ ] в Советской России Лисп пишет на тебе!

Приветствуются развернутые ответы и верифицируемые пруфлинки. Например, на какую фирму работали, в каком конкретно opensource-проекте участвовали, какая была тема научной работы, помогло ли с девушками, и тому подобное. INB4 буквоедов: под «лиспом» подразумеваются все языки семейства: Scheme, CL, Clojure и прочие.

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

так и думал.

да зафига? Есть же уже какие-то. но это не нужно, уже есть emacs. был бы человечный ruby <--> elisp транслятор, а они уже есть на самом деле - но не человечные

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

> На чём вы думаете написан SBCL, компилирующий код в машинные кода и модифицирующий образ непосредственно во время исполнения?

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

Обоснования какие-либо будут?

это тебе нужно обосновывать

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

>Интересно и как же выглядит модифицирование образа во время выполнения на лиспе? Именно модифицирование самого себя в виде бинарника, а не модифицирование скрипта, который интерпретируем.
Google://REPL

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

Написать web-сервер, печатающий hello на лиспе настолько сложно, что все дают ссылки на чужие реализации. А самому слабо сделать и запостить в этот тред?

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

А я браузер могут написать на sh

#!/bin/sh
firefox

Может ли Лисп так кратко написать браузер? Интересно сравнить скорость написания браузера на Лиспе по сравнению со скоростью написания браузера на sh. И число строк подсчитать.

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

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

Вот что самое удивительное, критики лиспа не знают и не понимают таких базовых для лиспа вещей. Грош вашей критике цена.

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

Вот что я говорил? Один неадекватный анонимус точно есть.

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

Уже неоднократно здесь замечалось, что все не лисперы - дебилы, потому что если бы не были дебилами, писали бы на Лиспе. Эта простая мысль непонятна только идиотам.

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

> Именно модифицирование самого себя в виде бинарника, а не

модифицирование скрипта, который интерпретируем.


Так вы даже не знаете, что ведущие реализации Common Lisp это именно компиляторы в реальный машинный код, а не интерпретаторы? А SBCL так любое выражения введённое REPL сначала компилрует, а только потом выполняет? (его можно специально попросить работать в режиме интерпретации, но по умолчанию всё компилится).

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

> Создатели апачей и nginx будут учит Лисп в перерывах между запоями от осознания собственной неполноценности.

Сознавать собственную неполноценность только из-за того, что им никто не показал Лисп могут только анонимусы ;)

naryl ★★★★★
()

Не расслабляемся, господа! До тысячного комментария уже чуть-чуть осталось.

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

Чего и? Он исполняемый образ модифицирует?

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

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

> Она PID регулятор реализует?
Не совсем PID регулятор, там алгоритм несколько более замороченный. Основная цель - сделать так, чтобы в итоге процесс колебаний управляющего напряжения сходился к константе и тем самым спираль нагревателя оказывалась бы при почти постоянной температуре - это положительно влияет на срок её службы. Я, честно говоря, не знаю, обладает ли ПИД регулирование таким свойством, мне кажется, что там должны возникнуть незатухающие колебания, хотя я не знаю. У меня управляющий сигнал имеет прямоугольную форму и переключается по переходу температуры через порог. Меняются уровни «полок» этого прямоугольника и пороги температуры.

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

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

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

Можно я, можно я?

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

Думаю в CL так же

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

Ага, если я модифицирую свои структуры данных, то очевидно, что я модифицирую свою память. Ну и сдампить её в виде отдельного файла тривиально. Где тут низкий уровень то? Такую задачу можно и на вижуал бесике решить.

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

>Решаемые задачи - работа с СУБД...

Также сделал один законченный патч для iterate...


Скрестить ужа с ежом^W^W^W iterate с CLSQL не пробовал? В последнем хачят loop. Или это так «прозрачно», что дополнительно ничего делать не надо? Я просто близко не смотрел iterate и давно не трогал CLSQL

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

А на вижуалвасике можно потом с этого дампа восстановить состояние программы и дальше с ней работать?

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

Костылями, и то не во всех случаях.

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

> А самому слабо сделать и запостить в этот тред?
А зачем делать то, что уже сделано? У меня лично нет NIH синдрома.

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

> В последнем хачят loop.
Хачить loop - это не тема. Я пользуюсь ap5, где тоже «прохачен» loop. Чтобы совместить оба проекта в одном образе, нужно будет из двух хаков придётся собирать один, либо выбирать, какой тебе дороже, либо писать a5:loop в одних случаях и clsql:loop в других. Всё это - уродство, ведь iterate позволяет решить это простым, документированным и стандартизированным способом.

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

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

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

Очень опасное и нелепое поведение для якобы «промышленного» языка.

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

Конкретная проблема с iterate - он экспортирует символ collect и тем самым конфликтует с alexandria или cl-utilities (не помню). И ещё множество символов,которые могут вызвать проблемы из-за своей общеупотребимости. Мой патч состит всего лишь в том, чтобы вместо collect можно было писать :collect. В итоге, я не use-аю iterate, а импортирую из него пару-тройку символов (iter, dsetq и keywordize).

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

> Чего и? Он исполняемый образ модифицирует? Если нет, то это не низкий уровень.

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

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

Это к archimag. Но у него похоже свое понятие низкого уровня. Для меня это программирование близкое к машинным кодам, исполняемым на процессоре.

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

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

>Хачить loop - это не тема.

кто-бы спорил...

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

> Где тут низкий уровень то? Такую задачу можно и на вижуал бесике решить.

Ты не можешь на вижуал васике переопределить функцию, так, что все ранее скомпилированные функции, которые на неё ссылаются, стали бы использовать новую версию.

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

> Так лисп потому и тормоз такой, что все вызовы функций косвенные.
Во-первых, лисп - не такой уж и тормоз, см. шутаут. Питон, руби, перл отдыхают имеют 10-30 кратное отставание по скорости от лиспа, хотя их программы нельзя менять в рантайме (можно, но в меньшей степени). Работает лисп примерно со скоростью серверной Java. Во-вторых, вызовы функций косвенные, только если ты не оптимизируешь по скорости. Когда оптимизируешь - они могут быть заменены на прямые и тогда функцию нельзя будет переопределить на лету. Хотя это зависит от реализации. Судя по результатам на шутауте, SBCL это делает. В-третьих, есть inline. В-четвёртых, есть способ сделать так, чтобы вызовы были прямые, а при этом функцию можно было переопределить. Для этого нужно хранить who-calls граф. Возможно, и это где-то сделано.

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

> Тогда привводите и C# вместе System.Xml. Это ведь тоже кто-то писал!

System.* есть из коробки. Даже в mono есть.

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

> Ну я больше твоего успел сделать. Хочешь, верь, хочешь - нет.

Да, верим, верим. Комментарии: 5504. Очевидно, на что либо другое времени и не хватало вовсе.

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

В чём разница между уже написанной библиотекой из коробки и уже написанной библиотекой не из коробки? Вы сравниваете языки или их stdlib'ы? Второе сравнивать бессмысленно. stdlib'а Common Lisp не содержит почти ничего, NIH'нутая stdlib'а .NET содержит почти всё.

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

> stdlib'а Common Lisp не содержит почти ничего,

Вот и ответ на вопрос о том, нужен ли Лисп. Не содержит ничего, ничего не умеет, на фиг не нужен. Спасибо, поржал.

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

> Для меня это программирование близкое к машинным кодам,

исполняемым на процессоре.


Я вижу вас это загоняет в полный ступор и видимо мозг отказывается понимать. Ещё раз: SBCL, который написан на Common Lisp, принимает кусок кода, компилирует его в машинный код и модифицирует память процесса так, что это сгенерённый машинный код начинает исполняться на процессоре. Это достаточно низкий уровень? Я говорю, не про свой код, который SBCL транслирует в машинный, а про код SBCL. Код SBCL, который делает всё это, он работает на достаточно низком уровне?

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

> это не низкоуровневое программирование
Вам шашечки или ехать?
В лиспе можно написать большую программу, которая безопасна, работает достаточно быстро и которую при этом можно менять в рантайме, не перезапуская её. Причём, менять можно в очень широких пределах:
- менять сигнатуру и тело функции
- менять набор полей класса (изменение отражается на существующих экземплярах)
- менять поведение классов, добавляя и удаляя методы
- добавлять и исполнять тесты
- перезагружать целые модули (правда, тут есть оговорки)
- видеть и менять в отладчике стек и любые переменные
- во многих случаях, можно исправить ошибку и повторить неудавшееся действие, приведшее к исключению. Для реализации этой возможности не нужно программирования или нужен минимум программирования. Например, исключение при открытии файла по умолчанию падает в дебаггер и даёт возможность повторной попытки.

В ходе разработки большой программы все эти вещи критично важны для производительности труда. Если всё написать на С, то программа будет работать, скажем, в 5 раз быстрее, но цикл внесения изменения будет в 10 раз длиннее. Именно поэтому лисп как раз и является промышленным языком.

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

>Common Lisp не содержит почти ничего

Ну если можно пользоваться всем, что есть вокруг, то самый мощный язык не Лисп, а sh. На нём можно за секунды написать браузеры, офисы, вебсерверы и даже Лисп можно написать на sh.

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

>System.* есть из коробки. Даже в mono есть.

Меня тоже поначалу разочаровывало отсутствие в различных лиспах набора «батареек изкаропки», особенно после шапочного знакомства с питоном. Но это очень быстро прошло. Многие библиотеки развиваются довольно активно, и просто предлагать «разрабу» библиотеку версии Х - это оказывать ему медвежью услугу. В конце концов - это средство для разработчиков, а не для «домохозяек». Посему в комплекте с лиспами часто идёт только набор библиотек, очень сильно завязанных на данную реализацию. За остальным - на c-l.net

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

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

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

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

Пример: IDE (Integrated Development Environment).

Пример 2: любое веб-приложение

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