Наверное, эту статью следовало опубликовать раньше двух предыдущих, в этой моей серии о Common Lisp, но лучше поздно, чем никогда.
Когда-то, когда я читал статьи Пола Грэма и только начинал изучать CL, я довольно скептически отнесся к утверждению, что Лисп позволяет лучше понимать другие языки, и вообще программист, знающий CL выучит любой другой язык максимум за пару недель, и будет писать на нем даже лучше, чем пишет на нем большинство людей, знающих этот язык пару лет. Но теперь я пришел к выводу, что это утверждение по-прежнему верно.
Поверьте мне.
Новые идеи в языках программирования не появлялись с середины 90-х годов, то есть как раз со времени стандартизации Common Lisp. Если вы возьмете одну из современных реализаций CL, например SBCL, и более или менее поймете стандарт ANSI CL и его расширения, предоставляемые этой реализацией, тогда вы поймете и поймете такие парадигмы программирования, как:
- Императив и его вариации (у CL даже есть goto! А остальные элементы управления потоком управления в нем управляются аналогами из всех других языков)
- Структурный (без комментариев)
- Объектно-ориентированный и его разновидности (От замыканий до CLOS)
- Функционален (CL призывает локализовать побочные эффекты и по возможности писать без них)
- Управляемый событиями (что сводится к обратным вызовам, то есть объектам функций)
- Обобщенный (см.
конец статьи о полиморфизме)
- Метапрограммирование (ведь это Лисп! Программа сама по себе является объектом языка)
- В некоторой степени параллельное программирование
- И так далее, и тому подобное — используя языковые инструменты, которые непосредственно реализуют предыдущие парадигмы, и скрепляя всё вместе с помощью макросов, CLOS и система условий , в язык можно добавить что угодно: от логической парадигмы и встроенного пролога до визуального программирования.
В принципе, это справедливо даже для C, поскольку я на собственном опыте убедился, что работа с FFI и встроенным ассемблером помогает понять C и обычные ассемблеры больше, чем даже работа с ними самими.
Многие функциональные, в том числе эзотерические, языки после знакомства с CL не будут выглядеть такими эзотерическими, и в принципе будут на виду.
В определенной степени современные реализации CL помогут вам понять методы оптимизации кода, общие для всех языков, многие низкоуровневые концепции (см.
выше о C), многопоточное программирование и параллелизм в целом (все знают, откуда Google взял эту идею).
карта Уменьшать ?), и даже с принципами построения сложных систем (хотя это, конечно, приходит больше с опытом).
Я говорю только о языках и общих концепциях программирования, а не о конкретных фреймворках и библиотеках и любых вещах, ортогональных реальным концепциям языка, но, возможно, вы также будете более продуктивны в их освоении, подметив закономерности, знакомые вам по Lisp, и, следовательно, быстрее структурировать информацию.
Лично мне уже давно некоторый опыт работы с CL помог лучше понять суть и назначение XML, а также каким-то образом помог понять организацию и общие принципы построения графических интерфейсов и GUI-фреймворков.
Еще есть Haskell, да, который, говорят, тоже «просветляет».
Но лично я считаю Haskell неким синтаксическим сахаром над парой базовых понятий, которые на самом деле имеются в Lisp, только в более общей, а потому менее заметной, и, естественно, менее обязательной форме.
Эти понятия:
- Сопоставление с образцом (ну А.
Д.
Т.
- Лень, которая сводится к потокам и замыканиям.
- Полиморфизм (что, собственно, и является причиной наличия всей этой шелухи с типами в Haskell).
Параметрический полиморфизм концептуально является подмножеством динамической типизации, а ad-hoc — это диспетчеризация типов (которая в Lisp может быть достигнута простым если + печатать И более мощные механизмы, такие как CLOS).
Кто-то скажет — но в Хаскеле это во время компиляции! Да, но я не думаю, что это что-то такое уж особенное — при желании можно писать макросы и передавать операции над типами во время компиляции и на Лиспе (и нет, для этого не придется изобретать новый язык» поверх» CL, вам просто придется работать с объектами «лексических сред», которые хоть и не указаны в стандарте их конкретный формат, но присутствуют во всех основных реализациях и предоставляют информацию о типах), хотя тогда вы приходится работать только с подмножеством системы типов CL, так как в целом она неразрешима даже в динамике, как я уже говорил выше.
-
Xbox Underground. Молодой И Беззаботный
19 Oct, 24 -
Как Определить?
19 Oct, 24 -
Требуется Ui-Дизайнер
19 Oct, 24 -
Капча: Идея!
19 Oct, 24 -
Виртуальные Миры Объединены В Единую Сеть
19 Oct, 24