Мова обробки списків Lisp

Lisp – мультипарадигмальна мова: об'єктно-орієнтоване, функціональне, процедурне програмування. З'явився 1958 р. Автор: Джон Маккарті. Типізація даних: потужна, динамічна. Діалекти: Common Lisp (CLOS), Scheme, Arc, Clojure, BEE Lisp, мови розширення: AutoLisp та ELisp. Вплинув на Io, Nemerle, Python, Ruby, Smalltalk, Лого
Лісп (Lisp, від англ. List Processing Language - "мова обробки списків"; сучасне написання: Lisp) - сімейство мов програмування, програми та дані в яких представляються системами лінійних списків символів. Лісп є другою в історії (після Фортрана) високорівневою мовою програмування, що використовується до цього дня. Творець Ліспа Джон Маккарті займався дослідженнями в галузі штучного інтелекту (надалі ІІ) і створена ним мова досі є одним з основних засобів моделювання різних аспектів ІІ.
Традиційний Лісп має динамічну систему типів. Мова є функціональною, але багато пізні версії мають також риси імперативності, до того ж, маючи повноцінні засоби символьної обробки, стає можливим реалізувати об'єктну орієнтованість, прикладом такої реалізації є платформа CLOS.
Мова Лісп, поряд з мовою Ada, пройшла процес фундаментальної стандартизації для використання у військовій справі та промисловості, внаслідок чого з'явився стандарт Common Lisp. Його реалізації існують більшість платформ.
Однією з основних ідей мови Lisp є представлення кожного символу як вузла багатокоординатної символьної мережі; при цьому координати, властивості, рівні мережі записані в слотах символу. Основні слоти:
- ім'я символу (основне Аристотелеве А=А з якого виростає лямбда-числення),
- список властивостей, що розширюється (можна вільно розширити слотову систему зручним для вирішення завдання способом).
Мова Лісп є мовою системного програмування для так званих Лісп-машин, що вироблялися у 80-ті роки, наприклад фірмою Symbolics.
Основний механізм мови Лісп — інкапсульована до списку визначальна голова списку та під'єднаний до неї хвіст списку, який також рекурсивно може бути списком. Лисп-машина здатна сприймати кожен список, що надходить на неї, на самому абстрактному рівні, наприклад як мета-Лісп-машину, що модифікує сприймаючу машину. У такому динамічному, високоабстрактному середовищі можна реалізувати як суворо наукові системи, так і безліч програмістських трюків і генераторів всіляких машин.
Будь-яка програма мовою Лісп складається з послідовності виразів (форм). Результат роботи програми полягає у обчисленні цих виразів. Всі вирази записуються у вигляді списків — однієї з основних структур Лиспа, тому вони можуть бути легко створені за допомогою самої мови. Це дозволяє створювати програми, які змінюють інші програми чи макроси, що дозволяють істотно розширити можливості мови.
Список є послідовністю елементів будь-якого роду, зокрема інших списків. Наприклад, (1 3/7 'foo #'+) складається з цілого числа, раціонального дробу, символу foo та покажчика на функцію додавання. Вирази надаються списками в префіксному записі: перший елемент має бути формою, тобто функцією, оператором, макросом або спеціальним оператором; інші елементи - аргументи цієї форми, що передаються формі для обробки. Функція list повертає список, що складається з її аргументів: наприклад, (list 1 3/7 'foo #'+) повертає список, згаданий раніше. Якщо деякі елементиє виразами, спочатку обчислюється їх значення: (list 1 2 (list 1 2)) повертає (1 2 (1 2)). Арифметичні оператори записуються за тим самим принципом, наприклад (+ 4 (* 2 3)) видає 10.
Спеціальні оператори дозволяють керувати послідовністю обчислень. З їх допомогою реалізуються розгалуження та цикли. Оператор if дозволяє обчислити один із двох виразів залежно від виконання умови, яке теж є виразом. Якщо його результат не БРЕХНЯ (не nil), то обчислюється перший аргумент, інакше другий. Наприклад, (if nil (list 1 2 "foo") (list 3 4 "bar")) завжди повертає (3 4 "bar").
Синтаксис у формі Бекуса - Наура:
Приклад програми, що виводить повідомлення "Hello, world!":
Приклад Куайн (програми, що виводить свій вихідний код) на Ліспі:
Ця програма має працювати на більшості діалектів Ліспа, у тому числі і на Scheme.
Ітеративна версія функції визначення N-го числа Фібоначчі з використанням макросу Loop:
Рекурсивна версія функції N-го числа Фібоначчі:
Застосування
Перші сфери застосування мови Лісп були пов'язані з символьною обробкою даних та процесами прийняття рішень.
Найпопулярніший сьогодні діалект Common Lisp є універсальною мовою програмування. Він широко використовується в різних проектах: Інтернет-сервери та служби, сервери додатків і клієнти, що взаємодіють з реляційними та об'єктними базами даних, наукові розрахунки та ігрові програми.
Один із напрямків використання мови Lisp — її використання як скриптова мова, що автоматизує роботу в ряді прикладних програм:
- мова Лісп використовується як мова сценаріїв у САПР AutoCAD (діалект AutoLISP);
- його діалект – SKILL – використовується для написанняскриптів у САПР Virtuoso Platform компанії Cadence Design Systems;
- мова Лісп використовується як мова сценаріїв у видавничому програмному забезпеченні Interleaf/Quicksilver (діалект Interleaf Lisp);
- у віконному менеджері Sawfish застосовується спеціальний діалект Лиспа Rep, який значною мірою повторює діалект Лиспа від Emacs;
- діалект Scheme використовується як одна зі скриптових мов у графічному процесорі Gimp;
- діалект GOAL використовується для високодинамічних тривимірних ігор;
Сфери застосування мови Лісп різноманітні: наука та промисловість, освіта та медицина, від декодування геному людини до системи проектування авіалайнерів.
Справа в тому, що в його постановці та висновках зроблена заміна, аналогічна заміні в шкільному жартівливому завданні на кмітливість, в якій запитується: - Скільки яблук на березі, якщо на одній гілці їх 5, на іншій гілці - 10 і так далі При цьому учні навмисно відволікаються від того основного факту, що на березі яблука не ростуть, в принципі.
В експерименті Майкельсона порушується питання про рух ефіру щодо інтерферометра, що лежить в лабораторній системі. Однак, якщо ми шукаємо ефір, як базову матерію, з якої складається вся речовина інтерферометра, лабораторії, та й Землі в цілому, то, природно, ефір теж буде нерухомий, тому що земна речовина є всього лише певним чином структурований ефір, і ніяк не може рухатися щодо себе.