LINUX.ORG.RU

Посоветуйте встраиваемый Лисп


0

2

Посоветуйте утопичную реализацию любого диалекта Лиспа для использования в качестве встраиваемого языка (скорее всего для программирования гуя).
Из требований (в порядке убывания приоритета) - сборка без заморочек и под Оффтопиком тоже (без заморочек означает в том числе, что я не должен внезапно узнавать, что причина странной ошибки в том, что библиотека собрана без поддержки Юникода), некая изолированность (чтобы в случае ошибок в интерпретируемом коде не падала вместе с основной программой), быстрота работы, простота встраивания (подключение и настройка в пару строчек), хорошая документированность, легковесность, поддержка Юникода.
Если с помощью этой реализации я смогу встроить в программу на Си консоль с REPL значит, скорее всего, это именно то, что мне нужно.

Лисп
без заморочек

/0

anonymous ()

Guile

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

ECL

Я читал эту тему и мне как-то не понравились упомянутые затыки. Особенно фразы: «его надо самому собирать, на конкретной системе, чтобы нормально работал», «падает на раз у меня», «но собрал ECL без unicode».

код для JVM и .NET.

Не, этих радостей мне не надо.

Bigloo, s7, TinyScheme

А ещё Scheme 48, SIOD, SCM, Elk... Мне бы «истории успеха» услышать - кто пробовал, кому что понравилось/не понравилось и т.п.

Nebuchadnezzar ★★★★ ()

Самый лучший встраиваемый лисп — node.js. Недостатка два: во-первых, не умеет без костылей залазить в AST JS, во-вторых без костылей не умеет выступать в качестве макрогенератора машинного кода. И то и другое — печально суть, но полагаю именно это ТС не сильно расстроит.

Macil ★★★★★ ()

ECL. Правда он кривой, так что идеальный вариант - сделать свой.

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

Это традиция такая - в темах про Лисп предлагать JavaScript?)

А тебе, пардон, «шашечки»? Или «ехать»?

Macil ★★★★★ ()

А тебе, пардон, «шашечки»? Или «ехать»?

В данном случае это сравнение неуместно. Я пришёл в магазин за машиной, а мне предлагают мотоцикл. Я не спорю, что мотоцикл хороший, но мне нужна машина.

Напиши свой, делов то.

ECL. Правда он кривой, так что идеальный вариант - сделать свой.

Где же ошиблись разработчики ECL, что им вместе не удалось хорошо сделать то, что один человек, похоже, может сделать играючи?

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

Guile

Ну и жирный он весьма.

Это почему это? И поподробнее, если можно. Сам что-то не заметил.

PS: А вообще под вендой лисп не очень-то любят. Ой, чую - так и придётся тебе «велосипед» строить. :)

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

Я читал эту тему и мне как-то не понравились упомянутые затыки. Особенно фразы: «его надо самому собирать, на конкретной системе, чтобы нормально работал», «падает на раз у меня», «но собрал ECL без unicode».

по моему в той теме все кончилось хепиэндом, в том числе и с юникодом. последний вариант совета брать стабильную версию и читать доки :)

если хочется энтерпрайза там совет про лиспворкс.

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

В данном случае это сравнение неуместно. Я пришёл в магазин за машиной...

Ты пришёл в магазин и выдал: «Мне надо в деревню к деду съездить, картохи привезти оттуда. Ну-ка продайте мне паровоз типа ЛВ!»
Продавцы (выпучивая глаза): «Но ведь их уже 50 лет как не производят! И потом, им нужны рельсы! И у паровозов огромное потребление угля, который вы просто так не раздобудете! Может, лучше всё-таки автомобиль?..»
Ты: «Заткнись, быдло! Ты ничего не понимаешь в технологиях!!!1111адин»

Скажи спасибо тем, кто тратит своё время на то, чтобы просветить тебя, дурачка. Чтобы объяснить тебе, что в XXI веке паровоз, мягко говоря, не очень подходит для перевозки картохи.

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

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

