LINUX.ORG.RU

Почему Лисп умер.

 ,


4

5

Очень часто в лисп-срачах на лоре можно наткнутся на аргументы лиспоненавистников, навроде «если лисп настолько крут, почему на нем не пишут энтерпрайз?» или «покажите мне годные приложения на лиспе». Также, иногда, встречаются жалобы, вроде таких: «Изучаю лисп на протяжении года, но пока не увидел значительных отличий от [some_lang]. Не понимаю, о какой-такой особенной мощи тут все говорят». Эти замечания, наверное, отчасти справедливы, во всяком случае, они основаны на реальном опыте.

Я нашел цитату Алана Кея сегодня, которая, наверное проясняет данный вопрос, чуть более чем полностью:

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

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

Кто тебе сказал?

В CPS ни из одной функции не происходит возврата. Без TCO рано или поздно у тебя неминуемо вылетит стек.

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

Я не замалчиваю, я просто не вру. Ведь «от гомоиконности нету толка» - это ложь. Она необходима, когда пишешь макросы. метапрограммирование без гомоиконности очень неудобно.

Лисп-код не эквивалентен своему исходнику, не надо засирать мозг себе и людям.

Эквивалентен, конечно.

Макросов там нету, и именно поэтому, метапрограммирование там неизмеримо мощней

Как оно может быть мощнее, если его вообще нету?

Любой кусок кода можно представить строкой и эвальнуть в любом контексте.

Где тут «мощь» и метапрограммирование? Это называется «восход солнца вручную».

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

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

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

Ни фига себе, а я думал, что 99% кода на ноде, написана в CPS.

Нет, это не так. В CPS там очень малая доля кода, по-этому стек не вылетает.

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

т.е. оверхед для межпроцессорного взаимодействия ты в принципе не учитываешь? А общие ресурсы (память/io) не нужны в принципе, да?

А не любая задача требует межпроцессорного взаимодействия и упирается в память/ио.

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

Кто-нибудь может на пальцах пояснить, что это за продолжения такие и как их можно использовать

Продолжение — функция, содержащая локальный контекст и остаток от текущей функции.

В отличие от goto восстанавливает стек.

Позволяет:

1. Реализовать многопоточность в стиле Erlang. С тысячами «потоков» и минимумом затраченных ресурсов

2. Реализовать логику веб-сайта без лапши обратных вызовов, а просто

(define (login)
  (define-values (user pass) (ask-user-pass))
  (if (check-with-db-ok? user pass)
      (show-data)
      (bad-password)))

3. Для любого обходчика коллекции (типа map, map-list и т.д.) можно сгенерировать итератор. Можно обходит параллельно несколько коллекций. Например, сделать сравнение деревьев через map-tree.

4. Реализовать сопрограммы.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

2. Реализовать логику веб-сайта без лапши обратных вызовов, а просто

Можешь код с call/cc показать?

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

Она необходима, когда пишешь макросы. метапрограммирование без гомоиконности очень неудобно.

TH, Nemerle, Katahdin, MetaOCaml, MetaLua и еще десятки других современных языков одним своим существованием доказывают, что ты брешешь, как сивый мерин.

Как оно может быть мощнее, если его вообще нету?

http://sweetjs.org/

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

1. Реализовать многопоточность в стиле Erlang. С тысячами «потоков» и минимумом затраченных ресурсов

И здесь пример реализации не помешал бы.

anonymous
()
Ответ на: комментарий от anonymous
(define (ask-user-pass)
  (define args (call/cc 
                (lambda (k)
                 (send-http-user-pass-page)
                 (call-server k))))
  (get-user-pass args))

(define (call-server k)
   (set! current-page k))

(define (on-get-request args)
   (if current-page
       (current-page args)
       (start-page)))

остальное аналогично.

on-get-request вызывает http сервер по приходу GET.

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

TH, Nemerle, Katahdin, MetaOCaml, MetaLua

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

http://sweetjs.org/

И что? Это банальная макроподстановка, то есть 1% функционала полноценной макросистемы. Где все остальное?

anonymous
()

Считаю, что тему надо прикрепить.

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

и в Deutsche Bank и в Citigroup Clojure не пишется «много» кода на Clojure

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

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

Seaside юзает CPS

Потому что это не CPS.

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

Ни в одном из этих языков нету удобного метапрограммирования.

Лжешь.

Именно из-за отсутствия гомоиконности.

Ну-ну, только в лишпеге, не смотря на гомоиконность, тоже quasiquotation используют. А с quasiquotation гомоиконность уже и не нужна.

Все очень громоздко, криво, сложно.

