Язык программирования Лисп (Lisp): основные элементы, обучение, области применения
Lisp является аббревиатурой для LISt Processing Language — основным списком в структуре языка. Эти семейные языки позволяют специалистам записывать программы, которые работают быстрее, чем на других языках. Язык программирования Лисп и его диалекты такие как Common, Scheme и Clojure, способствуют созданию мощного и гибкого программного обеспечения, необходимого для сложных и быстро развивающихся областей науки и техники.
Существует несколько важных ключевых особенностей, которые отличают языки этого семейства от других языков программирования и делают их идеальными инструментами для приложений искусственного интеллекта и машинного обучения. Lisp имеет серию доменных языков DSL, которые специализируются на определенной области, облегчают формулирование проблем исследования и помогают в установлении стандартов и лучших практик программирования применительно к конкретной области исследований.
История
Лисп является вторым старейшим языком высокого уровня (после FORTRAN), впервые разработанным Джоном Маккарти (Массачусетский технологический институт). Хотя он используется в качестве программного языка во многих областях науки, но после Дартмутской конференции 1956 года, которая считается местом рождение дисциплины искусственного интеллекта(ИИ), он в первую очередь идентифицируется с этой областью науки в течение многих лет.
В ранние годы его неоднородные диалекты разрастались, поскольку находили свое применение на разных платформах. В 1984 году усилия ученых по стандартизации программных языков привели к разработке Common Лисп, который в 1994 году стал стандартом ANSI. Сегодня большинство прикладных направлений пытаются придерживаться этого стандарта.
Еще один ранний диалект - Lisp-Scheme — сохранился до наших дней, является стандартизированным и широко используемым языком для программирования с нуля. Хотя он похож на Лисп, но отличается от него некоторыми элементами, которые позволяют рассматривать его как отдельный язык.
Ключевые моменты программирования
Лисп позволяет программистам писать быстрее. Эмпирическое исследование показывает, что когда специалисты решают те же проблемы в Lisp, C / C ++ и Java, то программы Лисп меньше, и, следовательно, их легче поддерживать, требуется меньше времени для разработки и запуска. Язык программирования Лисп упрощает создание макросов, которые облегчают создание модульных расширений, чтобы помочь специалистам легко разрабатывать плагины для программного обеспечения. Это, в свою очередь, открывает путь для создания отказоустойчивых доменных языков в приложениях любой области исследований или специализации.
Текущее состояние исследований Lisp в области информатики и вычислительной техники находится в точке, когда ожидаемо создания на базе универсального языка, что крайне необходимо, особенно с учетом документированных недостатков основных языков программирования, таких как R и Python. Основные элементы языка имеют несколько других функций, которые отличают его от других:
- В Lisp программисты обычно работают в специальной инкрементной среде интерактивного программирования, называемой циклом чтения eval-print (REPL). Это означает, что система непрерывно считывает выражения, введенные пользователем, оценивает их и печатает результаты.
- Common Лисп был разработан с нуля для создания больших, сложных и длительных приложений и таким образом поддерживает «горячую замену» программного обеспечения - код исполняемой программы может быть изменен без необходимости его прерывания.
- Язык программирования Лисп изобрел обработку исключений, имеет средство обработки ошибок - «систему условий», которое выходит далеко за пределаы большинства других языков.
- Общие реализации Лисп обычно поставляются со сложным «интерфейсом внешней функции» (FFI), который позволяет прямой доступ к Lisp-коду, написанному на C или C ++, а иногда и к Java-коду. Это дает возможность программистам использовать библиотеки, написанные на других языках, что делает эти библиотеки зависимыми от Lisp.
- Лисп дает программистам возможность реализовать сложные операции с данными, а математические конструкции в выразительной и естественной идиоме.
Базовая концепция
Lisp является самым ранним представителем парадигмы языка функционального программирования с нуля. В отличие от процедурных и объектно-ориентированных языков, теоретическая модель которых является машиной Тьюринга, теоретической моделью расчета Лиспа является исчисление Лямбды, разработанное церковью Алонсо. Это различие может быть понято в по следующим направлениям:
- В процедурных языках код работает с данными.
- В объектно-ориентированных языках объекты инкапсулируют код и данные, взаимодействуя друг с другом.
- В функциональных языках данные передаются через функции, но не имеют отдельного собственного существования.
- В чистых функциональных языках это эфемерно.
Однако большинство функциональных языков (включая Lisp) обеспечивают механизм для хранения определенных данных даже тогда, когда они не проходят через функции. Это принимает форму того, что Common Lisp называет «специальные переменные», и эквивалентно «глобальным переменным» на других языках программирования. То есть хотя он и является функциональным языком, он не чисто функциональный, хотя и может использоваться как один, избегая императивных конструкций.
Интерактивность и гибкость
Скорость языков Lisp обычно эквивалентна интерпретируемым языкам. Это также является источником старого мифа о том, что если он интерпретируется, то, следовательно, должен быть медленным, однако это не так. Компиляторы для Лисп существуют с 1959 года, и теперь все основные реализации Common Лисп могут быть скомпилированы непосредственно с машинным кодом, который часто совпадает с кодом C. Например, CL—PPCRE библиотека выражений, написанная в Common Лисп, работает быстрее, чем движок регулярного выражения Perl на некоторых тестах в C, а обучение Lisp намного проще.
Программисты, которые используют интерпретируемые языки, такие как Python или Perl, для удобства и гибкости должны прибегать к написанию на C /C ++ для критически важных частей своего кода и имеют для этого уникальные возможности. Это было показано с прямым бенчмаркингом со стороны создателя языка программирования R, Росса Ихаки, который предоставил тесты, демонстрирующие, что необязательное объявление типа Lisp и компилятор машинного кода позволяют использовать их в 380 раз быстрее, чем R, и в 150 раз быстрее Python.
И не только код, созданный компиляторами по умолчанию, эффективен. Common Lisp, в частности, предлагает уникальные возможности для оптимизации тех частей кода, которые действительно должны быть очень быстрыми. Сюда входят так называемые макросы компилятора, которые могут преобразовывать вызовы функций в более эффективный код во время выполнения и обязательный дизассемблер, что позволяет программистам точно настраивать критические по времени функции до тех пор, пока скомпилированный код не будет соответствовать их ожиданиям.
Оценка специальных форм и макросов
Если первым символом в списке, подлежащем оценке, является имя специальной формы или макроса, так как интерпретатор не оценивает аргументы. Однако специальная форма или макрос могут оценивать некоторые из аргументов, как это обрабатывается, варьируется в специальной форме макроса. Например, специальная форма setq оценивает второй аргумент, но не первый. Пример: рассмотрим вторую строку следующего фрагмента кода: (setq a 1) (setq a (+ 2 3)).
Так как специальная форма setq оценивает свой второй аргумент, форма (+ 2 3) оценивается, получая 5. Однако форма не оценена как 5, а назначена. Если setq была функцией или специальной формой, которая оценивала оба аргумента, операция означала бы, что 5 должно быть равно 1, что, очевидно, абсурдная операция!
Некоторые формы и функции
Ниже перечислены лишь некоторые из специальных форм, макросов и lisp-функции. Некоторые специальные формы и макросы Quote являются специальной формой, которая просто передает свой неоценимый аргумент. Например, значение (quote a) символа a. Для удобства считается, что выражение формы anything эквивалентно (quote anything).
Setq - это специальная форма, которая оценивает свой второй аргумент, а затем присваивает значение переменной, названной ее аргументом.
Let является специальной формой, которая создает лексические переменные. Она имеет следующую базовую форму: (let ({( переменное выражение )} *) { form } *). Формы оцениваются в контексте, в котором каждая из переменных является лексической переменной, связанной с указанным начальным значением. Все выражения вычисляются до того, как какая-либо из переменных привязана, поэтому выражение не может использовать ранее объявленную переменную let.
If является специальной формой, которая выбирает одно из двух выражений для оценки на основе результата какого-либо теста, причем его значение становится значением всего выражения. Это аналогично условному выражению языков C-семейства. Две формы должны быть одиночными s-выражениями, однако progn можно использовать для группировки нескольких форм (аналогично { ... }Java), хотя это, конечно, не чисто функциональный стиль.
Форма else может быть опущена, в этом случае, если тест ложный, результат будет nil. Cond - это макрос, который выбирает одну серию выражений из нескольких для оценки. Он имеет следующую базовую форму (cond {( test {form } *)} *). Каждый тест оценивается поочередно, пока не будет возвращен какой-либо результат, кроме nil - в этот момент будет оценена следующая форма. Значение последней оцениваемой формы становится значением cond.
And — макрос с любым количеством аргументов, которые обычно являются всеми тестами - true.
Or — макрос с любым количеством аргументов, прекращается оценка аргументов, как только происходит истинное (не ноль).
Defun - макрос для определения названных функций. Основной синтаксис (defun name ({ parameter } *) { form } *).
Lambda — макрос для определения анонимных функций.
Операции со списками
Функциональные языки программирования Лисп означают, что аргументы оцениваются до выполнения операции cons- 2 аргумента любого типа. Создает пунктирную пару (cons cell), состоящую из 2 аргументов:
- (cons 'a 3) - это (a . 3) car- 1 аргумент, который должен быть истинным или пунктирным списком. Извлекает car первой ячейки списка.
- (car '(a 3)) - это a. cdr- 1 аргумент, который должен быть истинным или пунктирным списком. Извлекает cdr первой ячейки списка. Если список состоит из более чем одной ячейки, его cdr сам будет списком.
(cdr '(a 3)) - есть (3). caar, cdar, cadr, cddr и еще несколько - любое сочетание до четырех элементов.
List- различное количество аргументов любого типа. Преобразует свои аргументы в настоящий список. Например, (list 'a 'b '(1 2)) - это (a b (1 2)) append- любое количество аргументов - все, кроме последнего, должны быть истинными списками. Объединяет его аргументы в один список, который будет истинным. Например, (append '(1 2) '(3 4)) - это (1 2 3 4).
Арифметические операции
Lisp - язык программирования, который поддерживает арифметические операции, обнаруженные на большинстве языков программирования, а также множество уникальных. Большинство операций принимают любое количество аргументов, например, (* 2 3 4 5) оцениваются до 120.
Все являются функциями, в которых аргументы оцениваются до выполнения операции:
- Сложение — любое количество аргументов, без аргументов дает единичный элемент для сложения, 0 – отрицание — один аргумент, вычитание – два или более аргумента, незаконным без аргументов.
- Умножение — любое количество аргументов, без аргументов дает единичный элемент для умножения, 1. /взаимный — один аргумент.
- Деление – два или более аргумента.
Использования в AutoCAD
Создание папки вне AutoCAD необходимо, чтобы сохранить все Autolisp файлов и любые другие пользовательские файлы. Перед тем как запустить Lisp, выполняют следующие действия:
- Создать папку для размещения пользовательских файлов C: \ autocad_custom \.
- Создать подпапку для Lisp-файлов. C: \ autocad_custom \ autolisp \.
- Поместить пользовательский Lisp-файл в папку autolisp.
- Запустите Lisp autocad.
- Перейти в раздел «Инструменты-> Параметры» и выбрать вкладку «ФАЙЛЫ».
- Развернуть путь поиска файла поддержки, затем нажмите «ДОБАВИТЬ» с правой стороны.
- Нажать «ПРОСМОТР» и найти папку autolisp, созданную ранее, и нажать, чтобы внести изменения.
Загрузка файла Lisp языка программирования:
- Ввести APPLOAD в командную строку и нажать Enter.
- Перейти в папку autolisp и щелкнуть нужный файл Lisp, затем нажать LOAD, а затем ЗАКРЫТЬ.
Использование файла Lisp:
- Обычно после загрузки вводится имя файла Lisp для его использования. Иногда после загрузки отображается сообщение, что нужно ввести упорядоченное для использования Lisp-файла.
- Если имя минус расширение .lsp не работает, и нет сообщения, что вводить, тогда нужно будет открыть файл Lisp либо в VLIDE, либо NOTEPAD и посмотреть часть defun c, чтобы определиться, нужно ввести для запуска файла после загрузки.
Искусственный интеллект Franz
Franz Lisp является первым изобретением в области искусственного интеллекта от ведущего поставщика технологий Semantic Graph Database. AllegroGraph - это сверхмасштабируемая, высокопроизводительная и транзакционная база данных семантического графика, которая превращает сложные данные в эффективные бизнес-идеи. Allegro CL обеспечивает идеальную среду программирования Lisp для создания сложных критически важных приложений, которые решают проблемы реального мира.
Franz Inc. стремится к разработке продуктов на основе рынка, наивысшему уровню качества продукции и гибкой поддержке и обслуживанию клиентов. Клиенты Franz включают в себя десятки компаний из списка Fortune 500, которые охватывают здравоохранение, разведывательные агентства, науки о жизни, телекоммуникации и перспективные исследовательские организации, и ищут решения для сложных проблем.
Области применения
В 1980-х и 1990-х годах были предприняты огромные усилия для объединения областей применения языка Лисп. Результатом стала стандартизация Коммон Лисп, стандарт ANSI которой был опубликован в 1994 году, а также более известный пользователям расширение ISO выпущенного в 1997 на его основе ISLISP ISO и пересмотренный в 2007 году стандарт ISO / IEC 13816: 2007 (E) .
В то время Лисп был гораздо более популярным, чем в настоящее время. Несмотря на более популярные языки, близкие машине (C, C ++), Lisp остается довольно используемым языком, особенно в качестве встроенного языка в приложениях, где он служит языком расширения. Наиболее известный случай Lisp встраивается использовать текстовый редактор Emacs и язык AutoLISP в AutoCAD .
Lisp занимает четвертое место в строках кода, используемых для реализации исходных пакетов из 8 600, доступных в операционной системе Debian, выпущенных в июне 2005 года. Первые восемь языков распределяются следующим образом: C (57 %) , C ++ (16,8 %), Shell (9 %), Lisp (3 %), Perl (2,8 %), Python (1,8 %), Java (1,6 %), Fortran (1,2 %). В июле 2013 года Лисп находился на 15-й позиции индекса TIOBE.
Сегодня существует еще несколько популярных вариантов Lisp, например:
- Common Lisp.
- Scheme.
- EmacsLisp , для программирования редактора Emacs.
Кроме того, существуют библиотеки для различных языков программирования и реализующие подмножества Lisp или Scheme или хотя бы некоторые функции.