Почему Racket? Почему Lisp?

в 6:16, , рубрики: Racket, Scheme, Программирование

Перевод

Великолепный Racket и практичный Typography стали возможны благодаря издательской системе под названием Pollen. Я создал Pollen с помощью языка программирования Racket. Racket является потомком Scheme, который, в свою очередь, является потомком Lisp.

Таким образом, хотя Racket - это не Lisp (в специфическом понимании Common Lisp), это Lisp (в смысле семейства языков). Его основные идеи — и основные достоинства — являются общими с Lisp. Поэтому говорить о Racket - значит говорить о Lisp.

В создании прикладных проектов, Лисп встречается редко. Особенно это касается Racket. Таким образом, прежде чем я начал свое приключение с Lisp, я хотел понять издержки и преимущества использования Lisp. Почему у Lisp-ов такая отличная репутация, но мало пользователей? Увидел ли я что-то, что пропустили остальные? Или они знали что-то, чего не знал я? Чтобы выяснить это, я прочитал все, что смог найти о лиспе, включая "Хакеров и художников" Пола Грэма и "Практический Common Lisp" Питера Сейбела. (Ну хорошо, только части, ведь это большая книга.)

Что я обнаружил, так это множество лестных отзывов о Лиспе от опытных Лисп программистов. (Также много критики Лиспа от его недоброжелателей.) Чего я не нашел, так это простых, убедительных аргументов в его пользу. Итак, вот почему Racket был для меня подходящим инструментом, и в чем я вижу практические преимущества Лиспов в целом.

Обратимся к первоисточнику

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

Но в последние несколько лет я все больше времени уделяю программированию. Оно приносит мне доход. И по простейшему определению: "приносит ли вам деньги этот навык?", как я полагаю, я могу претендовать на звание профессионального программиста. И поскольку большая часть моих усилий по программированию связана с Racket, я квалифицируюсь как профессиональный программист Racket.

Имейте в виду, я не утверждаю, что я опытный программист. В сообществе Racket, где много докторов наук и профессоров в области компьютерных наук, у меня нет другого выбора, кроме как признать свою относительную неопытность. Отсюда и название моего выступления на RacketCon 2014: "Как слепая белка на Ferrari".

Тем не менее, несмотря на мою ограниченность как программиста, с Racket я смогу воплощать большие идеи в программы быстрее и с меньшим количеством ошибок, чем на любом другом языке, который я использовал раньше (а их было много — БЕЙСИК, Си, C++, Perl, Java, JavaScript, Python и другие). Поскольку в последнее время мне не делали пересадки мозга, в Racket как в языке должно быть что-то особенное.

Если вы не знакомы с семейством языков Лисп

Большинство программистов слышали о лиспе по двум причинам. Во-первых, это один из старейших компьютерных языков, который используется с 1958 года. Во-вторых, за ним закрепилась репутация языка для умников. Первоначально эта репутация возникла из-за его связи с областью искусственного интеллекта. С тех пор эта репутация поддерживается периодическими рекомендациями уважаемых программистов (в последнее время Эрика Рэймонда и Пола Грэма) и непреходящей славой учебника, используемого на вводных курсах информатики в Массачусетском технологическом институте, "Структура и интерпретация компьютерных программ" (в котором используется Scheme, и который я прочитал от начала до конца).

Но как основные инструменты программирования, Lisp и его потомки в основном игнорировались. Популярность языков программирования сложно измерить, но вот простой пример — давайте подсчитаем количество проектов, размещенных в настоящее время на GitHub. Можно было бы поспорить о точности этого метода, за исключением того, что его результаты указывают общую тенденцию:

Язык

Кол-во Проектов GITHUB

JavaScript

7,488,087

Java

6,570,575

Python

4,017,958

PHP

2,123,489

Ruby

1,699,590

Clojure

64,239

Lisp

17,989

Scheme

12,412

Racket

11,725

Последними четырьмя языками являются языки семейства Лисп, на которые в совокупности приходится всего 106 365 проектов. На Racket приходится лишь малая часть этой небольшой доли.

Популярные языки программирования не обязательно хороши — посмотрите, что находится в начале этого списка. Но непопулярные языки часто имеют фатальные недостатки, которые препятствуют более широкому внедрению. Когда я рассматривал языки, у Racket было много причин рекомендовать его. Но был ли какой-то фатальный недостаток, который я упустил из виду? И, перейдя на Lisp, не загоню ли я себя в угол? Я хотел понять риски и выгоды.

Пустые похвалы ни к чему не приведут

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

