Какое подмножество функциональных аспектов программирования и Lisp-подобных функций предоставляет JavaScript? - PullRequest
9 голосов
/ 20 ноября 2011

Прямо в точку, в https://stackoverflow.com/questions/4696618/is-haskell-a-lisp?answertab=votes#tab-top, есть комментарий Кевина Канту, в котором говорится:

Да, выходя за рамки только синтаксиса, JavaScript, скорее, скорее Lisp, чем Haskell,(Изначально задумывался как реализация Схемы ...)

Кроме того, в Lambda the Ultimate: компилятор Lisp to JavaScript в 100 строк , они говорят:

Сразу становится ясно, что JS и Lisp тесно связаны на уровне семантики [...]

Я знаком с Lisp и функциональным программированием, но не с JavaScript.Таким образом, эти предложения заставляют задуматься, насколько мощным является JavaScript.До сих пор я читал, что он предоставляет лямбда-выражения и замыкания.Какие еще функциональные концепции программирования и функции, подобные Лисп, он предоставляет?Предоставляет ли он, например, рекурсию хвостового вызова, или макросы, или возможность манипулировать кодом как данными (например, Lisp)?

1 Ответ

10 голосов
/ 20 ноября 2011

Некоторые вещи, которые предоставляет JavaScript, можно считать «похожими на Лисп»:

  • Функции первого класса (включая лямбды и замыкания)
  • Динамическая типизация
  • Динамическая объектная модель, которая имеет некоторые сходства с CLOS
  • Читаемый формат данных, который соответствует формату исходного кода (JSON)
  • Оценка времени выполнения с помощью функции "eval"(это можно использовать в интерактивном REPL )

Некоторые вещи, которых нет в Javascript, довольно распространены или имеют ключевое значение для других Лиспов:

  • Гомоикональное представление для кода и данных (S-выражения)
  • Встроенные литералы для связанных списков / последовательностей
  • Поддержка неизменяемых структур данных в целом (особенно верно для Clojure, где каждые структура данных постоянная и неизменная)
  • Обширная система макросов для метапрограммирования
  • Дополнительная статическая типизация для оптимизации производительности (например, type намекает на Common Lisp или Clojure)
  • Поддержка параллелизма
  • Оптимизация вызовов в хвосте
...