Micro Lisp. Основные понятия, структуры и функции. Яшин Л.З. - 14 стр.

UptoLike

Составители: 

14
[8] (equal? '(nil) '((nil)))
()
Принцип работы предиката ЕQUAL? состоит в следующем: если внешняя
структура двух лисповских объектов одинакова, то эти объекты между собой равны в
смысле EQUAL?. Предикат EQUAL? также применим к числам и к другим типам
данных (например, к строкам). Заметим, что в соответствии со своим принципом
работы он не подходит для сравнения разнотипных чисел, так как их внешние
представления различаются.
ДРУГИЕ ПРИМИТИВЫ
Несмотря на то, что обычную обработку списков всегда можно свести к
описанным ранее трем базовым функциям (CONS, CAR, CDR) и двум базовым
предикатам (АТОМ? и EQ?), программирование лишь с их использованием было бы
очень примитивным и похожим на программирование на внутреннем машинном
языке. Поэтому в
Лиспсистему включено множество встроенных функций для
различных действий и ситуаций. Рассмотрим некоторые такие примитивы и их
полезные свойства.
NULL? проверяет на пустой список
Встроенная функция NULL? проверяет, является ли аргумент пустым списком:
[0] (null? '())
#T
[1] (null? 'a)
()
[2] (null? (cddr '(a b c)))
()
[3] (null? nil)
#T
[4] (null? 'nil)
()
[5] (null? t)
()
Из примеров видно, что NULL? работает как логическое отрицание, у которого в
Лиспе есть и свой, принадлежащий
логическим функциям, предикат (NOT X):
[0] (not t)
()
[1] (not nil)
#T
[2] (not (not t))
#T
[3] (not (not nil))
()
[4] (not (null? nil))
()
                                            14

       [8] (equal? '(nil) '((nil)))
       ()
      Принцип работы предиката ЕQUAL? состоит в следующем: если внешняя
структура двух лисповских объектов одинакова, то эти объекты между собой равны в
смысле EQUAL?. Предикат EQUAL? также применим к числам и к другим типам
данных (например, к строкам). Заметим, что в соответствии со своим принципом
работы он не подходит для сравнения разнотипных чисел, так как их внешние
представления различаются.


                                      ДРУГИЕ ПРИМИТИВЫ

       Несмотря на то, что обычную обработку списков всегда можно свести к
описанным ранее трем базовым функциям (CONS, CAR, CDR) и двум базовым
предикатам (АТОМ? и EQ?), программирование лишь с их использованием было бы
очень примитивным и похожим на программирование на внутреннем машинном
языке. Поэтому в Лисп — систему включено множество встроенных функций для
различных действий и ситуаций. Рассмотрим некоторые такие примитивы и их
полезные свойства.

NULL? проверяет на пустой список
      Встроенная функция NULL? проверяет, является ли аргумент пустым списком:
       [0] (null? '())
       #T
       [1] (null? 'a)
       ()
       [2] (null? (cddr '(a b c)))
       ()
       [3] (null? nil)
       #T
       [4] (null? 'nil)
       ()
       [5] (null? t)
       ()


      Из примеров видно, что NULL? работает как логическое отрицание, у которого в
Лиспе есть и свой, принадлежащий логическим функциям, предикат (NOT X):
       [0] (not t)
       ()
       [1] (not nil)
       #T
       [2] (not (not t))
       #T
       [3] (not (not nil))
       ()
       [4] (not (null? nil))
       ()