Примеры программ на лиспе

Когда мы рассказывали про функциональное программирование, то привели в пример несколько языков, которые подходят для этого лучше всего. В этом списке есть особенный язык — Lisp. Особенный он потому, что именно с него и началось всё функциональное программирование.

Что такое Lisp

Lisp — это язык программирования, который сейчас используется для обработки и анализа данных. Язык очень старый, но иногда используется и сейчас для узкоспециализированных задач типа машинного обучения.

Язык высокоуровневый, то есть код написан более-менее человеческим языком и поддерживает сложную логику и работу со строками и числами в привычном нам формате.

Что работает на Lisp

На Lisp написан софт, который мониторит состояние самолётов — например «Боингов» и «Эйрбасов». Также Lisp лежит в основе софта, который анализирует и распределяет ресурсы в лондонском метрополитене.

На Lisp работает система обработки данных Apache Storm, текстовый анализатор Grammarly. На этом же языке сделан Circle CI — система постоянной выкатки новых версий софта (CI/CD).

Язык LISP для студентов и инженеров. Первая программа

А ещё Lisp используется тут:

  • AutoCAD — язык использует внутренние команды для автоматического проектирования.
  • Emacs — многофункциональный текстовый редактор, в котором Lisp выступает и как язык, на котором написан сам Emacs, и как язык внутренней обработки текста.
  • Audacity — программы для работы со звуком.

На Lisp не пишут игры и приложения, это не язык для создания сложных экранных интерфейсов или быстрого прототипирования мобильных приложений.

Как и зачем появился Lisp

В 1950-х программисты и математики вплотную начали работать над искусственным интеллектом. Нейросети тогда были чисто математической моделью без практического применения, поэтому учёные взяли за основу такую идею:

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

Все наши мысли можно сформулировать в виде предложений, которые состоят из слов, а слова — из букв. Получается, что искусственный интеллект должен легко оперировать словами и символами и знать, в каком порядке их надо выстроить.

В то время ни один из существующих языков не позволял работать со строками и символами на таком уровне, поэтому Джон Маккарти в 1958 написал первую версию языка Lisp. Это название — сокращение от LISt Processing language, что переводится как «язык обработки списков». Списком может быть что угодно: символ, слово, предложение, другой список или даже список функций.

Пример кода

Чтобы сразу было понятно, чем этот язык отличается от других, вот два примера кода на Lisp. Первый обрабатывает два комплексных числа:

; функция сложения двух комплексных чисел (defun AddCom(Com1 Com2) (cons (+ (car Com1)(car Com2)) (cons (+ (cadr Com1)(cadr Com2)) NIL))) ; функция вычитания двух комплексных чисел (defun SubCom(Com1 Com2) (cons (- (car Com1)(car Com2)) (cons (- (cadr Com1)(cadr Com2)) NIL))) ; функция сравнения двух комплексных чисел (defun EqCom(Com1 Com2) (and (= (car Com1)(car Com2)) (= (cadr Com1)(cadr Com2)))) ; функция умножения двух комплексных чисел (defun MultCom(Com1 Com2) (cons (- (* (car Com1)(car Com2)) (* (cadr Com1)(cadr Com2))) (cons (+ (* (car Com1)(cadr Com2)) (* (cadr Com1)(car Com2))) NIL))) ; функция деления комплексных чисел (defun DivCom(Com1 Com2) (let ((z (+ (* (car Com2)(car Com2)) (* (cadr Com2)(cadr Com2))) )) (cons (/ (+ (* (car Com1)(car Com2)) z)(* (cadr Com1)(cadr Com2))) (cons (/ (- (* (cadr Com1)(car Com2)) z) (* (car Com1)(cadr Com2))) NIL )))) ; вычисление суммы чисел 2+3i и 1.5-8i (AddCom ‘(2 3) ‘(1.5 -8)) ; вычисление произведения чисел 3-i и 3+i (MultCom ‘(3 -1) ‘(3 1))

А вот код, который сам анализирует с точки зрения математики введённую строку и выполняет все математические операции:

Пример простой программы на LISP


