LINUX.ORG.RU

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


2

2

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

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

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

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

«модифицирует память процесса» это очень громкие слова, на самом деле происходит подмена указателя на функцию. Кстати очень интересно увидеть на lisp'е функцию, которая на входе принимает строку с машинным кодом и исполняет её. Именно чтоб на lisp'е было, без оберток над Си'шными вызовами.

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

> Пример приведите, где нужно такое поведение от программ

с самомодификацей кода.


Для начала простое горячее обновление кода.

Потом, например, cl-ppcre, которая транслирует регулярные выражения в lamda, те, в свою очередь, компилятся в машинный код. Как результат - на многих тестах cl-ppcre делает по производительности регулярные выражения Perl, которые написаны на высоко-оптимизированном C.

Другой пример, моя cl-closure-template - во-время исполнения компилирует шаблоны в натуральный машинный код, с соответствующей скоростью исполнения, что является весьма критичным для веб.

Продолжать?

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

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

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

> на самом деле происходит подмена указателя на функцию

Чего? Надо сгенерить машинный код, куда-то его поместить, передать на него управление. Какой ещё указатель на функцию?

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

>Потом, например, cl-ppcre, которая транслирует регулярные выражения в lamda, те, в свою очередь, компилятся в машинный код.

cl-ppcre, вроде, не вызывает compile для компиляции кода, а взгромождает лямбды друг на друга. В нем ускорение достигается также за счет compiler-macro, который константные регулярные выражения оборачивает в load-time-value, чтобы они компилировались только один раз, в начале работы приложения, а не при каждом обращении.

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

> Пример приведите, где нужно такое поведение от программ с самомодификацей кода.

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

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

Когда лисперам показывают то же самое на JSP или даже сервлетах, они уползают в унынии.

lisprocks
()

Ура, работает:

(defun test-func () (interactive) 
  (relisp-start-slave)
  (ruby-eval "def msg(text);return text; end")
  (message (ruby-eval "msg('This text will showen in mini-buffer')"))
)
ciss
()
Ответ на: комментарий от den73

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

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

Понадобится скорее снять кривую температуры после ступеньки в управляющем напряжении и по ней посчитать импульсную переходную системы. По ней можно моделировать поведение печи (просто считать свертку) на управляющие воздействия. Ну и соответственно решать оптимизационную задачу.

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

Я не разработчик компиляторов, что у вас вызывает сомнение?

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

> Когда лисперам показывают то же самое на JSP или даже сервлетах, они уползают в унынии.

Ну покажите, как происходит «горячее» обновление кода на JSP/сервлетах/ASP.NET. Сеансы пользователей вместе с данными теряются; сильно ощутимые задержки при запросах сразу после обновления (которые могут достигать нескольких минут, пока сервер все «переварит»).

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

>Именно чтоб на lisp'е было, без оберток над Си'шными вызовами.

Что есть «обертка над Си'шными вызовами»? В каждой реализации есть FFI. С ним сделать то что ты просишь - элементарно.

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

cl-ppcre, вроде, не вызывает compile для компиляции кода

А это, как бы и не надо, насколько я понимаю. Компилировать или нет это на совести реализации, SBCL компилит (по крайней мере, по умолчанию)

CL-USER> (compiled-function-p (lambda () (print "Hello")))
T

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

> В каждой реализации есть FFI. С ним сделать то что ты просишь - элементарно.

Тогда мы получим, что дергаем нечто инородное для выполнения низкоуровневых вещей и опять приходим к противоречию.

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

> Тогда мы получим, что дергаем нечто инородное для выполнения низкоуровневых вещей

Давайте сначала.

Задача: Выполнить произвольный машинный код.
Решение: FFI.

Что-то не так? Где здесь что-то инородное для достижения поставленной задачи?

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

> Тогда мы получим, что дергаем нечто инородное для выполнения низкоуровневых вещей и опять приходим к противоречию.

но ведь обратное возражение, что каждая достаточно сложная программа на низкоуровневом языке содержит в себе реализацию лиспа (плохонькую и кривую на реализацию) --- просто классика жанра в лиспос%%;х

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