Лжешь. Намного проще, чем в схемках, ракетках и прочем говнище.

И что? Это банальная макроподстановка

Нет, идиот, это эквивалент макросистемы R6RS. Полный.

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

Лжешь.

Конечно, нет. Ни в одном из перечисленных.

А с quasiquotation гомоиконность уже и не нужна.

Конечно же, нужна. Смысл гомоиконности в простоте генерации и парсинга языковых выражений.

Намного проще, чем в схемках, ракетках и прочем говнище.

Именно по-этому в ракетке, например, решение всегда более чем в 10 раз короче, проще, понятнее, да еще и больше по функционалу?

это эквивалент макросистемы R6RS

Во-первых - не полный (половина, быть может). Во-вторых - r6rs - это только ядро, некоторый минимум (в том числе и в плане метапрограммирования).

От нормальный системы метапрограммирования требуется:

гомоиконность ЯП, фазы и их полная поддержка метасистемой, информация о source location (да и вообще возможность ассоциации произвольной информации с термом), возможность работы с лексическим контекстом выражений, macro-generated macro и локальные макры, виртуализация ЯП, достаточно удобный и развитый pattern-language, наличие хуков для тех или иных ф-й компилятора, наличие библиотек, реализующих основные макропаттерны.

По твоей ссылке нихуя из этого нет.

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

Конечно, нет. Ни в одном из перечисленных.

Ты их вообще видел, лапоть?

Конечно же, нужна. Смысл гомоиконности в простоте генерации и парсинга языковых выражений.

В 21-м веке на «простоту парсинга» всем насрать, а простоту генерации обеспечивает квазицитирование.

Именно по-этому в ракетке, например, решение всегда более чем в 10 раз короче, проще, понятнее, да еще и больше по функционалу?

Лжешь. Ракетке до Nemerle как от Москвы до Магадана на коньках.

Во-первых - не полный (половина, быть может).

Лжешь. Покажи, чего не хватает.

гомоиконность ЯП

Это у тебя религия такая? Лечись цианидом, говорят, помогает.

фазы и их полная поддержка метасистемой,

Ненужно. Вообще не нужно, ни при каких обстоятельствах.

информация о source location (да и вообще возможность ассоциации произвольной информации с термом),

А вот этому как раз гомоиконность очень сильно мешает, потому в говносхемке и придумали эти гомосяцкие syntax objects, которые вроде как бы списки, а на деле ни хера не списки. И никакой тебе на самом деле гомоиконности. Ну а ракетка еще дальше в сраку пошла в этом деле.

возможность работы с лексическим контекстом выражений

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

достаточно удобный и развитый pattern-language

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

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

Ты их вообще видел, лапоть?

естественно. Собственно, то что подается под макросистемой в половине из них - это и не макросистемы вовсе. Так, костыли уровня сишки.

В 21-м веке на «простоту парсинга» всем насрать, а простоту генерации обеспечивает квазицитирование.

Квазицитирование ее не обеспечивает. А на парсинг при написании макросов не насрать, потому что для многих макросов парсинг - бОльшая часть задачи. Например, тот же loop в общелиспе.

Лжешь. Ракетке до Nemerle

Лол? Ты вообще видел макросистему немерле? Это сборище малоюзабельных костылей, на которых ничего путного не напишешь. Или напишешь - но при помощи совершенно несоизмеримых затрат.

Лжешь. Покажи, чего не хватает.

Ну, например, вот такой макрос покажи:

(define-syntax (yoba stx) #`#,(λ () 'huy))
заметь, не: (define-syntax (yoba stx) #`(λ () 'huy))

Ненужно.

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

А вот этому как раз гомоиконность очень сильно мешает, потому в говносхемке и придумали эти гомосяцкие syntax objects

syntax objects решают проблемы совершенно ортогональные гомоиконности.

Это вообще на хер не нужно

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

макросистеме дела не должно быть до семантики лексической видимости.

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

Если твоя макросистема не позволяет это реализовать поверх элементарных средств языка

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

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

Если рантайм изначально под это не заточен - то как не крутись, а нормальных фаз не будет.

http://common-lisp.net/project/xcvb/ - нормальные фазы на CL. В смысле нормальное отделение (eval-when (:load) ...) от (eval-when (:compile) ...)

А в фазах проблема сделать что-то доступным во всех фазах. Приходится городить (module m ....) (require (for syntax 'm) 'm (for-.... m))

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

т.е. оверхед для межпроцессорного взаимодействия ты в принципе не учитываешь? А общие ресурсы (память/io) не нужны в принципе, да?

А не любая задача требует межпроцессорного взаимодействия и упирается в память/ио.

А какая?

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