(Defun weight (x) (COND ((EQ x ‘+) 1) ((EQ x ‘-) 1) ((EQ x ‘*) 2) ((EQ x ‘) 2) ((EQ x ‘/) 2) ((EQ x ‘^) 3) (T 5)) ) (Defun opcode (op) (COND ((EQ op ‘+) ‘+) ((EQ op ‘-) ‘-) ((EQ op ‘*) ‘*) ((EQ op ‘) ‘) ((EQ op ‘/) ‘/) ((EQ op ‘^) ‘^) (T (RAISEERROR (STRCAT «Неверен код операции » (OUTPUT op))))) ) (Defun inf-aux (ae operators operands) (inf-iter (CDR ae) operators (CONS (CAR ae) operands))) (Defun inf-iter (ae operators operands) (PROG NIL (COND ((AND (NULL ae) (NULL operators)) (RETURN (CAR operands)))) (COND ((AND (NOT (NULL ae)) (OR (NULL operators) (GREATERP (weight (CAR ae)) (weight (CAR operators)))) ) (RETURN (inf-aux (CDR ae) (CONS (CAR ae) operators) operands)))) (RETURN (inf-iter ae (CDR operators) (CONS (LIST (opcode (CAR operators)) (CADR operands) (CAR operands)) (CDDR operands)))))) (Defun inf2pref (x) (PROG (hd tl cc xx rr) (COND ((atomlist x) (RETURN (inf-aux x NIL NIL)))) (SETQ rr NIL) (SETQ xx x) LOOP (SETQ hd (CAR xx)) (SETQ tl (CDR xx)) (COND ((memb hd (QUOTE (SIN COS LOG EXP ATN ASN ACS SH CH SQR SIGN ABS))) (PROGN (SETQ rr (APPEND rr (LIST (LIST hd (inf2pref (CAR tl)))))) (SETQ tl (CDR tl)))) ((ATOM hd) (SETQ rr (APPEND rr (LIST hd)))) (T (SETQ rr (APPEND rr (LIST (inf2pref hd)))))) (COND ((NULL tl) (RETURN (inf-aux rr NIL NIL)))) (SETQ xx tl) (GO LOOP))) (Defun CalcExpr (expression) (EVAL (inf2pref (PARSE expression))))

Штука в том, что математических символов может быть сколько угодно и они могут стоять в любом порядке — Lisp их все найдёт, проанализирует, сам выстроит как нужно, посчитает и выдаст ответ. А всё потому, что этот язык изначально был заточен на обработку строк и символов.

Читайте также:
Самый точный прогноз погоды программа

Вот что получится, если запустить второй пример и попробовать вычислить несколько выражений:

(calcExpr «5+(7-4)*5»)
==> 20
(calcExpr «(sin(1))^2+(cos(1))^2»)
==> 1.000000000000000E+0

Особенности языка

Скобки и списки. Про скобки в Lisp есть тысячи мемов и шуток, а всё потому, что круглые скобки — это обозначение списка. В Lisp в списке может быть что угодно: другие команды, слова, символы, функции, списки в списках и так далее. И всё это может быть даже внутри одного списка, а потом передаваться в работу в качестве параметра в другой список.

Что такое Lisp Что такое Lisp

Функции можно объявить где угодно. Действительно где угодно — даже в середине строки (которая в Lisp — тоже список, который будет обработан). Код из-за этого может стать менее читаемым, но если вы пишете на Lisp, то читаемость любого кода для вас вообще не проблема.

(defun назвать (name lv) (eval (cons ‘defun (cons name (cdr lv))))) (назвать ‘сложить ‘(lambda (x y) (+ x y))) (сложить 5 7) ==>12

Создание своих правил. Главная задача языка Lisp – обработать ваши списки по вашим же правилам. Это самая суть функционального программирования: вы задаёте правила обработки, а язык сам разбирается, как и где их применить, куда передать результат и что с ним делать дальше.

В чём хорош Lisp

Суперсила классического Lisp – в его умении работать с текстом: разбирать его на составляющие, искать связи, делать выводы и всё такое. При этом текстом может быть что угодно:

  • обычный текст;
  • статьи и базы знаний;
  • код на других языках;
  • внутренние команды какой-то программы, например AutoCAD;
  • команды для станков;
  • управляющая последовательность байтов на сервере;
  • база данных.