> Тогда мы получим, что дергаем нечто инородное для выполнения

низкоуровневых вещей и опять приходим к противоречию.


Любой код, который так или иначе обращается к коду ядра в итоге обращается к С и мы снова получаем неполноценность? Т.е. абсолютно любой код, даже если его написать непосредственно в машинных кодах всё равно на платформе Linux будет в итоге обращаться к коду на С (вот же удивительно!) и будет считаться неполноценным? Т.е. даже непосредственно программирование в машинных кодах является недостаточно низкоуровневым, ибо всё равно обращается к более низкоуровневому коду на С?

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

>Тогда мы получим, что дергаем нечто инородное для выполнения низкоуровневых вещей и опять приходим к противоречию.

Что значит «инородное»? И потом: cтандарт не заставляет «открывать» внутреннее устройство - может в том-же SBCL «прямой доступ» к «кишкам» и есть - кому он нужен?

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

Тогда мы получим, что дергаем нечто инородное для выполнения низкоуровневых вещей и опять приходим к противоречию.

Трамплин для перехода на уровень операционной системы есть в любом ЯВУ, ибо с системой (сисколлы, функции динамических библиотек) же как-то общаться надо. Это не нечто инородное, это часть рантайма языка.

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

> возражение, что каждая достаточно сложная программа на низкоуровневом языке содержит в себе реализацию лиспа (плохонькую и кривую на реализацию) --- просто классика лисп-троллинга

fxd :)

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

Нахрена писать что-то на ассемблере или в машкодах если можно написать на высокоуровневом языке, который в эти самые машкоды все-равно транслируется?

(defparameter *code* '(lambda (a b)
                        (declare (type fixnum a b)
                                 (optimize (speed  3)
                                           (space  0)
                                           (safety 0)
                                           (debug  0)))
                        (the fixnum (+ a b))))

(defparameter *function* (compile nil *code*))

(disassemble *function*)

; disassembly for (LAMBDA (A B))
; 23CAF3AA:       01FA             ADD EDX, EDI               ; no-arg-parsing entry point
;       AC:       8BE5             MOV ESP, EBP
;       AE:       F8               CLC
;       AF:       5D               POP EBP
;       B0:       C3               RET

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

> Пример приведите, где нужно такое поведение от программ с самомодификацей кода

У меня есть конвертер баз данных, который работает примерно 3 часа. Из них примерно час идёт часть, вызываемая из лиспа. Чужие базы данных - это вещь, в которых часто бывает полный бардак. И процесс работает-работает, потом натыкается на ситуацию, которая раньше никогда не встречалась. Если диагностика написана хорошо, в этом месте он останавливается. В другом языке я был бы вынужден либо перезапускать всё, либо специально разрабатывать архитектуру, позволяющую исправить ошибку по ходу и продолжить. В лиспе это получается практически даром.
Во многих (не во всех) случаях мне удаётся исправить проблему и продолжить выполнение конвертора. Правда, здесь помогает и то, что сам SQL сервер - это динамичная среда, хотя он и не компилирует в нативный код.

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

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

А что, в C можно сгенерировать машинный код и передать на него управление? Я знаю, что в tcc можно, но это - далеко не самая популярная реализация C. В gcc можно?

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

> Проблема в том, что языки отличные от Си

не претендуют на низкоуровневость.


Так в чём проблема? И у кого она?

Кстати: http://common-lisp.net/project/movitz/movitz.html - может быть это вы сочтёте достаточно низкоуровневым?

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

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

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

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

В Лиспе тоже.

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

> Таки кто такой Гринспун, и кто такой tailgunner? =]]]

Оба тролли.

факт

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

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

не претендуют, но иногда обходят по функционалу. например, работа с бинарными данными в C - сдвиги и битовые маски (уровень ассемблера по сути), а в совершенно высокоуровневом Tcl для этого есть аналоги printf/scanf (binary format, binary scan). и работать с низким уровнем внезапно становится удобней

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

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

