Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие Функциональное и логическое программирование.docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
309.57 Кб
Скачать

Наиболее общая функция, выделяющая n-й элемент списка (при этом индексация начинается с 0):

(NTH n список)

(NTH 2 ‘(A B C) ) => C

Функция last позволяет выделить последний элемент списка:

(LAST список)

(LAST ‘(1 2 3 4 5)) => 5

Функция list - создает список из элементов:

(LIST арг.1 арг.2 арг.3 …) => (арг.1 арг.2 арг.3 …)

Функция возвращает в качестве своего значения список из значений аргументов, количество аргументов произвольно:

(LIST ‘a ‘b ‘c) => (a b c)

(LIST ‘a ‘b (+ 1 2)) => (a b 3)

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

(cons ‘a NIL) => (a)  (list ‘a)

(cons 1 (cons 2 (cons 3 NIL) ) ) => (1 2 3)  (list 1 2 3)

Имя и значение символа

Значением константы является сама константа.

Перед числами и символами T и NIL не нужно ставить апостроф.

Символ может обозначать произвольное выражение

Символы можно использовать как переменные. В этом случае они могут обозначать некоторые выражения. Изначально символы не имеют значений. Для присваивания символам значений существуют встроенные функции присваивания (связывания): 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)

Проверить, связан ли атом, можно с помощью предиката BOUNDP, который истинен, если атом имеет какое-нибудь значение:

(BOUNDP ‘c)  NIL

(BOUNDP ‘a)  T

(BOUNDP ‘T)  T

Функция setq – невычисляющее присваивание:

(SETQ символ значение) значение

Не вычисляет значение первого аргумента, связывает его со значением второго. Отличается от функции SET тем, что вычисляет только второй аргумент:

d => Error

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

d => (l m n)

Функция setf - обобщенная функция присваивания:

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

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

(SETF ячейка ‘(a b c)) => (a b c)

ячейка => (a b c)

Функции, обладающие побочным эффектом, называются псевдофункциями.

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

С символом можно связать именованные свойства:

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

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