LINUX.ORG.RU

REPL в Common Lisp и в других ЯП

 ,


1

3

У меня возник несколько холиварный вопрос вот по какому поводу. Я столкнулся с мнением, что read-eval-print loop (REPL) в Лиспе - это его уникальная фишка, которой нет ни у какого другого ЯП. В частности, об этом пишет Ричард Столлман на своем сайте: http://stallman.org/stallman-computing.html. Но, насколько я понял, REPL - это интерактивный интерпретатор, который есть у Python'а, у Ruby, и вообще у многих ЯП. Так в чем же тогда заключается крутизна Лиспа, которой восхищается старик Столлман?

когда штальман это писал, не было ни руби, ни пистона, ни многих ЯП.

anonymous
()

repl - изначальная маккартьевская Инь-Янь eval/apply остальное не так компактно.

а так репл везде есть возми тотже ed+!+sh+cc - вот тебе и репл в UNIX-IDE

Штольман ЛиспМашиной пришиблен.

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

Питон был. Столлман написал, что ознакомился с документацией по питону.

hedgehog_alex
() автор топика

Крутизна лиспа в отстутствии синтаксиса (баланс скобок и непробельные имена)(форт превзошёл :) ) и «гомоиконсти» (что ща как бы общее место)

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

трабла начинается когда в погоне за последними % производительности всё что тока мона транслируется(или ещё хуже влучную маш или си кодится) и получается нечто не вкусное внутри и спартански снаружи(ради мазохизма Илиты)

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

наследнике лиспа Форте

Лолшто? Хотя REPL в Форте православен. В лиспе, например, не получится вмешаться в парсер.

buddhist ★★★★★
()

насколько я понял, REPL - это интерактивный интерпретатор,
который есть у Python'а, у Ruby, и вообще у многих ЯП.

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

Что бы такой способ разработки был эффективным нужен «комплекс мер». Например, в случае Python сильно мешает пакетная система, завязанная на файловую структуру (плюс ещё разные тонкости типа того, что переопределение в Python эквивалентно присваиванию, что не всегда позволяет добиться нужного эффекта).

В принципе, схожие возможности сейчас есть у JavaScript, но большинство JS-фреймворков организованны таким образом, что это затруднительно. Но для своего кода, если следить за его структурой, такой способ разработки вполне применим.

Ещё мне говорил, что REPL эффективен в случае Erlang, но я с ним не работал.

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

Ещё мне говорил, что REPL эффективен в случае Erlang, но я с ним не работал.

только удобен для тестов, CL'ский все равно круче.

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

Ещё мне говорил, что REPL эффективен в случае Erlang, но я с ним не работал

Так ведь интресно сравнение REPL для CL и Haskell, динамика vs статика.

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

Так ведь интресно сравнение REPL для CL и Haskell,
динамика vs статика.

Возможность какого-либо содержательного разговора на тему REPL в Haskell мне представляется сомнительной.

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

Ещё мне говорил, что REPL эффективен в случае Erlang, но я с ним не работал.

REPL эффективен в случае Haskell (GHC). Есть много чего интересного. Умеет в нативный код компилить (только медленнее, и встроенный дебаггер не работает). Умеет даже подгружать .o и .so и даже под виндой, для использования их через FFI.

Правда, если код находится в event-loop'e для внесения изменений этот самый loop приходится разрывать. Как я понимаю, в лиспе это не всегда так. Ну и волне понятные ограничения на внесения изменений в уже откомпилированные библиотеки.

Хотя, мне сдается, что ghci не использует всех фишек GHC... и можно сделать более крутой REPL, но пока всем пофиг.

Macil ★★★★★
()
In [1]: class test:
   ...:     def __init__(self):
   ...:         self.a=10
   ...:         self.b=20
   ...: 

In [2]: a = test()

In [3]: print a.a
10

In [5]: class test:
   ...:     def __init__(self):
   ...:         self.a=10
   ...:         self.b=20
   ...:         self.c=30
   ...:         

In [7]: print a.c
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/home/avatar/<ipython-input-7-e14d4a38af80> in <module>()
----> 1 print a.c
CL-USER> (defclass test ()
	((a :initform 10
	    :reader a)
	(b :initform 20
	    :reader b)))
							
#<STANDARD-CLASS TEST>
CL-USER> (defvar a (make-instance 'test))
A
CL-USER> (print (a a))

20 
20
CL-USER> (defclass test ()
	    ((a  :initform 10
	 	 :reader a)
	     (b  :initform 20
		 :reader b)
	     (c  :initform 30
		 :reader c)))
							
#<STANDARD-CLASS TEST>
CL-USER> (print (c a))

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

чисто для поржать посмотри схему(директ граф)(выгугливается на Ъ) языков (от планкакюля до 2012)

ну и ЧакМур до своего телескопорефакторинга типо студент макартни тоже аi в начале 60тых

форт конечно не обратно совместим с папой своим.

однако форт(есть описание предфорта где типо марковский алгоритм- получаем слово заменяем его на(смотрим на таблицу и взамисимости от либо значение либо исполнение) ; отдельный стек возврата - да конкретизация модели исполнения; циклы и условия вообще криво прикручены) очень лиспо лайк - расширяем исходное непонятно что простенькой абстракцией (лисп - 5 слов, форт - сам репл и запись/чтение по адрессу) и получаем отдельную repl в которой моно творить всё(ну а для скорости части опускать до маш/асм)

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

Возможность какого-либо содержательного разговора на тему REPL в Haskell мне представляется сомнительной

Плюсую.

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

Умеет даже

Да ну, это не серьёзный разговор. REPL предполагает способ разработки, который идёт в разрез всему, во что верят хаскелисты. Запустить - что-то проверить, посмотреть - это возможно. Но это просто интерпретатор.

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

в форте оно «православней» при том что в самом форте много больше временных_клёвых_решений которые устарели уже в конце 70х и их попадание в стандарт - убила подход.

т.е форт - это репл и базавые кубики остальное рефакторится на конкретной задаче поэтому даже то как реализовано в «стандартном форте» формирование выбора по условию и циклы и использование I/J/K - какашка

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

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

hedgehog_alex
() автор топика

Видимо, имеется в виду работа с образом. Такое есть еще в Форте (и возможно Смолтоке, но про него имею только скудные представления). И REPL, кстати, может быть не только интерпретатором, но содержать и полноценный компилятор.

dave ★★★★★
()

Так в чем же тогда заключается крутизна Лиспа, которой восхищается старик Столлман?

Когда он это написал всеми другими языками были С, Алгол, Кобол и Модула.

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

READ EVAL PRINT LOOP

если вышеперечисленое для пользователя интерактивно (т.е repl за неболее секунд few ) то и всё а что за читатель , как оно вычисляет прочитаное , что и куда оно печатает и всё это REP REP REP REP не суть.

конечто тот REP который мона на ходу кускаме заменять ожидаемо мощьней

так что ed+!sh +#!файлы+cc(для тюнинга скорости) вполне класический repl

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

Но это просто интерпретатор.

Ну-ну. ghci это далеко не интерпретатор.

Как я уже сказал в GHC API есть достаточно много интересного по динамической линковке и компиляции. Чего нет, так нет механизма миграции работающий код -> новый код. В общем случае его приходится тормозить с отправкой в мусор всех порожденных им объектов. Чисто в теории, применим OTPшный способ миграции, т.е. модуль и его окружение о ней ЗНАЕТ. Но это, увы, не «общий случай» Лисповский же способ не применим, т.к. в хаскеле не все объекты существуют в рантайме.

Кстати, а во что же это такое хаскелисты верять, что «настоящий» REPL невозможен.

Macil ★★★★★
()

Lisp is dead

Да бросьте вы маяться сравнением Lisp с другими ЯП. Нет ни одной фишки в лиспе, которая бы не поддерживалась каким-либо другим языком. Да, когда он появился - лисп был мощнейшим языком *так и остается по сей день*, но является скорее атовизмом, а пишущие на нем - анахронисты.

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

Этот вопрос ему неоднократно задавали. Каждый раз ответ один - «книжный русский». Недавно его в толксах назвали «генетическим мусором», но он так и не поставил spellchecker в свою систему.

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

Кстати, а во что же это такое хаскелисты верять,
что «настоящий» REPL невозможен.

Что программа должна быть корректна.

Как я уже сказал в GHC API есть достаточно много интересного
по динамической линковке и компиляции.

У меня такое впечатление, что вы таки не понимаете что значит разработка в REPL.

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

Что программа должна быть корректна.

А это-то каким боком мешает? Хаскелисты верят в интерфейсы... Но это мешает только в той степени, что лисп-стайл миграция, когда меняется содержимое образа, невозможна. Кстати, и даже в лиспе не каждый объект будет изменен, например, результаты макрорасширения или если форма Б была заинлайнена в форму А. Нужно явно вызывать процедуру компиляции или макрорасширения. В хаскеле же применим вариант, когда сначала создается абсолютно новая часть образа, а затем осуществляется переход. Причем, минимальной единицей будет модуль. Не более, и не менее.

Вот этой вот процедуры «перехода» в настоящий момент нет. Но ничто не мешает ее добавить.

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

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

REPL _предполагает_ способ разработки ...

Прямо таки _предполагает_? Сами же сказали что питонах / рубях не совсем так, хотя там и repl.

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

ghci, afaik, тоже не компилирует

По-умолчанию - нет.

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

ваш фэйл.

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

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

на каких удобрениях такую вкусную копипасту вырастил?

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

кста если вспомнить что (car.cdr) is cons то Мур возможно изменил cons is(RP.DP) где RunPointer и DataPointer затем их стекование (аля dc (калькулятор)) и вот и два стека. ну а затем пара указателей как конструкция атрофировалась в его поделии.

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

Конечно, нет (ежели скобочки считать за фичу).

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

Как это видишь ты:

если вышеперечисленое для пользователя интерактивно (т.е repl за неболее секунд few ) то и всё а что за читатель , как оно вычисляет прочитаное , что и куда оно печатает и всё это REP REP REP REP не суть.

Как это вижу я:

если вышеперечисленное для пользователя интерактивно (т.е repl за не более <PARSE ERROR>), то и всё <PARSE ERROR><PARSE ERROR>, как оно вычисляет прочитанное, что и куда оно печатает <FATAL ERROR; TRYING TO RESUME... FAILED; READING ABORTED>

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

Первый стабильный релиз Go (комментарий)

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

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