Сейчас чаще используют Common Lisp — потомок оригинального языка, в который добавили новые команды, структуры данных и возможности для императивного программирования. Common Lisp можно применять везде, где есть правила обработки данных — от медицины и работы над геномом человека до внутренних систем передачи данных внутри интернет-провайдера.

Читаете «Код»? Зарабатывайте на коде

Сфера ИТ и разработки постоянно растёт и требует новых кадров. Компании готовы щедро платить даже начинающим разработчикам, а опытных вообще отрывают с руками. Обучиться на разработчика можно в «Яндекс Практикуме».

Читаете «Код»? Зарабатывайте на коде Читаете «Код»? Зарабатывайте на коде Читаете «Код»? Зарабатывайте на коде Читаете «Код»? Зарабатывайте на коде

Получите ИТ-профессию

В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.

Источник: thecode.media

Написание программ на языке Лисп

Нас интересует не только возможность использовать встроенные функции языка программирования для вычислений. Нас интересует прежде всего возможность написания новых программ. Написание программы на Лиспе сводится к определению новых функций.

Сделать это позволяет особая функция DEFUN следующего вида: ( DEFUN < атом-имя >(< a 1 >…< a n >) < выражение-тело >) Здесь первый аргумент — имя создаваемой функции, затем идет список, содержащий формальные параметры, и после завершающей список скобки — выражение, вычисление которого будет приниматься в качестве результата вычисления данной функции. Определим для примера функцию вычисления квадрата суммы двух чисел: (DEFUN SUMKVAD (X Y) (+ (* X X) (* Y Y)) ) Обратите внимание на стиль написания. Аналогично программам на Си, программы на Лиспе можно сделать более удобными для восприятия человеком, применяя «лесенку», соответствующую логической структуре программы. Теперь мы можем использовать построенную функцию: (SUMKVAD 2 5) → 29 Однако эта функция не включает возможность обработки разных случаев при выполнении программы. В императивных языках программирования подобная обработка обычно реализуется с помощью операторов ЕСЛИ — ТО — ИНАЧЕ или операторов выбора ( if и switch в Си). Лисп дает возможность реализации обработки разных ситуаций, в том числе с помощью мощной конструкции COND . Это функция, записываемая особым образом:

14 . . . ( < t n >< v n >) ) При ее использовании применяются пары ( < t i >< v i >) . Значение COND вычисляется по следующей схеме. Сначала вычисляется значение выражения t 1 . Если оно отличается от NIL , вычисляется значение выражения v 1 и возвращается в качестве результата выполнения всей функции COND . Если результат вычисления t 1 — NIL , вычисляется значение t 2 . Если оно отлично от NIL , вычисляется и возвращается в качестве итогового результата значение v 2 и т. д. Если все t i будут иметь значение NIL , оно будет окончательным значением COND . Некоторые выражения v i могут отсутствовать.

В этом случае, если t i будет первым отличающимся от NIL , в качестве значения COND будет возвращено это значение. В качестве t i обычно используют предикатные функции, возвращающие значение ИСТИНА или ЛОЖЬ. Часто в последней паре в качестве t n используют просто константу T , чтобы, если не сработала ни одна из вышележащих пар, в любом случае нечто выполнить — аналог else или default в языке Си. Следующая программа иллюстрирует использование COND . Это аналог подобной программы на Си, переводящей оценку, выраженную в баллах, в ее словесное обозначение. Кроме того, программа замечательно иллюстрирует возможности и особенности Лиспа, связанные с обработкой символьной информации и нестрогой динамической типизацией, — она производит и обратное преобразование словесного выражения оценки в баллы: ; функция «Оценка» ; 2- неуд/ 3- уд/ 4- хор/ 5- отл (DEFUN MARK (A) (COND ((EQUAL A 5) ‘ОТЛИЧНО) ((EQUAL A 4) ‘ХОРОШО) ((EQUAL A 3) ‘УДОВЛЕТВОРИТЕЛЬНО) ((EQUAL A 2) ‘НЕУДОВЛЕТВОРИТЕЛЬНО) ; перевод из строки в баллы ((EQUAL A ‘ОТЛИЧНО) 5) ((EQUAL A ‘ХОРОШО) 4) ((EQUAL A ‘УДОВЛЕТВОРИТЕЛЬНО) 3) ((EQUAL A ‘НЕУДОВЛЕТВОРИТЕЛЬНО) 2) (T ‘НЕПОНЯТНО) )

15 ) Итак, функция COND применяется как аналог условного оператора и оператора выбора императивных языков программирования. Что, если в программе на Лиспе необходимо неоднократно выполнить некоторые действия? В императивном языке для этого наиболее часто применяется итерация, реализуемая с помощью того или иного оператора цикла.