Minoru ★★★ ()

Недавно появился ManKai Common Lisp (MKCL). Заявлена поддержка винды в том числе. Только я его не смотрел.

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

Только непонятно пока, насколько встраиваемый лисп получился. Во всяком случае, MKCL как и ECL основан на Kyoto Common Lisp. Грубо говоря, валится в stack overlow на примерах с TCO.

dave ★★★★★ ()

Это почему это? И поподробнее, если можно. Сам что-то не заметил.

Потоки, сеть, прочие системные вызовы - он и под виндой не собирается из-за того что у них разные взгляды на эти вещи. На мой взгляд - нужно было вынести это в модули, а не запихивать в исходники библиотеки. Впрочем я не стану окончательно сбрасывать его со счетов, ведь версия 1.8.7 входит в MinGW.

racket умеет встраиваться

Умеет, но похоже делает это с целью окончательно совратить программиста и заставить его отказаться от всех других языков.

Скажи спасибо

Спасибо. Следующий.

PicoLisp

Что-то я не нашёл в его документации упоминаний про встраивание. Зато увидел строчку: «Cygwin/Win32» - не пойдёт.

Пока что могу сказать следующее:

ECL - работает под виндой (впрочем как и все нижеперечисленные, кроме 2-ой версии Guile), обладает обширной документацией, но все примеры встраивания в ней сводятся к трансляции программы с Лиспа на Си
MKCL - из сайта не понятно в чём заключается кардинальное отличие от ECL, скудная документация
TinyScheme - маленький и простой, очень скудная документация, похоже встраивание осуществляется парой строчек, но за примерами придётся лезть в исходники программ
Scheme 48, SIOD, SCM, Guile - очень схожи по документации, тем более, что последние три являются наследниками друг-друга. Тем не менее SIOD, похоже, встраивается проще всех, но разработка загнулась три года назад. SCM, почему-то, не унаследовал от предка это качество и минимальный пример уже занимает целый лист. Guile исправил этот недостаток и единственная его проблема - это неудачное внесение фич во второй версии, что привело к проблемам компиляции как под виндой, так и в некоторых случаях под Линуксом, но рано или поздно это починят. Scheme 48 показался мне вторым по привлекательности после TinyScheme на данный момент.
Elk - полузаброшенная разработка с мутной документацией

Nebuchadnezzar ★★★★ ()
Ответ на: ага от tentaclius

Про «Segmentation fault» сам придумал? Или ты принципиально против адресной арифметики? Попробую угадать - ты хотел это:

0 value a
a 100500 - to a
a . 

> :-) таких возможностей пользователю как-раз и не хватало

А таких?

\ ---
include oof.fs
\ ---
object class graphical \ "object" is the parent class
     method draw ( x y -- )
how: : draw  ( x y -- )  .\" draw graphical:\n " swap ." x= " . ." y= " . cr ;
class;
graphical class circle \ "graphical" is the parent class
     cell var circle-radius
     method draw-circle
how: : draw-circle ( x y R -- )  .\" draw circle:\n " ." R= " . swap ." x= " . ." y= " . cr ;
     : draw ( x y -- )  circle-radius @ draw-circle ; 
     : init ( R -- )  circle-radius ! ;
class;
\ ---
graphical : t-rex
50 circle : my-circle
20 30 t-rex draw 
40 50 my-circle draw
\ ---
bye
...а если ftp://ftp.taygeta.com/pub/Forth/Archive/tutorials/gforth-sdl-opengl/ ? :)

Neksys ★★★ ()

После некоторых размышлений я понял, что, возможно, слишком привыкнув к C++/QT/JavаScript я по инерции мышления подошёл к Лиспу не с той стороны и в результате начал изобретать велосипед. Ведь, если подумать, то зачем мне встравить в программу на Си интерпретатор Лиспа, а затем пробрасывать в него функции, если можно реализовать критические вещи на Си, скомпилировать в библиотеку, а затем дёргать её из Лиспа через FFI.

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

