Войти на сайт

или
Регистрация

Навигация


3. Базовые функции языка.

Функции разбора.

Функция CAR возвращает в качестве значения первый элемент списка.

(CAR список) р S - выражение (атом либо список).


_(CAR ‘(a b c d)) р a

_(CAR ‘((a b) c d)) р (a b)

_(CAR ‘(a)) р a

_(CAR NIL) р NIL «Голова пустого списка - пустой список.»


Вызов функции CAR с аргументом (a b c d) без апострофа был бы проинтерпретирован как вызов функции «a» с аргументом «b c d», и было бы получено сообщение об ошибке.

Функция CAR имеет смысл только для аргументов, являющихся списками.


(CAR ‘a) р Error


Функция CDR - возвращает в качестве значения хвостовую часть списка, т. е. список, получаемый из исходного списка после удаления из него головного элемента:


(CDR список) р список

Функция CDR определена только для списков.


_(CDR ‘(a b c d)) р (b c d)

_(CDR ‘((a b) c d)) р (c d)

_(CDR ‘(a (b c d))) р ((b c d))

_(CDR ‘(a)) р NIL

_(CDR NIL) р NIL

_(CDR ‘a) р Error


Функция создания CONS.

Функция CONS строит новый список из переданных ей в качестве аргументов головы и хвоста.


(CONS голова хвост)


Для того чтобы можно было включить первый элемент функции CONS в качестве первого элемента значения второго аргумента этой функции, второй аргумент должен быть списком. Значением функции CONS всегда будет список:


(CONS s-выражение список) р список


_(CONS ‘a ‘(b c)) р (a b c)

_(CONS ‘(a b) ‘(c d)) р ((a b) c d)

_(CONS (+ 1 2) ‘(+ 3)) р (3 + 3)

_(CONS ‘(a b c) NIL) р ((a b c))

_(CONS NIL ‘(a b c)) р (NIL a b c)


Предикаты ATOM, EQ, EQL, EQUAL.

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

Предикат ATOM - проверяет, является ли аргумент атомом:


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


Значением вызова ATOM будет T, если аргументом является атом, и NIL - в противном случае.


_(ATOM ‘a) р T

_(ATOM ‘(a b c)) р NIL

_(ATOM NIL) р T

_(ATOM ‘(NIL)) р NIL


Предикат EQ сравнивает два символа и возвращает значение T, если они идентичны, в противном случае - NIL. С помощью EQ сравнивают только символы или константы T и NIL.


_(EQ ‘a ‘b) р NIL

_(EQ ‘a (CAR ‘(a b c))) р T

_(EQ NIL ()) р T


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


_(EQL 2 2) р T

_(EQL 2.0 2.0) р T

_(EQL 2 2.0) р NIL


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


(= 2 2.0) р T


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


_(EQUAL ‘a ‘a) р T

_(EQUAL ‘(a b c) ‘(a b c)) р T

_(EQUAL ‘(a b c) ‘(CONS ‘a ‘(b c))) р T

_(EQUAL 1.0 1) р NIL


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


_(NULL ‘()) р T


Вложенные вызовы CAR и CDR.

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

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


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

(CADAR x) у (CAR (CDR (CAR x)))


_(CDDAR ‘((a b c d) e)) р (c d)

_(CDDR ‘(k l m)) р (M)


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


_(LIST ‘a ‘b ‘c) р (a b c)

_(LIST ‘a ‘b (+ 1 2)) р (a b 3)


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

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

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


_(SET ‘a ‘(b c d)) р (b c d)

_a р(b c d)

_(SET (CAR a) (CDR (o f g)) р (f g)

_a р (b c d)

_(CAR a) р b

_b р (f g)


Значение символа вычисляется с помощью специальной функции Symbol-value, которая возвращает в качестве значения значение своего аргумента.


_(Symbol-value (CAR a)) р (f g)


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


_(SETQ d ‘(l m n)) р (l m n)


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

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


_(SETF ячейка ‘(a b c)) р (a b c)

_ ячейка р (a b c)


Переменная «ячейка» без апострофа указывает на ячейку памяти, куда помещается в качестве значения список (a b c).


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

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

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


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

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


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

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


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


_(GET ‘студент ‘имя) р Иван

_(GET ‘студент ‘группа) р NIL


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

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

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


_(SETF (GET ‘студент ’группа) ’РВ-90-1) р РВ-90-1

_(GET ‘студент ’группа) р РВ-90-1


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

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

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


_(REMPROP ‘студент ’группа) р группа

_(GET ‘студент ’группа) р NIL

_(REMPROP ‘студент ’ср_бал) р NIL


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

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


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


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



Информация о работе «ЛИСП»
Раздел: Информатика, программирование
Количество знаков с пробелами: 170298
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
14593
2
12

... цифр с требуемым числом разрядов и, таким образом, запомнить любое самое большое число данной разрядности. Целью данной курсовой работы является ЛИСП-реализация конечных автоматов.1. Постановка задачи Конечный автомат – автомат, проверяющий допустимость слова на ленте, и возвращающий True / False (в данном случае Correct / Incorrect). Конечный автомат может двигаться по ленте только в одном ...

Скачать
16057
6
13

... При работе пользователя с базой данных над ее содержимым выполняются следующие основные операции: выбор, добавление, модификация (замена) и удаление данных. Целью данной курсовой работы является ЛИСП – реализация основных операций над базами данных. 1 Постановка задачи Требуется разработать программу, реализующую основные операции над базами данных: выбор, добавление, модификация и удаление ...

Скачать
14282
0
14

... новых рынков, биржевой игре, оценки политических рейтингов, выборе оптимальной ценовой стратегии и т.п. Появились и коммерческие системы массового применения. Целью данной курсовой работы является ЛИСП – реализация основных операций над нечеткими множествами. 1.Постановка задачи Требуется реализовать основные операции над нечеткими множествами: 1)   содержание; 2)   равенство; 3)   ...

Скачать
11806
0
10

... метода Ньютона на случай мнимых корней полиномов степени выше второй и комплексных начальных приближений. Эта работа открыла путь к изучению теории фракталов. Целью данной курсовой работы является Лисп – реализация нахождения корней уравнения методом Ньютона. 1. Постановка задачи Дано уравнение: . Требуется решить это уравнение, точнее, найти один из его корней (предполагается, что ...

0 комментариев


Наверх