Например, в своем эссе “Как стать хакером" Эрик Рэймонд говорит: "Lisp стоит изучать ради... глубокого просветления, которое вы получите, когда наконец овладеете им. Этот опыт сделает вас лучшим программистом на всю оставшуюся жизнь, даже если вы никогда особо не воспользуетесь самим Lisp”. К сожалению, Рэймонд не подкрепляет это утверждение описанием “опыта просветления”, не объясняет, почему он “глубок” и как он улучшит ваши навыки программирования в целом.

Справедливости ради, эссе Рэймонда не посвящено Лиспу. Но сравните с книгой Пола Грэма "Превзойди середнячков(иначе говоря это название можно интерпретировать как: СТАТЬ ЛУЧШИМ!)", которая посвящена Лиспу. Грэм начинает со слов Рэймонда, который хвалит Лисп, и, похоже, готов конкретизировать свои претензии(на первое место).

Вместо этого он разбивает этот тезис на более мелкие части лести. “Мы знали, что Lisp - действительно хороший язык для быстрого написания программного обеспечения”. Из-за каких характеристик? Он не говорит, но затем описывает Lisp как свое “секретное оружие”. Итак, а в чем секрет? Он говорит, что “языки программирования различаются по мощности”. Хорошо, но что именно делает Lisp более мощным?

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

Я преисполнился надежды, когда открыл книгу Питера Сейбела “Практический Common Lisp” и увидел, что введение озаглавлено "Почему лисп?". О да, наконец то, скажите мне! Но Сейбел повторяет утверждение Грэма: “Используя [Lisp], вы сможете сделать больше и быстрее, чем при использовании практически любого другого языка”. Хорошо, но как? Сейбел задается вопросом: “Мне нравится Лисп из-за какой-то особенности в устройстве моего мозга. Это может быть даже генетическим, поскольку у моего отца эта любовь к Лиспу тоже есть”. Это не вдохновляет тех из нас, кто не входит в вашу семью. В конечном счете, он резюмирует привлекательность Лиспа, описывая его как “программируемый язык программирования”. Но я никогда не пользовался программируемыми языками программирования. С чего мне следует начать?

И, кстати, когда я получу обещанные вами скорость и мощь?

Короче говоря, что я получу от этого сейчас?

Это фундаментальный вопрос, на который сторонникам Lisp приходится отвечать новым пользователям. Но чаще всего его обходят стороной. Я не придираюсь к Рэймонду, Грэму или Сейбелу. Они отличные авторы. Как программисты, они гораздо круче меня. По мере того, как я узнаю больше о Лиспе, я возвращаюсь к этим статьям, и они приобретают больше смысла.

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

Сейбел перекладывает ответственность на других, когда говорит, что для того, чтобы понять преимущества Lisp, “вам придется немного изучить Lisp и убедиться в этом самим”. Конечно, этот метод работает — после нескольких месяцев использования Racket преимущества Lisp стали для меня очевидны. Но это также потребовало затратить примерно 100-200 часов.

Это требует слишком многого. Если языки Lisp настолько хороши, то должна быть возможность кратко и практично описать их преимущества. Должна быть возможность продемонстрировать мощь Lisp за один час, а не за 100. Если сторонники Лиспов откажутся это делать, то мы не должны удивляться тому, что эти языки останутся в самом низу по популярности.

Итак, что же мне от него нужно?

Одним словом, выразительность - это показатель того, насколько легко воплотить свои идеи в программном коде. Например, такой выразительный язык, как Racket, позволяет написать программу “Hello world” следующим образом:

"Hello world"

В то время как менее выразительный язык — я не буду называть имен — требует этого:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world");
    }
}

Краткость ценна, но выразительность также включает в себя другие качества: точность, удобочитаемость, гибкость, возможность обобщения.

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

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

1. Все является выражением. [Лиспы] Большинство языков программирования представляют собой комбинацию двух различных компонентов: выражений (элементов, которые вычисляются для получения значения) и операторов (элементов, которые обозначают действие). Например, в Python x = 42 - это оператор, а x + 42 - выражение.

Операторы и выражения отличаются друг от друга, потому что, выражения могут быть естественным образом вложены друг в друга, а вот операторы - не могут. Например, в Python это допустимое выражение:

42 + 101

То же самое происходит и с заменой правого значения другим выражением:

42 + (100 + 100)

Но эта запись уже неверна:

42 + if 1 < 0:
         100
     else:
         200

Почему? Потому что в Python стандартное условие if является оператором и может использоваться только в определенных позициях.

Однако, превращая все в выражения, Лисп устраняет это ограничение. Поскольку выражения являются вкладываемыми, все, что есть в языке, можно комбинировать практически с чем угодно. Например, поскольку условие if является выражением, вы можете использовать его вместо значения:

(+ 42 (if (< 1 0) 100 200))

“Но подождите! В Python есть троичное условное выражение!” Сути это не меняет, но ладно — вы действительно можете написать так:

42 + (100 if 1 < 0 else 200)

Но теперь предположим, что мы хотим использовать условное выражение вместо оператора, а не правого значения, как раньше. Поскольку в Лиспе все является выражением, включая сам оператор, это легко:

((if (< 1 0) + *) 42 100)

Но если вы попробуете то же самое в Python, это вызовет синтаксическую ошибку:

42 (+ if 1 < 0 else *) 100

Почему? Потому что операторы Python не являются выражениями.

Это искусственный пример. Дело не в том, что вы обязательно захотите это делать, а в том, что Лисп позволяет это. Вы не столкнетесь с синтаксическими барьерами, которые скрываются в других языках. Смысл этого для программиста в том, что это упрощает вашу работу, потому что все легко объединяется. Это также расширяет ваши возможности, потому что вы можете комбинировать части языка необычными способами, если вам этого захочется.

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

Так же обстоит дело и с языком, состоящим только из выражений. Если вы находите эту идею интересной, поздравляю — возможно вы программист на Лиспе. (Если вы находите эту идею странной и пугающей, сейчас самый подходящий момент, чтобы отказаться от нее).

2. Каждое выражение представляет собой либо отдельное значение, либо список. [Лиспы] Отдельные значения - это такие вещи, как числа, строки и хэш-таблицы. (В Лиспе их иногда называют атомами) В этом нет ничего сложного.

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

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

Сейбел описывает Lisp как инструмент, позволяющий “делать больше и быстрее”. Здесь вы можете начать понимать, почему это так. Языки Lisp чрезвычайно гибкие и позволяют соединять их части. Это означает, что то, как вы относитесь к программируемой задаче, может быть очень близко к тому, как вы на самом деле ее программируете. (Именно поэтому Лисп традиционно отлично подходит для создания прототипов и исследовательской работы).

Честно говоря, получить максимальную отдачу от Lisp - это значит научиться лучше использовать лисповские идиомы списков и выражений. По этой причине я согласен с Сейбелом — попробовать самому - лучший способ убедиться в преимуществах. По мере того как вы будете осваивать списки и выражения, это будет приносить все больше пользы во всем языке. Вы увидите, как крошечные строки кода могут выполнять колоссальный объем работы. Вы также начинаете понимать, что даже в таком хорошо разработанном языке, как Python, вы тратите много времени на приведение своих идей в соответствие с его ограничениями, например, "на бритье невидимого яка".

3. Функциональное программирование.[Лисп] Да, я знаю, что другие языки предлагают возможности функционального программирования и что Лисп не считается чисто функциональным языком. Но многие программисты не знакомы с этой идиомой и, следовательно, склонны недооценивать ее преимущества. Я это знаю, потому что принадлежал к этой категории.

Функциональное программирование не означает программирование с помощью функций. Это делают все. Функциональное программирование относится к более строгому стилю, при котором функции получают определенные данные в качестве входных данных, обрабатывают только эти данные и возвращают результат. В функциональном программировании функции избегают двух привычек, распространенных в других языках: мутации (т.е изменения переданных в функцию данных, а не возврат значения) и зависимости от состояния (т.е дополнительного контекста, который не предоставляется в качестве входных данных, например, глобальные переменные).

“Подождите, мне нравятся state и mutation. Зачем вам их убирать?” Потому что они ложные друзья. Они противоречат основной концепции функции, которая заключается в инкапсуляции данных и алгоритмов. Когда функция полагается на state или mutation, она работает за пределами этих границ. Таким образом, вы либо берёте на себя всё большую нагрузку по сопровождению кода, чтобы отслеживать, как функции влияют друг на друга, либо наблюдаете, как ваша программа тонет в болоте загадочных, сложных ошибок.

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

Этот упрощающий аспект функционального программирования - еще одна причина, по которой вы можете “делать больше и быстрее” с помощью Lisp. Разница между прототипным и производственным кодом часто оказывается незначительной, потому что в начале вы используете не так много упрощений. Программа растет и развивается более плавно, потому что легко изменить одну часть, не вызывая побочных эффектов в других местах.

4. Макросы. [Racket] Некоторые Racket программисты спорят с этим термином, предпочитая термин: синтаксические трансформации, потому что макрос Racket может быть более сложным, чем обычный макрос Common Lisp.

Макрос в Common Lisp - это функция, которая запускается во время компиляции, принимая символы в качестве входных данных и вводя их в шаблон для создания нового кода.