В чистом функциональном программировании циклы не используются. Возникает законный вопрос: что же применяется вместо них? Базовый механизм повторения в функциональной парадигме программирования — рекурсия. Напомним, что она сводится к вызову, прямому или косвенному, функции из самой этой функции.

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

Читайте также:
1c ошибка при запуске программы

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

Рассмотрим в качестве примера программу подсчета длины списка. Подобная функция, естественно, имеется в стандартной поставке Лиспа, но мы ее повторим в учебных целях: ;подсчет длины списка (DEFUN DLINA (S) (COND ((NULL S) 0) (T (+ 1 (DLINA (CDR S)))) ) ) Поскольку для подсчета количества элементов в списке нужно их перебрать, а их несколько, нам потребуется повторение одних и тех же действий. Следовательно, программа будет рекурсивной. Что можно использовать для останова рекурсии, какое условие? Видимо, в данном случае это будет ситуация, когда на вход поступает пустой список. Проверка этого организуется с помощью функций COND и NULL . В этом случае дальнейшие вычисления не проводятся, а в качестве результата

16 возвращается нуль. Далее длину всего списка можно определить путем прибавления единицы к результату вычисления длины списка без одного элемента (например, головы). Рекурсивные программы на Лиспе писать легко и просто за счет того, в частности, что базовая структура данных языка — список — рекурсивна изначально, по своей природе.

Рассмотрим еще один пример — программу, обращающую список, иными словами, записывающую элементы исходного списка в обратном порядке: (DEFUN ZERKALO (S) (COND ((NULL S) S) (T (APPEND (ZERKALO (CDR S))(LIST (CAR S)))) ) ) Программа подобно предыдущей будет являться рекурсивной в силу необходимости обработки нескольких элементов исходного списка. Останов рекурсии производится в случае наличия на входе пустого списка — его можно считать собственным обращением.

Результат получаем приписыванием первого элемента исходного списка к обращенной остальной части этого списка. Поскольку все аргументы APPEND должны являться списками, используем функцию LIST для преобразования первого элемента исходного списка в список из одного этого элемента. Следующая программа решает задачу из книги [4], а именно генерирует числовую последовательность, начиная с заданного числа, по закону u n 2, если u n четное, u n +1 = иначе 3 u n +1. ; PIMP — ГЕНЕРАЦИЯ ЧИСЛОВОЙ ПОСЛЕДОВАТЕЛЬНОСТИ (DEFUN PIMP (U) (PRINT U) (COND ((EQUAL U 1) NIL);останов рекурсии ((ZEROP (REM U 2)) (PIMP (/ U 2))) (T (PIMP (+ 1 (* U 3)))) ) ) В программе используется еще одна функция Лиспа — PRINT , печатающая значение своего аргумента. Таким образом, при очередном рекурсивном вызове функции PIMP она сначала печатает свой аргумент. В качестве условия останова применяется равенство аргумента единице.

