> 1 <

Автор Сообщение

taikonavt

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#602   2009-08-13 14:13 GMT+3 часа(ов)      
Подскажите пожалуйста, никак не пойму почему значение (eq '(a b) '(a b)) - NIL

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#604   2009-08-13 16:39 GMT+3 часа(ов)      
в Lisp 4 функции cравнения: EQ, EQL, EQUAL, EQUALP - по нарастающей сравнивают более сложные структуры

EQ - самая простая - она сравнивает 2 указателя.
Для сравнения 2-х разных списков на идентичное содержимое надо юзать EQUALP

love5an

Members


Статус

25 сообщений

Где: Russia
Род занятий:
Возраст:

#605   2009-08-14 16:55 GMT+3 часа(ов)      
EQ дает T только тогда, когда операнды представляют собой один и тот же объект (грубо говоря - ссылку на один и тот же объект)

В случае с "примитивными" типами данных, вроде чисел и букв(character) это отдается на усмотрение реализации, (eq #\a #\a) может быть как T, так и NIL(хотя (let ((x #\a)) (eq x x)) естественно всегда будет T). Для этих типов данных есть EQL. Соответственно, (eql #\a #\a) всегда будет T. Естественно, eql "включает" в себя сравнение по eq.

В случае с символами(Symbol) - в каждом пакете может быть только один символ с неким конкретным именем, и он, естественно, EQ сам себе.

По EQUAL объекты идентичны если они идентичны по EQL или же являются составными объектами(кроме, емнип, многомерных массивов и объектов классов clos(которые от defclass)) и их элементы рекурсивно идентичны по EQUAL.

EQUALP - самая "широкая" функция сравнения, вот описание:
http://www.lispworks.com/documentation/HyperSpec/Body/f_equalp.htm

Она, к примеру, регистронезависимо сравнивает строки(хотя для этой цели лучше использовать специальную функцию string-equal, потому как быстрее работает).

taikonavt

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#612   2009-08-19 13:12 GMT+3 часа(ов)      
спасибо за помощь
> 1 <


Онлайн :

0 пользователь(ей), 26 гость(ей) :




Реклама на сайте: