Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Символы, свойства символов.

Лабораторная работа 1.

Тема: Ознакомительная работа в среде Lisp. Базовые функции Лиспа. Символы, свойства символов. Математические и логические функции

 

Цель: Ознакомиться со средой Lisp. Изучить базовые функции Лиспа, символы и их свойства, средства для работы с числами.

 

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

2. Загрузка системы, системный редактор.

3. Функции списков.

4. Символы, свойства символов.

5. Математические и логические функции.

6. Ход работы.

7. Контрольные вопросы.

 

Теоретическое введение.

 

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

· Лисп ориентирован на обработку нечисловых задач. Он основан на алгебре списочных структур, лямбда-исчислении и теории рекурсий.

· Язык имеет функциональную направленность, т.е. любое предложение заключенное в скобки, введенное вне редактора считается функцией и выполняется сразу после нажатия «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)

· Объединение команд

Комбинации вызовов CAR и CDR образуют уходящие в глубину списка обращения, в Лиспе для этого используется более короткая запись. Желаемую комбинацию вызовов CAR и CDR можно записать в виде одного вызова функции:

(C...R список)

cadadr = car cdr car cdr.

Вместо многоточия записывается нужная комбинация из букв А и D (для CAR и CDR соответственно). В один вызов можно объединять не более четырех функций CAR и CDR.

 

(CADAR х) = (CAR (CDR (CAR х)))

(CDDAR ‘((a bed) е)) = (с d)

(CDDR ‘(k 1 m)) = (m)

(cadadr '(a (c d) (e f g))) = d

 

· Функция создания 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)

 

· Функция LIST – создает список из элементов. Она возвращает в качестве своего значения список из значений аргументов. Количество аргументов произвольно.

 

Функция Описание
car Принимает список в качестве аргумента и возвращает его первый элемент
cdr Принимает список в качестве аргумента и возвращает список без первого элемента
cons Принимает два аргумента, элемент и список, и возвращает список с элементом, вставленным в первое место
list Принимает любое количество аргументов и возвращает список с аргументами в качестве элементов списка.
append Объединяет два или более списка в один.
last Принимает список и возвращает список, содержащий последний элемент.
member Принимает два аргумента, вторым из которых должен быть список, если первый аргумент является членом второго аргумента, а затем возвращает остаток списка, начинающийся с первого аргумента.
reverse Принимает список и возвращает список с верхними элементами в обратном порядке.

 

Примеры

(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))

· Предикаты ATOM, ЕО, EOL, EQUAL.

Предикат – функция, которая определяет, обладает ли аргумент определенным свойством, и возвращает в качестве значения NIL или Т.

· Предикат АТОМ - проверяет, является ли аргумент атомом:

(ATOM s - выражение)

Значением вызова АТОМ будет Т, если аргументом является атом, и NIL – в противном случае.

(АТОМ ‘а) ® Т(АТОМ ‘(а b с)) ® NIL(АТОМ NIL) ® Т(АТОМ ‘(NIL)) ® NIL

· Предикат ЕО сравнивает два символа и возвращает значение Т, если они идентичны, в противном случае – NIL. С помощью EQ сравнивают только символы или константы Т и NIL.

(EQ ‘a ‘b) ® NIL(EQ ‘a (CAR ‘(a b с))) ® T (EQ NIL 0) ® T

· Предикат EOL работает так же как и EQ, но дополнительно позволяет сравнивать однотипные числа.

(EQL 2 2) ® Т(EQL 2.0 2.0) ® Т (EQL 2 2.0) ® NIL

Для сравнения чисел различных типов используют предикат «=». Значением предиката «=» является Т в случае равенства чисел независимо от их типов и внешнего вида записи.

(= 2 2.0) ® Т

· Предикат EQUAL проверяет идентичность записей. Он работает как EQL, но дополнительно проверяет одинаковость двух списков. Если внешняя структура двух лнсповскнх объектов одинакова, то результатом EQUAL будет Т.

