Прошло некоторое время с тех пор, как Пол Грэм написал свое эссе Месть ботаников, исследующее различия между шепелявостью и другими языками, в нем он исследует 9 идей, которые возникли в шепелявости и были постепенно скопированы в другие языки (или, может быть, заново изобретены) в последние 40 лет.

Последние 2 идеи по-прежнему уникальны для Lisp:

  • Обозначение кода с использованием деревьев символов и констант. (Код — это данные)
  • Весь язык там все время.

Что Пол имел в виду под тем, что весь язык присутствует все время, так это то, что даже при чтении или компиляции вашей программы вы можете выполнять свой собственный код, эта идея в сочетании с идеей о том, что ваш код является данными, дает вам возможность изменять код как есть. прочитать или скомпилировать это то, что дает нам макросы Лиспа!

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

Посмотри на это:

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

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

Я уверен, что с groovy и scala это будет сложная тема, потому что вам нужно будет понять, как AST работает на этом конкретном языке.

Идея sweet.js выглядит очень интересно, потому что они не дают вам полный язык во время компиляции, у вас есть правила. Он не такой мощный, как lisp, groovy или scala, но определенно проще. Честно говоря, мне эта идея нравится больше, чем то, что сделали Groovy и Scala. Вы даже можете использовать это, чтобы получить больше энергии. Вот кто-то, кто реализовал лисп на javascript с помощью sweet.js и все время отдавал себе весь язык: http://ki-lang.org/

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

Так или иначе, похоже, грядет новая месть кретинов.