LISP

Материал из Неолурк, народный Lurkmore
(перенаправлено с «Scheme»)
Перейти к навигации Перейти к поиску
Любая достаточно сложная программа на Си или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp
— „Десятое правило Гринспана“
…в том числе и сам Common Lisp

LISP, а вернее просто Lisp, Лисп — семейство языков программирования, так называемых диалектов Лиспа. Древнее благородство, слава, математическая красота и меметичность Лиспа обеспечивают возможность составить эту статью чуть более, чем наполовину из ско… кавычек от величайших умов информатики.

One can even conjecture that Lisp owes its survival specifically to the fact that its programs are lists, which everyone, including me, has regarded as a disadvantage.
Джон Маккарти, изобретатель Лиспа и термина “искусственный интеллект”.

Программы Лиспа — рекурсивные линейные списки: и на уровне грамматики исходного кода, и перед компиляцией, и во время компиляции, и при исполнении, и даже, если надо — в сетевом сообщении. Авторы надеются далее хотя бы намекнуть профану, насколько это… круто!

8. Нотация для кода, применяющая деревья из символов.
9. Весь язык всегда к вашим услугам. Нет сущностного различия между фазой обработки, фазой компиляции и runtime. Можно компилировать и гонять код посреди считывания, считывать или исполнять код во время компиляции, а также считывать и компилировать код во время runtime.
Запуск кода при считывании позволяет пользователю перепрограммировать Лиспов синтаксис; исполнение кода во время компиляции это основа макросов; компиляция при рантайме лежит в основе Лиспа, как надстроечного языка в программах вроде Emacs; ввод во время исполнения позволяет разным программам сообщаться посредством s-выражений, — идея, которую недавно изобрели заново в виде XML.

Пункт 8, который в сочетании с 9 делает возможным Лисповы макросы, поныне ещё уникален в Лиспе, наверное, потому, что (а) требует всех этих скобок, или чего-то не лучше, и, (б) если сделать этот финальный шаг к мощи, то не сможешь уже заявить, будто изобрёл новый язык, — ведь ты задизайнил лишь очередной новый диалект Лиспа ;-)
— Paul Graham, What Made Lisp Different</ref>


Исторические вехи[править]

В начале 1960-го года автору Лиспа, великому Джону Маккарти была, аналогично математической теореме, низпослана — им была как бы найдена, сотворена, первооткрыта — функция eval для инструкций, записанных в списки вместе с данными. Впервые в истории математики сим совершилось обобщение концепций символ[1] и формула (…программа, …выражение, …инструкция) — в единый тип, а именно — S-выражение (symbolic expression). Теоретически это позволяло отказаться от отдельного синтаксиса для инструкций, M-выражение (meta-expression).

  • Emacs Lisp разработан Ричардом Столлманом для редактора GNU Emacs. Является самым старым лиспом из остающихся в ходу.
  • ANSI Common Lisp (стандарт ANSI X3.226-1994) был разработан, чтобы связать воедино в одном стандарте разнообразные лиспы (Interlisp, LML и пр.), является наиболее практичным диалектом, на котором пишут вебсерверы, вебсайты и вебдваноль.
  • Scheme создали Гай Стил[2] и Джералд Сассман в качестве учебного языка для демонстрации колдовских возможностей машины и написания книги SICP. В процессе работы над языком они достигли такой глубины сатори, что сочиняли до десятка разных интерпретаторов в неделю.
  • Инженеры из Apple Computer, не останавливаясь на достигнутом (Object Pascal), создали Dylan, совмещающий синтаксис Паскаля с возможностями Lisp, но общественности было на это поебать, как и прочие феномены порядка «смотри, я тоже стараюсь соответствовать духу эпохи». А потом вернулся Джобс, и в Apple закогтился Objective C, совмещающий типобезопасность C со скоростью SmallTalk.
Holy vsl lisp.jpg