Технологически оправданную возможность, в случае C, я вижу только одну - это разделяемые библиотеки. Т.е., мы можем сгенерировать разделяему библиотеку на С, которую динамически подгрузить к исходнику и подставить в заранее подготовленные точки. При этом, у нас будут проблемы разного рода:
- нам нужно иметь развернутый toolchain
- процесс долог и непроизводителен: запуск отдельного процесса, код подгружается через внешние файлы
- если меняются типы данных, мы должны быть уверены, что во время замены экземпляры данных уничтожены, или предусмотреть протокол их модификации. Это возможно, но дорого.
- если подменяем функцию, которая в настоящий момент находится на стеке, это, скорее всего, закончится плохо
- данные, хранимые в памяти библиотеки, при замене будут унитчожены

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

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

> в эрланге тоже приятно работать с последовательностью бит

В Питоне тоже, да и в Си нужная функция пишется без проблем.

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

Эх, а мы ведь даже не успели осветить тему макросов, CLOS, обработки ошибок, символьных вычислений и пр. действительно сильных сторон Common Lisp...

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

Эх, а мы ведь даже не успели осветить тему макросов, CLOS, обработки ошибок, символьных вычислений и пр. действительно сильных сторон Common Lisp...

Освети вкратце, приведи примеры.

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

>Анонимусы успокоились на тысячном комменте?

Полопались от толстоты :)

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

Эх, а мы ведь даже не успели осветить тему макросов, CLOS, обработки ошибок, символьных вычислений и пр. действительно сильных сторон Common Lisp...

Потому, что ты соревновался в написании трёхстрочной фигни кормя троллей. -)

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

> интересно. где можно посмотреть?

Посмотреть систему управления - прямо сейчас - пока негде. Довольно скоро, думаю, немного причешу UI, и, вероятно, опубликую тут скриншот этого дела. Речь идёт о технологическом ускорителе, поэтому с точки зрения конечного пользователя основная идея состоит в том, что ускоритель можно включить одной кнопкой, а также есть возможность легко просматривать основные измеряемые параметры (мощность дозы и т.п.). Далее, позже, планирую вырезать код, который в силу ряда факторов нельзя публиковать (поддержка проприетарного протокола, используемого модулятором клистрона и т.п.), и выложить это творчество где-нибудь на GitHub. Из того что эта mini-SCADA система умеет: поддержка протокола Modbus/TCP (в дальнейшем возм. и Modbus/RTU тоже), HMI на основе clg (биндинги к Gtk+, появились намного раньше cl-gtk2; вообще мне Gtk+ не очень нравится, думаю позже перейти на CommonQt), автоматизация на основе конечных автоматов с использованием DSL, заточенного под задачи управления, клиент-серверная модель - есть основной демон, общающийся с контроллерами подсистем установки по Modbus и модулятором клистрона по его своеобразному протоколу, к которому может подключаться произвольное количество клиентов. Система в данный момент реализована без использования threads, ввод-вывод - полностью асинхронный на основе iolib. Быть может, если проект будет развиваться, реализую и веб-морду.

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

>И, кроме того, да, в лиспе такая возможность тоже есть, не в стандарте, но в реализациях

Вы стандарт-то почитайте. Эффект от переопределения функций, классов и прочего вполне определен (за исключением переопределения простых структур, но лиспы, с которыми я работал, позволяют их переопределять).

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

в Си нужная функция пишется без проблем.

не видел ни одного сишного проекта, в котором этот функционал бы реализован/использовался. поскольку приходится работать с большим объёмом legacy-кода (по большей части C и C++) - неприятно

вот был бы там такой функционал из коробки (на уровне языка или стандартной библиотеки) - тогда да

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

>- менять набор полей класса (изменение отражается на существующих экземплярах)

Кстати, применение такого изменения стопает виртуальную машину на время перекомпиляции класса?

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

>> - менять набор полей класса (изменение отражается на существующих экземплярах)

Очень интересно

Это очевидно, ибо следует из того, что программы можно писать в рантайме :)

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

> применение такого изменения стопает виртуальную машину

на время перекомпиляции класса


какую ещё виртуальную машину?

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

>> в Си нужная функция пишется без проблем.

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

Самому сделать, не?

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