Макросы в Racket, с другой стороны, основаны на концепции гигиены. Они могут обрабатывать макросы в стиле Common Lisp, а также более сложные синтаксические перестановки.

Но забудьте об этом — что вам дают эти макросы? Как программист, вы в конечном итоге получаете двойную выгоду каждый раз, когда запускаете файл: Racket запускает макросы (которые изменяют исходный код), а затем и сам код.

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

5. Создание новых языков программирования. [Racket] Когда я впервые прочитал, что Racket можно использовать для создания новых языков, у меня возникли две мысли: серьезно ли это? и действительно ли я хочу этим заниматься? Ответы были "да" и "о, черт возьми, да".

Используя выражения, списки и макросы, Racket предоставляет вам огромную семантическую гибкость. Но, кроме того, он также добавляет синтаксической гибкости, поскольку вы можете определить средство чтения, которое преобразует поверхностный синтаксис в стандартные S-выражения Racket, и расширитель(expander), который определяет значение этих S-выражений.

Вы можете использовать это средство для создания специализированных диалектов Racket. Или реализовать более ранние языки. Или создать совершенно новые языки со своими собственными правилами. Вы можете использовать любой из этих языков в DrRacket для написания кода для новых проектов. (Эти специальные языки иногда называют доменно-ориентированными языками или DSL.) Scribble - это DSL, основанный на Racket; Pollen - это набор DSL, основанный на Scribble.

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

(Продолжение этой статьи — Почему ЯОП? Почему Racket?— посвящено этой теме.)

6. Библиотеки и документация. [Racket] Возможно, это не выглядит как конкурентное преимущество — разве не на каждом языке программирования есть библиотеки и документация?

Да, но, вероятно, не в том виде. В результате многолетнего использования в исследовательских целях — основная команда разработчиков Racket состоит из профессоров компьютерных наук - библиотеки и документы Racket больше похожи на передачу от высокоразвитого инопланетного разума.

Конечно, вы получаете все необходимое: веб-сервер, JSON, XML, чертежи, интерфейс с внешними функциями и так далее. Затем вы замечаете пакеты, которые, возможно, не ожидали увидеть: фреймворк приложения с графическим интерфейсом, математическое построение графиков, система распространения пакетов, модульный тестер. Кроме того, (и вы начинаете немного "плыть"): разработка семантики? Визуализатор будущего?

Я не буду притворяться, что знаю, для чего все это нужно. Многое из этого для меня непостижимо. Но мне это нравится. Каждую неделю, когда я пользуюсь Racket, я в конечном итоге изучаю новую часть библиотеки и узнаю что-то новое. В отличие от других языков, которые, кажется, при контакте убивают мозговые клетки (как я понимаю, практически все, что называется *Script).

Такое изучение возможно только благодаря действительно выдающейся документации Racket. Она обширна, подробна, точна и доступна. Убедитесь сами.

7. DrRacket. [Racket] Да, я знаю, как пользоваться командной строкой. Но Racket включает в себя кроссплатформенную графическую среду IDE под названием DrRacket, которая довольно хороша. DrRacket позволяет редактировать, запускать и отлаживать исходные файлы Racket (или любого другого языка, основанного на Racket — смотрите пункт № 9 в этом списке).

Нет, в нем нет функций поиска и замены на уровне Ginsu, таких как Sublime Text. Но в нем есть полезные функции редактирования, оптимизированные для кода Racket (например, вы можете щелкнуть правой кнопкой мыши по названию символа и переименовать его по всему файлу или перейти от функции к документации к ней).

Более того, командная строка в DrRacket не просто отображает обычный текст — она может отображать сложенные дроби, рисунки, математические графики и других неожиданных гостей. Если ваша командная строка выполняет все это, продолжайте использовать ее.

8. X-выражения. [Racket] Этот выбор в некоторой степени обусловлен моей работой с Racket, которая в основном связана с обработкой документов и набором текста. Но связанные с этим темы возникают в большинстве случаев при веб-программировании. X-выражение - это специальная(особенная) нативная структура данных, которую Лисп использует для представления HTML и других данных в формате XML.

Ну, не “особенная” в буквальном смысле — в соответствии с обычной политикой, X-выражение — это просто еще один список, - но особенный в том смысле, что в других языках программирования его нет. Обычно вы выбираете представление HTML либо в виде строки, либо в виде полного XML-дерева. Строка является неправильной, поскольку она не отражает структуру HTML, определенную ее тегами и атрибутами. Дерево XML показывает эту структуру, но скрывает последовательный характер элементов данных и является громоздким для работы.

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