если можно реализовать критические вещи на Си, скомпилировать в библиотеку, а затем дёргать её из Лиспа через FFI.

Еще немного, и ты поймешь, что вместо Лиспа (любого) в такой роли практичнее использовать Python. Но это если тебе для работы надо.

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

Еще немного, и ты поймешь, что вместо Лиспа (любого) в такой роли практичнее использовать Python.

Толсто без указания «особенностей» змеюки - тормоз, GIL, но и куча «батареек в комплекте» (если они, конечно, важны для ТС).

Но это если тебе для работы надо.

ещё и жирный «петросян mode»

P.S. Прошу ядовитой слюной не плевать - я сознательно не пишу об особенностях, «+» и "-" CL, ибо ТС выбрал его изначально.

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

Толсто без указания «особенностей» змеюки - тормоз

Guile, вполне серьезно рассматриваемый, тоже не демон скорости.

GIL

Вопрос в том, насколько нужна ТС параллельность, и насколько нужна праллельность на уровне VM (а не Си-расширений).

Прошу ядовитой слюной не плевать

Вот еще, тратить яд на вас %)

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

>Толсто без указания «особенностей» змеюки - тормоз

Guile, вполне серьезно рассматриваемый, тоже не демон скорости.

да, но в свете перехода «встраиваемость -> ffi» я как-то сразу для себя вычеркнул Guile из списка кандидатов :)

Вопрос в том, насколько нужна ТС параллельность, и насколько нужна праллельность на уровне VM (а не Си-расширений).

ну я как-бы отметился: «если они <особенности, в т.ч. и GIL>, конечно, важны для ТС»

Вот еще, тратить яд на вас %)

И на том спасибо :)

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

но в свете перехода «встраиваемость -> ffi» я как-то сразу для себя вычеркнул Guile из списка кандидатов :)

Почему? Наверняка у ТС обычное «критичный по скорости код - на Си, логика - на чем-то высокоуровневом».

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

Почему? Наверняка у ТС обычное «критичный по скорости код - на Си, логика - на чем-то высокоуровневом».

потому-что тормоз и схема, но не ракета - если понадобятся хоть какие «батарейки», будет ещё тяжелее, чем с CL. Ну и я специально оговорился - «для себя». Если ТС-у Guile «приглянулся» по каким-то особым параметрам, то питон с CL-м тесно обнявшись дружно идут лесом :)

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

Или ты принципиально против адресной арифметики?

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

tentaclius ()

что вместо Лиспа (любого) в такой роли практичнее использовать Python

Я стараюсь избегать программ написанных на Питоне, ибо в 80% случаев их приходится запускать из терминала, читать описание ошибки и шаманить с версией Питона (особенно под Оффтопиком). А в остальном язык, вроде бы, неплохой.

Наверняка у ТС обычное «критичный по скорости код - на Си, логика - на чем-то высокоуровневом».

Ага. Надо будет потом глянуть в сторону CWEB и интерпретаторов для Си. Хочется писать программы без геморроя и ООП (т.е. извращения алгоритма в пользу абстракций).

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

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

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

1. Создаем пользовательский DSL в виде отдельного словаря.
2. Оставляем доступным пользователю только словарь с DSL (с помощью seal исключаем из доступности все словари кроме нужного DSL и добавляем ещё один нужный WORKSPACE в последовательность поиска с помощью >order).
3. ...

