- •Лабораторная работа 1. Тема: Ознакомительная работа в среде Lisp. Базовые функции Лиспа. Символы, свойства символов. Математические и логические функции
- •Основные положения программирования на Лиспе
- •Загрузка системы, системный редактор
- •Функции списков
- •Символы, свойства символов.
- •Математические и логические функции
- •Ход работы:
Загрузка системы, системный редактор
В качестве редактора можно использовать онлайн-редактор, который можно запустить по адресу:
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 ‘()) Т