Характер и фишки Лиспа[править]

  • Чисто функциональная теоретическая основа, притом же, что Лисп не скован какой-либо парадигмой, помимо внутренней минимальной аксиоматики.
  • Прямой доступ к AST: на Лиспе очень легко метапрограммировать. За это его любит, например, Луговский и Лейн
  • Истинные макросы — как просто макросы, так и макросы на чтение. Это позволяет на Лиспе построить вообще любой синтаксис!!1111 В любом другом языке, кроме Лиспа и TCL, макросы не макросы, а препроцессорная чепуха.
  • Интерпретатор Лиспа на Лиспе можно восрать за 15 строк, ну или около того. По слухам, это то же самое, что вышеуказанныый царственный eval.
  • Возможность отлаживать, модифицировать, обновлять работающую программу, не перезагружая. Это помогло, например, в миссии NASA, когда зонд отлетел на многие световые минуты, работая на Лиспе, и не зря.
  • Эффективные кроссплатформенные реализации, начиная с того же Common Lisp в 1990-х, когда платформ был целое фрик-шоу.

Галерея[править]

(defentity goat.se! '(

(((L I S P )( L I S P ) ( L I S P ) ( L I S P )))
* (     \             \            )    \       *
B(       )             \          )      )      B
e(       `.             )         )       :     e
a`        )             )        \)       )     a
t \       ) )       )  \\\   --__ \\       :    t
i  \      \)   _--~~          ~--__) \     )    i  
n   \      \_-~                    ~-_\    )    n
g    \_     \        _.--------.______\)   )    g
      \     \______(( _ ___ _ (_(__H  \   )      
t      \   .  S ___)  ______ (_(____t  )  )     t
h       (\ )   I ____)) APPLY\ (_____D  )_)     h
e      ( (\)   C_____)  EVAL )  (___P   )  \    e
      (   (   _P_____)\______)  )) _) )     \    
a     (    \  )__   \\_________)) (__)       )  a
v    ( \    \____)   `----   --'             )  v
e    (  \_          ___\       )_          _) ) e
r   (              )    (     )  \            ) r
a   (             )    (   λ   )  \           ) a
g   (          ) )    (         )  \           )g
e   (         ) )      (__)(___)    )          )e
s  (           )        (    )       )         )s
*  (          )         (    )       )         )*
(((L I S P )( L I S P ) ( L I S P ) ( L I S P )))

))

Дальнейшее просветление[править]

Примечания[править]

  1. В свою очередь, символ это обобщение понятий знак/имя переменной, …константы, …типа.
  2. (Впоследствии соавтор Явы
Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlYAMLPHPPythonRubyABAPАссемблерВасикFortran (Профессор)
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++ScalaH и Ё+Программист-бетонщик
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёздыПрограммист (существо)Тернарный операторUnreal MCPИсходный кодSingle-Page ApplicationGiteaForgejoCephIDEДжуниорРепозиторийPostgreSQLSQLiteJQueryБуферWebGLПереполнение буфераХардкодInvoke-WebRequestСкрипт для автоблокировки новых пользователейРазделение диапазоновПроверка диапазоновGeoLite2-Country.mmdbObjective-CProgramBenchComposer 2.5
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplaceФреймворкБыдлокодIndex.phpОхота за жукамиКуМирКлеточный автоматПроцедурное программированиеПоиск файлов в Unix по содержимомуPetoohФункция активации нейронаПерегрузка операторов в PythonЗерокодинг
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCampUnity3DКнижный PythonMallocСвязный списокSOLIDООПУказательNULLWeLang++XenonRecompFuse.jsОптимизацияТестированиеAmbreon866Реверс-инжинирингКроссплатформенностьJSON
ЛюдиИлья КанторЮрий КлючевскийЭдуард ЛаасЭдвард СноуденСеймур ПейпертПроблемаK!ockyTypeScriptОтладчикБитЭффективный менеджер (IT)TauriReact NativeWindows APIТипPyTorchTensorFlowПарсерNode.jsFastAPIVue.jsSvelteБэкендElectronBroken Object Level AuthorizationМаппингДжастин ФранкельHex-редакторVisual Basic .NETNext.jsDocker ComposeNode modulesIndexedDBDos2unix
Прочее++i + ++iДедлайн%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодачХукCurl cffiВибе-кодингFlutterАппликативный операторВыбрасывание окон из Windows