\ --- 
wordlist constant DSL
wordlist constant WORKSPACE
DSL >order  DSL set-current
\ --- 
get-current constant FORTH
DSL constant DSL
WORKSPACE constant WORKSPACE
: words words ;
: order order ;
: set-current set-current ;
: >order >order ;
: bye bye ;
\ ---
: var 0 value ; 
var _err
' _err value *_err
: let ['] ' catch if ." not found" cr *_err endif 2 cells + ; 
: := [char] ; parse evaluate swap ! ; 
: + + ;  : - - ;  : * * ;  : / / ;  : cr cr ; 
: print ['] ' catch if ." not found" cr else execute . endif ; 
: print" [char] " parse type ; 
: test: 13 parse 2dup type ."  = " evaluate cr ; 
\ --- 
test: vocs
test: order
WORKSPACE set-current
DSL seal 
test: order
test: words
WORKSPACE >order 
test:                        var a 
test:                 var b  var c 
test:                let a := 11 ; 
test:  let b := 22 ; let c := 33 ; 
test: let c := a b + 4 * 5 / c + ; 
test:         let d := a b + c + ; 
test:          print" a= " print a 
test:          print" b= " print b 
test:          print" c= " print c 
test:                        var d 
test:           let d := a b + c + 
test:                      print d 
test: order
test: words

> Этот пример валидный для FICL и, отчасти, для FTH. Не знаю, как по этому вопросу обстоят дела в других реализациях.

Кхм, действительно FICL мгновенно валится. Что-то у него там живое за 100500 байтов ниже вершины словаря. :|

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

Я стараюсь избегать программ написанных на Питоне, ибо в 80% случаев их приходится запускать из терминала, читать описание ошибки и шаманить с версией Питона

Интересно, где ты берешь такие программы...

особенно под Оффтопиком

Под оффтопиком принято таскать с собой интепретатор нужной версии.

Надо будет потом глянуть в сторону CWEB и интерпретаторов для Си

Поищи еще интерпретатор ассемблера.

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

Поищи еще интерпретатор ассемблера.

Зачем?

На нем логику писать еще круче, чем на Си.

А для С, я думаю, мне хватит Clang.

Чото я теряю форму - так долго не распознать тролля :/

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

Что-то не слышу ругани на пример для GForth выше (про «DSL >order seal» и значение /wid/ FORTH в словаре DSL полученное get-current)... Ладно, а для FICL будет что-то типа:

\ --- 
get-current constant FORTH
wordlist constant DSL
wordlist constant WORKSPACE
DSL >search  DSL set-current
\ --- 
FORTH constant FORTH
DSL constant DSL
WORKSPACE constant WORKSPACE
: words words ;
: order order ;
: set-current set-current ;
: set-order set-order ;
: bye bye ;
\ ---
: var 0 value ; 
var _err
' _err value *_err
: found? ( "name" -- xt t/f ) bl parse sfind ;
: let found? if else drop ." not found" cr *_err endif 5 cells + ; 
: := [char] ; parse evaluate swap ! ; 
: + + ;  : - - ;  : * * ;  : / / ;  : cr cr ; 
: print found? if execute . else drop ." not found" cr endif ; 
: print" [char] " parse type ; 
: test: 13 parse 2dup type ."  = " evaluate cr ; 
\ --- 
test: words
test: order
DSL WORKSPACE 2 set-order
WORKSPACE set-current
test: words
test: order
test:                        var a 
test:                 var b  var c 
test:                let a := 11 ; 
test:  let b := 22 ; let c := 33 ; 
test: let c := a b + 4 * 5 / c + ; 
test: let d := a b + 4 * 5 / c + ; 
test:          print" a= " print a 
test:          print" b= " print b 
test:          print" c= " print c 
test:          print" d= " print d 
test:                        var d 
test:           let d := a b + c + 
test:                      print d 
test: words
test: order
Проблема с FICL в нашем случае в том, что
The standard does not appear to specify any conditions 
under which the search order is reset to a sane state. 
Ficl resets the search order to its default state 
whenever ABORT happens. This includes stack underflows 
and overflows. QUIT does not affect the search order. 
The minimum search order (set by ONLY) is equivalent to

FORTH-WORDLIST 1 SET-ORDER                                                     
что означает сброс всех контекстов в дефаултный минимальный набор при любой ошибке.
А это, мягко говоря /ну очень мягко говоря/, не есть хорошо и автор явно погорячился с удобствами.

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