Основные положения программирования на Лиспе.

Лабораторная работа № 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)

Наши рекомендации