Учитывая тесное родство между структурами данных на основе XML и языками Lisp, у меня нет объяснения, почему в эпоху Интернета они не часто использовались в паре. Они похожи на арахисовое масло и желе.

9. Scribble. [Racket] Pollen был бы невозможен без Scribble, так что для меня это была самая потрясающая функция Racket. Но этот аргумент не для всех, поэтому я перемещаю его в конец списка.

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

“Таким образом, он похож на язык шаблонов HTML”. Да, в том смысле, что язык шаблонов позволяет встраивать код в текст. И вместе с тем не похож, потому что язык шаблонов обычно представляет собой пиджин(упрощённую)-версию реального языка программирования. Scribble, напротив, позволяет вам вызывать любой код Racket, просто добавляя командный символ в начале. В соответствии с уже разработанной темой, этот подход является одновременно более простым (потому что в нем почти нет ничего нового для изучения) и более эффективным (потому что в Racket вы можете вызывать все, что угодно).

Благодаря сочетанию текста и кода Scribble больше похож на LaTeX. Хотя в нем нет возможностей набора текста в LaTeX, возможности программирования в нём намного лучше.

10. Возможности для участия. [Racket] Теоретически, проекты по разработке программного обеспечения с открытым исходным кодом дают возможность группам разработчиков объединяться и совместно создавать более эффективные решения, чем они могли бы по отдельности.

На практике я обнаружил, что они распределяются бимодально: с одной стороны - недокументированные сольные проекты, которые продвигаются урывками (если вообще продвигаются); с другой - зрелые, популярные проекты, которые могут пугать новых участников.

Как проект с открытым исходным кодом, Racket находится на среднем уровне. Основная команда разработчиков работает вместе уже много лет, и коммиты остаются быстрыми и яростными. Но они дружелюбные ученые, а не самодовольные эгоисты, и по-прежнему восприимчивы к улучшениям во всей системе. Если у вас есть идея получше, они прислушаются; если вы закодируете ее в соответствии с их стандартами и отправите запрос на доработку, они ее примут.

[Обновление от 2021 года: я больше не участвую в Racket из-за злоупотреблений и травли со стороны руководства проекта. Однако все в более широком сообществе Racket всегда были отзывчивы и добры.]

Цель этого списка - рассказать вам о положительных сторонах. Это не значит, что в нем нет отрицательных сторон. Небольшой штат программистов Racket означает, что, когда вы попадаете в трудную ситуацию, вполне возможно, что никто никогда не видел вашей проблемы (= обратная сторона закона Линуса). Если бы я захотел нанять программиста Racket, вариантов было бы немного.

И все же, почему бы мне не проявить энтузиазм? То, чего мне удалось достичь с помощью Racket, оказалось чрезвычайно полезным, познавательным и увлекательным — самым увлекательным за более чем 25 лет работы программистом.

Если вы думаете, что я говорю как фанат или член культа, я могу с этим смириться. Но это люди, чей энтузиазм несоразмерен реальности. Здесь я постарался не витать в облаках (и не лезть в чужие дела) и объяснил конкретные практические особенности, благодаря которым Racket доставляет мне такое удовольствие в моей работе.

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

В заключение я расскажу о "большом кахуне"(американская метафора, обозначающая лучшего или главного босса) ...

Ждет ли вас «глубокое просветление»?

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

В некотором смысле Лисп и его потомки - это нечто большее, чем языки программирования. Они являются инструментами в более широком интеллектуальном исследовании теории вычислений. Изобретатель Лиспа Джон Маккарти изначально рассматривал Лисп как “способ описания вычислимых функций, гораздо более точный, чем машины Тьюринга”, и адаптировал для этого нотацию лямбда-исчисления. Ракет точно так же вырос из научно- исследовательских работ.

Теория вычислений - лишь одно из многих великих научных открытий, сделанных за последние 100 лет. Но я не использую квантовую механику, теорию относительности или секвенирование ДНК в своей повседневной работе. Однако, когда я программирую, я использую вычисления.

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

Пол Грэм называет Lisp “секретным оружием”. Я бы уточнил: сам по себе Lisp секретным оружием не является. Скорее, вы им являетесь, потому что язык Lisp дает вам шанс раскрыть свой потенциал как программиста и мыслителя и тем самым повысить ваши ожидания относительно того, чего вы можете достичь.

Если это не шаг к просветлению, то я не знаю, что это такое.


Потрясающее применение Racket - это программирование, ориентированное на язык, о котором я расскажу в продолжении этой статьи — Зачем ЯОП (программирование, ориентированное на язык)? Почему Racket?

Автор: IisNuINu

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js