Основные положения программирования на Лиспе.
Лабораторная работа № 1.
Тема: Ознакомительная работа в среде Lisp. Базовые функции Лиспа. Символы, свойства символов. Средства языка для работы с числами.
Цель:Ознакомиться со средой Lisp. Изучить базовые функции Лиспа, символы и их свойства, средства для работы с числами.
1. Основные положения программирования на Лиспе.
2. Загрузка системы, системный редактор.
3. Базовые функции языка. Символы, свойства символов.
4. Средства языка для работы с числами.
5. Задание к лабораторной работе.
6. Вопросы.
Теоретическое введение.
Основные положения программирования на Лиспе.
· Лисп ориентирован на обработку нечисловых задач. Он основан на алгебре списочных структур, лямбда-исчислении и теории рекурсий.
· Язык имеет функциональную направленность, т.е. любое предложение заключенное в скобки, введенное вне редактора считается функцией и выполняется сразу после нажатия «ENTER».
· Чтобы предотвратить вычисление значения выражения, нужно перед этим выражением поставить апостроф «’». Апостроф перед выражением – сокращение функции Лиспа QUOTE.
· В Лиспе формы представления программы и обрабатываемых ею данных одинаковы. И то и другое представляется списочной структурой, имеющей одинаковую форму.
· Типы данных не связаны с именами объектов данных, а сопровождают сами объекты. Переменные могут в различные моменты времени представлять различные объекты.
· Основные типы данных языка – атомы и списки.
Атомы – это символы и числа.
Список – упорядоченная последовательность, элементами которой являются атомы либо списки. Списки заключаются в круглые скобки, элементы списка разделяются пробелами. Несколько пробелов между символами эквивалентны одному пробелу. Первый элемент списка называется «головой», а остаток, т.е. список без первого элемента, называется «хвостом». Список, в котором нет ни одного элемента, называется пустым и обозначается «( )» либо NIL.
Символ – это имя, состоящее из букв, цифр и специальных знаков, которое обозначает какой-нибудь предмет, объект, действие. В Лиспе символы обозначают числа, другие символы или более сложные структуры, программы (функции) и другие лисповские объекты. Символы могут состоять как из прописных, так и из строчных букв, хотя в большинстве Лисп-систем прописные и строчные буквы отождествляются и представляются прописными буквами.
· Символы Т и NIL имеют в Лиспе специальное назначение: Т – обозначает логическое значение истина, a NIL – логическое значение ложь.
· При генерации или считывании Лиспом нового символа, за его величину принимается он сам. Такая ссылка символа на себя называется автоссылкой.
· Создание программы на Лиспе – написание некоторой функции, возможно сложной, при вычислении использующей другие функции либо рекурсивно саму себя. На практике, написание программ осуществляется записью в файл определений функций, данных и других объектов с помощью имеющегося в программном окружении редактора.
· Необязательно делать отступы в строках выражений, входящих в функции. На самом деле, по желанию, вы можете написать всю программу в одну строку. Однако отступы в строках и пустые строки делают структуру программы понятной и читабельной. Так же выравнивание начальных и конечных скобок основных выражений помогают убедиться в балансе скобок.
· Определения функций могут храниться в файлах и загружаться используя функцию RDS
(RDS ‘<имя файла>)
· Эта функция считывает файл выражений и выполняет эти выражения. <Имя файла> - это строковая константа, которая представляет собой имя файла без расширения (подразумевается расширение "lsp").
· Вы можете сгенерировать ваши собственные исходные файлы с использованием либо редактора LISP, либо редактора внешних текстов, соответствующего ОС вашей ЭВМ и генерирующего стандартные текстовые файлы ASCII.
Загрузка системы
· В качестве редактора можно использовать онлайн-редактор, который можно запустить по адресу:
https://www.tutorialspoint.com/execute_lisp_online.php.
Данная среда включает:
- текстовый редактор;
- исполнитель кода.
Загрузка системы
· Функции разбора.
· Функция CAR возвращает в качестве значения первый элемент списка:
(CAR список) → S- выражение (атом либо список).
· Функция CDR – возвращает в качестве значения хвостовую часть списка, т. е. список, получаемый из исходного списка после удаления из него головного элемента:
(CDR список) → список
Примеры:
(write (car '(a b c d e f)))
(write (cdr '(a b c d e f)))
(write (cons 'a '(b c)))
(write (list 'a '(b c) '(e f)))
(write (append '(b c) '(e f) '(p q) '() '(g)))
(write (last '(a b c d (e f))))
(write (reverse '(a b c d (e f))))
Результат:
A
(B C D E F)
(A B C)
(A (B C) (E F))
(B C E F P Q G)
((E F))
((E F) D C B A)
· Объединение команд
(cadadr '(a (c d) (e f g))) → d
cadadr = car cdr car cdr.
· Функция создания CONS.
· Функция CONSстроит новый список из переданных ей в качестве аргументов головы и хвоста.
(CONS голова хвост)
Для того чтобы можно было включить первый элемент функции CONS в качестве первого элемента значения второго аргумента этой функции, второй аргумент должен быть списком. Значением функции CONS всегда будет список:
(CONS s-выражение список) → список
(write (cons 'a '(b c)))
(write (cons 'ab 'cd))
(write (cons NIL '(a b c) ))
(write (cons '(a b c) NIL))
(write (cons 1 nil))
(write (cons 1 (cons 2 nil)))
(write (cons 1 (cons 2 (cons 3 nil))))
(write (cons 'a (cons 'b (cons 'c nil))))
(write ( car (cons 'a (cons 'b (cons 'c nil)))))
(write ( cdr (cons 'a (cons 'b (cons 'c nil)))))
Результат:
(A B C)(AB . CD)(NIL A B C)((A B C))(1)(1 2)(1 2 3)(A B C)A(B C)
· Вложенные вызовы CAR и CDR
· Комбинации вызовов CAR и CDR образуют уходящие в глубину списка обращения, в Лиспе для этого используется более короткая запись. Желаемую комбинацию вызовов CAR и CDR можно записать в виде одного вызова функции:
(C...R список)
· Вместо многоточия записывается нужная комбинация из букв А и D (для CAR и CDR соответственно). В один вызов можно объединять не более четырех функций CAR и CDR.
· Функция LIST - создает список из элементов. Она возвращает в качестве своего значения список из значений аргументов. Количество аргументов произвольно.
Примеры
(write (list 1 2))(write (list 'a 'b))(write (list 1 nil))(write (list 1 2 3))(write (list 'a 'b 'c))(write (list 3 4 'a (car '(b . c)) (* 4 -2)))(write (list (list 'a 'b) (list 'c 'd 'e)))Результат
(1 2)(A B)(1 NIL)(1 2 3)(A B C)(3 4 A B -8)((A B) (C D E))1. Запишите последовательности вызовов CAR и CDR, выделяющие из приведенных ниже списков символ «а». Упростите эти вызовы с помощью функций C...R.
а) (1 2 3 а4)
б) (1 2 3 4а)
в) ((1) (2 3) (а 4))
г) ((1) ((2 За) (4)))
Д) ((1) ((2 3 а 4)))
е) (1 (2 ((3 4(5 (6 а))))))
2. Каково значение каждого из следующих выражений:
(ATOM (CAR (QUOTE ((1 2) 3 4))));
(NULL (CDDR (QUOTE ((5 6) (7 8)))));
(EQUAL (CAR (QUOTE ((7 )))) (CDR (QUOTE (5 7))));
(ZEROP (CADDDR (QUOTE (3 2 1 0))));
3.
4. Проделайте следующие вычисления с помощью интерпретатора Лиспа:
а) 3.234*(45.6+2.43)
б) 55+21.3+1.54*2.5432-32
в) (34-21.5676-43)/(342+32*4.1)
5. Определите значения следующих выражений:
а)‘(+2 (*3 5))
б) (+2‘(*3 5))
в) (+ 2 (’ * 3 5))
г) (+ 2 (* 3 ’5))
д) (quote ’quote)
(quote 6)