Несколько Причин Изучить Cl, Даже Если Вы Не Планируете Писать На Нем В Будущем

Наверное, эту статью следовало опубликовать раньше двух предыдущих, в этой моей серии о Common Lisp, но лучше поздно, чем никогда.

Когда-то, когда я читал статьи Пола Грэма и только начинал изучать CL, я довольно скептически отнесся к утверждению, что Лисп позволяет лучше понимать другие языки, и вообще программист, знающий CL выучит любой другой язык максимум за пару недель, и будет писать на нем даже лучше, чем пишет на нем большинство людей, знающих этот язык пару лет. Но теперь я пришел к выводу, что это утверждение по-прежнему верно.

Поверьте мне.

Новые идеи в языках программирования не появлялись с середины 90-х годов, то есть как раз со времени стандартизации Common Lisp. Если вы возьмете одну из современных реализаций CL, например SBCL, и более или менее поймете стандарт ANSI CL и его расширения, предоставляемые этой реализацией, тогда вы поймете и поймете такие парадигмы программирования, как:

  • Императив и его вариации (у CL даже есть goto! А остальные элементы управления потоком управления в нем управляются аналогами из всех других языков)
  • Структурный (без комментариев)
  • Объектно-ориентированный и его разновидности (От замыканий до CLOS)
  • Функционален (CL призывает локализовать побочные эффекты и по возможности писать без них)
  • Управляемый событиями (что сводится к обратным вызовам, то есть объектам функций)
  • Обобщенный (см.

    конец статьи о полиморфизме)

  • Метапрограммирование (ведь это Лисп! Программа сама по себе является объектом языка)
  • В некоторой степени параллельное программирование
  • И так далее, и тому подобное — используя языковые инструменты, которые непосредственно реализуют предыдущие парадигмы, и скрепляя всё вместе с помощью макросов, CLOS и система условий , в язык можно добавить что угодно: от логической парадигмы и встроенного пролога до визуального программирования.

Я прямо заявляю, что все основные языки, и особенно объектно-ориентированные, являются подмножествами CL, просто со своим синтаксисом и некоторыми ограничениями типизации( Система типа CL очень просто, но в то же время бесконечно мощно и неразрешимо в целом, даже в динамике).

В принципе, это справедливо даже для C, поскольку я на собственном опыте убедился, что работа с FFI и встроенным ассемблером помогает понять C и обычные ассемблеры больше, чем даже работа с ними самими.

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

В определенной степени современные реализации CL помогут вам понять методы оптимизации кода, общие для всех языков, многие низкоуровневые концепции (см.

выше о C), многопоточное программирование и параллелизм в целом (все знают, откуда Google взял эту идею).

карта Уменьшать ?), и даже с принципами построения сложных систем (хотя это, конечно, приходит больше с опытом).

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

Лично мне уже давно некоторый опыт работы с CL помог лучше понять суть и назначение XML, а также каким-то образом помог понять организацию и общие принципы построения графических интерфейсов и GUI-фреймворков.

Еще есть Haskell, да, который, говорят, тоже «просветляет».

Но лично я считаю Haskell неким синтаксическим сахаром над парой базовых понятий, которые на самом деле имеются в Lisp, только в более общей, а потому менее заметной, и, естественно, менее обязательной форме.

Эти понятия:

  • Сопоставление с образцом (ну А.

    Д.

    Т.

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

  • Лень, которая сводится к потокам и замыканиям.

  • Полиморфизм (что, собственно, и является причиной наличия всей этой шелухи с типами в Haskell).

    Параметрический полиморфизм концептуально является подмножеством динамической типизации, а ad-hoc — это диспетчеризация типов (которая в Lisp может быть достигнута простым если + печатать И более мощные механизмы, такие как CLOS).

    Кто-то скажет — но в Хаскеле это во время компиляции! Да, но я не думаю, что это что-то такое уж особенное — при желании можно писать макросы и передавать операции над типами во время компиляции и на Лиспе (и нет, для этого не придется изобретать новый язык» поверх» CL, вам просто придется работать с объектами «лексических сред», которые хоть и не указаны в стандарте их конкретный формат, но присутствуют во всех основных реализациях и предоставляют информацию о типах), хотя тогда вы приходится работать только с подмножеством системы типов CL, так как в целом она неразрешима даже в динамике, как я уже говорил выше.

Теги: #Lisp #common lisp #программирование #языки программирования #Lisp
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.