17 Проверка четности осуществляется с помощью вызова функции REM , подсчитывающей остаток от деления на 2. Следующий пример программы — функция объединения множеств на Лиспе. Множества представляются списками, подаваемыми на вход в качестве аргументов. Особенностью множеств по отношению к спискам является то, что они, во-первых, в отличие от списков, не упорядочены, а во-вторых, элементы в списке могут повторяться, а в мно жество в общем случае элемент может входить лишь один раз. Поэтому программа должна выявлять элементы, входящие и в первый, и во второй список. В связи с этим реализуем сначала вспомогательную функцию APP , проверяющую вхождение элемента в список. Затем она используется в функции UNI , объединяющей аргументы E и F , с помещением результата в F : ; Объединение множеств на Лиспе ; вспомогательная функция — поиск атома A в списке X (DEFUN APP (A X) (COND ((NULL X) NIL) ((EQUAL A (CAR X)) T) (T (APP A (CDR X))) ) ) ; собственно объединение множеств (DEFUN UNI (E F) (COND ((NULL E) F) ((APP (CAR E) F) (UNI (CDR E) F)) (T (UNI (CDR E) (CONS (CAR E) F))) ) ) В следующем примере разберем уже приводившуюся программу подсчета суммы нечетных элементов списка: ; подсчет суммы нечетных элементов списка (DEFUN SUMNECH (X) (COND ((NULL X) 0) ((ZEROP (REM (CAR X) 2)) (SUMNECH (CDR X))) (T (+ (CAR X) (SUMNECH (CDR X)))) ) )

18 Поскольку необходимо перебирать несколько элементов списка, программа является рекурсивной. Условие останова — пустой список на входе: ясно, что сумма нечетных в нем равна нулю.

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

В Лиспе присутствует возможность использования так называемых лямбда-функций , или безымянных функций. Лямбда-функция определяется следующим образом: (( LAMBDA (< пер >) < выр1 >) < выр2 >) и возвращает значение выражения < выр1 >, в котором все вхождения формального параметра < пер >замещены значениями выражения < выр2 >. Первое выражение — тело лямбда-функции, второе выражение — фактический аргумент. Примеры: ((LAMBDA (Х) (ATOM Х)) 123) → T (MAPCAR (LAMBDA (I) (+ I 10)) ‘(1 2 3 4 5)) → (11 12 13 14 15) На сладкое — совсем короткая программа подсчета суммы нечетных элементов числовой последовательности на Лиспе с телом функции, состоящим из одной строки. Программа использует трюк со свойствами умножения и сложения, лямбда-функцию и функции высших порядков: (DEFUN SUMN (S) (APPLY ‘+ (MAPCAR (LAMBDA (X) (* X (REM X 2))) S)) ) Обратите внимание на то, что в данной программе в явном виде рекурсия не используется. Следующий пример программы относится к классу программ сортировки, а именно сортировке перестановкой. Идея, воплощенная в этой программе, заключается в том, что вначале на первую позицию списке перемещается минимальный элемент, а затем процедура повторяется для оставшейся части списка: ;Сортировка перестановкой на Лиспе ;вспомогательная функция возвращает минимальное значение в списке (DEFUN MINS(X) (COND ((NULL (CDR X)) (CAR X));В списке один элемент — он же min ((< (CAR X) (MINS (CDR X))) (CAR X)); рекурсия (T (MINS (CDR X)))

Читайте также:
Какая программа служит для создания презентаций word excel powerpoint access

19 ) ) ;вспомогательная функция удаляет первое вхождение элемента в список (DEFUN REMV (EL S) (COND ((NULL S) NIL) ((EQ EL (CAR S)) (CDR S)); если первый — возвращается хвост (T (CONS (CAR S) (REMV EL (CDR S))));рекурсия ) ) ;собственно функция сортировки списка по возрастанию перестановкой (DEFUN SORTS(X) (COND ((NULL (CDR X)) X) (T (CONS (MINS X) (SORTS (REMV (MINS X) X)))) ) ) Еще один вариант программы сортировки основан на идее вставки, начиная с первого, элемента в список на подобающее ему место в зависимости от величины, своего рода выполнение команды «Равняйся!»: ;Сортировка вставкой на Лиспе ;вспомогательная функция вставки элемента ;в список на подобающее место (DEFUN INS(X S) (COND ((NULL S) (LIST X)); если был пустой список ((< X (CAR S)) (CONS X S) );если меньше первого,вставляется перед ним (T (CONS (CAR S) (INS X (CDR S)))) ) ) ;функция сортирует список по возрастанию (DEFUN SORTS(X) (COND ((NULL X) X) (T (INS (CAR X) (SORTS (CDR X)))) ) )

