Що зробило Lisp особливим

«Найбільша з будь-коли створених мов програмування«
- Alan Kay, "on Lisp"

Що зробило Lisp особливим

Коли Маккарті розробив Lisp наприкінці 1950-х, він радикально відрізнявся від існуючих мов, найголовнішою з яких був Фортран.

Lisp втілив дев'ять нових ідей:

1. Умовні висловлювання (Conditionals). Умовні висловлювання це if-then-else конструкція. Нині ми сприймаємо їх як належне. Вони були винайдені МакКарті під час розробки Lisp. (Fortran в той час мав тільки goto-ствердження, тісно пов'язані з інструкцією розгалуження на залізі, що лежить в основі.) Маккарті, будучи в комітеті з Algol, вніс умовні висловлювання в Algol, звідки вони поширилися іншими мовами.

2. Функціональні типи (A function type). У Lisp'і функції це об'єкти першого класу - вони є типом даних, також як числа, рядки і т.д., і мають буквальне уявлення, можуть зберігатися в змінних, можуть бути передані як аргументи, і т.д.

3. Рекурсія (Recursion). Рекурсія, звичайно, існувала як математична концепція до Lisp'а, але Lisp був першою мовою програмування, що її підтримує. (Це, можливо, мається на увазі у створенні функцій як об'єктів першого класу.)

4. Нова концепція змінних (A new concept of variables). У Lisp'і всі змінні є ефективними покажчиками. Значення це те, що є у типів, а не у змінних, а присвоєння або зв'язування змінних означає копіювання покажчиків, а не того, на що вони вказують.

5. Складання сміття (Garbage-collection).

6. Програми складаються з виразів (Programs composed of expressions). Програми на Lisp'і – це дерева виразів, кожне з яких повертає значення. (Деякі Lisp-вирази можуть повертати множинні значення.) Це входить у контраст з Fortran'ом та з безліччю інших успішних мов, які розрізняють «вирази» та «ствердження».

Було природним мати таку відмінність у Fortran'і, тому що мова була лінійно-орієнтованою (не дивно для мови, в якій форматом введення була перфокарта). Ви не могли мати вкладених тверджень. І поки вам були потрібні математичні висловлювання для роботи, не було сенсу в тому, щоб змушувати щось повертати значення, тому що могло не бути чогось, що очікувало повернення.

Обмеження були зняті з появою блочно-структурованих мов, але на той момент було вже запізно. Різниця між висловлюваннями та твердженнями вже закріпилася. Воно перейшло від Fortran'а до Algol'у і далі до їхніх нащадків.

Коли мова зроблена повністю з виразів, ви можете складати вирази як забажаєте. Ви можете написати або (використовуючи синтаксис Дуга)

(if foo (= x 1) (= x 2))

або

(= x (if foo 1 2))

7. Символьний тип (A symbol type). Символи відрізняються від рядків, у цьому випадку можна перевірити на рівність, порівнявши покажчики.

8. Нотація для коду (A notation for code) використання дерев з символів.

9. Вся мова завжди доступна (The whole language always available). Немає явної різниці між часом читання, часом компіляції та часом виконання. Ви можете компілювати або запускати код під час читання, або читати або запускати код поки компілюєте, або читати або компілювати код під час виконання.

Запуск коду під час читання дозволяє користувачам перепрограмувати синтаксис Lisp'а; запуск коду під час компіляції – це основа для макросів; компілювання під час виконання – це основа використання Lisp'ів як мови розширення у таких програмах як Emacs; і нарешті, читання під час виконання дозволяє програмам взаємодіяти, використовуючи s-вирази, ідея, нещодавно перевинена в XML.

Висновок

Коли Lisp був винайдений, всі ці ідеї були дуже далекі від звичайних практик програмування, які диктувалися залізом, доступним наприкінці 1950-х.

Згодом мова за умовчанням, втілена в успіху популярних мов, поступово еволюціонувала у бік Lisp. Пункти 1-5 тепер поширені. Пункт 6 починає з'являтися в мейнстрім. У Python'і в деякому вигляді є пункт 7, хоча відповідного синтаксису немає. Пункт 8, який (з пунктом 9) уможливлює макроси в Lisp'і, досі є тільки в Lisp'і, можливо тому, що (а) він вимагає ці дужки або чогось настільки ж поганого, і (б) якщо ви додасте це останнє збільшення потужності, то більше не зможете стверджувати, що винайшли нову мову, а тільки розробили новий діалект Lisp'а; -)

Хоча це корисно для сучасних програмістів, дивно описувати Lisp з погляду його на відміну від випадкових прийомів, які у інших мовами. Можливо, це не те, про що думав Маккарті. Lisp не був спроектований, щоб виправити помилки Fortran'а; він з'явився швидше як побічний продукт спроби аксіоматизувати обчислення.

Джерело: habr.com

Додати коментар або відгук