(EQUAL ‘а ‘а) ® Т (EQUAL ‘(а b с) ‘(а b с)) ® Т (EQUAL ‘(а b с) ‘(CONS ‘а ‘(Ь с))) ® Т (EQUAL 1.0 1) ® NIL

· Функция NULL проверяет на пустой список.

(NULL ‘())® Т

 

Символы, свойства символов.

· Функции присваивания: SET, SETO, SETF.

· Функция SET присваивает символу или связывает с ним некоторое значение. Причем она вычисляет оба своих аргумента. Установленная связь действительна до конца работы, если этому имени не будет присвоено новое значение функцией SET.

 

(SET ‘a ‘(b с d)) результат (b с d)a результат (b с d)(SET (CAR a) (CDR (e f g)) результат (f g) a результат (b с d)(CAR a) результат b b результат (f g)

 

· Функция SETQ связывает имя, не вычисляя его. Эта функция отличается от SET тем, что вычисляет только второй аргумент.

(SETQ d ‘(l m n)) = (l m n)

 

· Функция SETF – обобщенная функция присваивания. SETF используется для занесения значения в ячейку памяти.

(SETF ячейка памяти - значение)

· Свойства символа.

В Лиспе с символом можно связать именованные свойства. Свойства символа записываются в хранимый вместе с символом список свойств. Свойство имеет имя и значение. Список свойств может быть пуст. Его можно изменять или удалять без ограничений.

(имя1 знач1 имя2 знач2... имяХ значМ)

 

Пусть имя студент имеет следующий список свойств:

(имя Иван отчество Иванович фамилия Иванов)

· Функция GET возвращает значение свойства, связанного с символом.

(GET символ свойство)

При отсутствии свойства функция GET возвращает NIL в качестве ответа.

 

· Присваивание и удаление свойств.

Для присваивания символу свойств в MnLisp / Common Lisp отдельной функции нет. Для этого используются уже известные нам функции:

(SETF (GET символ свойство) значение)

 

Удаление свойства и его значения осуществляется псевдофункцией REMPROP.

Эта функция возвращает в качестве значения имя удаляемого свойства. Если удаляемого свойства нет, то возвращается NIL.

(REMPROP символ свойство)

 

Для просмотра всего списка свойств используют функцию SYMBOL- PLIST. Значением функции является весь список свойств.

(SYMBOL-PLIST ‘СИМВОЛ)

(SYMBOL-PLIST ‘студент) результат (имя Иван отчество Иванович фамилия Иванов)

 

 

Программа:

(write (setf (get 'books'title) '(Gone with the Wind)))(write (setf (get 'books 'author) '(Margaret Michel)))(write (setf (get 'books 'publisher) '(Warner Books)))

Результат:

(GONE WITH THE WIND)(MARGARET MICHEL)(WARNER BOOKS)

 

Программа:

(setq s1 (cons '(a b) NIL))(setq s2 (cons '(a b) NIL))(setf (get 's1 'a) 10) (setf (get 's1 'b) 20)(setq spisok (list s1 s2))(write (symbol-plist 's1))

 

Программа:

(setf (get 'books 'title) '(Gone with the Wind))(setf (get 'books 'author) '(Margaret Micheal))(setf (get 'books 'publisher) '(Warner Books))(write (get 'books 'title))(write (get 'books 'author))(write (get 'books 'publisher))

Результат:

(GONE WITH THE WIND)(MARGARET MICHEAL)(WARNER BOOKS)

 

Программа:

(setf (get 'annie 'age) 43)(setf (get 'annie 'job) 'accountant)(setf (get 'annie 'sex) 'female)(setf (get 'annie 'children) 3)(write (symbol-plist 'annie))(remprop 'annie 'age)(write (symbol-plist 'annie))

Результат:

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT)

 

Свойства символов независимо от их значений доступны из всех контекстов пока не будут явно изменены или удалены. Изменение значения символа не влияет на другие свойства. Свойства символа передаются другому символу с помощью функции SETQ.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...