Источник: studfile.net

Язык обработки списков Lisp

Основной механизм языка Лисп — инкапсулированная в список определяющая голова списка и подключенный к ней хвост списка, который рекурсивно также может быть списком . Об этом говорит сайт https://intellect.icu . Лисп-машина способна воспринимать каждый поступающий на нее список на самом абстрактном уровне, например как мета-Лисп-машину, модифицирующую воспринимающую машину. В такой динамичной, высокоабстрактной среде можно реализовать как строго научные системы, так и неисчислимое множество программистских трюков и генераторов всевозможных машин.

Любая программа на языке Лисп состоит из последовательности выражений (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде списков — одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка.

Это позволяет создавать программы, изменяющие другие программы или макросы, позволяющие существенно расширить возможности языка. Внешне исходный код программы на Лиспе отличается обилием круглых скобок; редактирование программ значительно упрощается использованием текстового редактора, поддерживающего автоматическое выравнивание кода, подсветку соответствующих пар скобок и такие специальные команды, как “закрыть все открытые скобки”, “перейти через список вправо” и т. д. Список является последовательностью элементов любого рода, в том числе других списков.

Например, (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»). Синтаксис в форме Бэкуса — Наура:

s_expression ::= atomic_symbol | «(» s_expression «.» s_expression «)» | list list ::= «(» s_expression < s_expression >»)» atomic_symbol ::= letter atom_part atom_part ::= empty | letter atom_part | number atom_part letter ::= «a» | «b» | » . » | «z» number ::= «1» | «2» | » . » | «9» empty ::= » »

Примеры

Пример программы, выводящей сообщение «Hello, world!»: (format t «Hello, world!~%») Пример Куайн (программы, выводящей свой исходный код) на Лиспе: ((lambda (x) (list x (list ‘quote x))) ‘(lambda (x) (list x (list ‘quote x)))) Данная программа должна работать на большинстве диалектов Лиспа, в том числе и на Scheme. Итеративная версия функции определения N-го числа Фибоначчи с использованием макроса Loop:

(defun fibonacci (n) (loop repeat (+ n 1) for a = 1 then b and b = 1 then (+ a b) finally (return a)))
Рекурсивная версия функции N-го числа Фибоначчи:
(defun fibonacci(n) (if (or (= n 0) (= n 1)) 1 (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))

Применение

Первые области применения языка Лисп были связаны с символьной обработкой данных и процессами принятия решений.

Наиболее популярный сегодня диалект Common Lisp является универсальным языком программирования. Он широко используется в самых разных проектах: Интернет-серверы и службы, серверы приложений и клиенты, взаимодействующие с реляционными и объектными базами данных, научные расчеты и игровые программы.

Одно из направлений использования языка Lisp — его использование в качестве скриптового языка, автоматизирующего работу в ряде прикладных программ: — язык Лисп используется как язык сценариев в САПР AutoCAD (диалект AutoLISP); — его диалект — SKILL — используется для написания скриптов в САПР Virtuoso Platform компании Cadence Design Systems; — язык Лисп является одним из базовых средств текстового редактора Emacs (диалект EmacsLISP)[2]; — язык Лисп используется как язык сценариев в издательском программном обеспечении Interleaf/Quicksilver (диалект Interleaf Lisp); — в оконном менеджере Sawfish применяется специальный диалект Лиспа Rep, который в значительной степени повторяет диалект Лиспа от Emacs; — диалект Scheme используется в качестве одного из скриптовых языков в графическом процессоре Gimp; — диалект GOAL используется для высокодинамичных трехмерных игр; — язык Лисп может использоваться для написания скриптов в аудиоредакторе Audacity. Сферы применения языка Лисп многообразны: наука и промышленность, образование и медицина, от декодирования генома человека до системы проектирования авиалайнеров.

Морозов М.Н. 10 лекций по Лиспу Если я не полностью рассказал про язык обработки списков lisp? Напиши в комментариях Надеюсь, что теперь ты понял что такое язык обработки списков lisp и для чего все это нужно, а если не понял, или есть замечания, то нестесняся пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Языки и методы программирования. Теория трансляции

Источник: intellect.icu

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru