> 1 <

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

filimon

Members


Статус

9 сообщений

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

#5661   2012-02-03 18:06 GMT+3 часа(ов)      
В "Мир Лиспа" объясняется, что EQ используется исключительно с символами и константами T И NIL и не используется с числами. Но почему тогда EQ правильно сравнивает переменные? То есть,
(defvar x 2)
(defvar y 2)
(eq x y)
T

И почему (eq 2 2) выдаёт истину, а (eq 3.14 3.14) выдаёт ложь?
И почему (eq a b) выдаёт ошибку, если a b не объявлены предварительно как переменные? То есть, буквы не являются символами, а переменные являются? И целые числа - это символы, а дробные - нет?
Я совсем запутался. Может кто-нибудь немного попонятней объяснить эти вещи? )))))

megamanx

Members


Статус

307 сообщений

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

#5662   2012-02-03 18:24 GMT+3 часа(ов)      
Переменная может хранить значение, либо ссылку на него. Что будет храниться, зависит от размера.
eq - сравнивает значения, хранящиеся в переменной, equal - сравнивает значения, на которые ссылается переменная.
(eq 2 2)
2 умещается в 2-е слово, они равны.
(eq 3.14 3.14)
число с плавающей точкой не помещается в двойное слово, создаются две копии, каждая по своему адресу. Переменные хранят различный адрес, поэтому их сравнение на eq даёт nil. Сравнение на equal даст T.
Здесь двойное слово - условный размер, он зависит от реализации. Обычно меньше, так как часть битов используется для хранения типа и маркировки при работе сборщика мусора.
В яве объекты можно сравнивать на ==, но это даст false. Для сравнения используется equals
"ololo".equals("ololo") -> true
"ololo" == "ololo" -> false

отредактировал(а) megamanx: 2012-02-03 18:36 GMT+3 часа(ов)
I wish I'd made you angry earlier

filimon

Members


Статус

9 сообщений

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

#5663   2012-02-03 19:14 GMT+3 часа(ов)      
Теперь я ещё отчётливее стал ощущать свою тупость ))) Вообще перестал понимать)) Либо Лисп не предназначен для меня, либо начинать изучать программирование с Си было плохой идеей.. )) Там ведь никаких проблем не было, а тут в самом начале застрял.. видимо, привык к строгой типизации и прочим сишным чертам..

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#5666   2012-02-03 23:42 GMT+3 часа(ов)      
В Лиспе (как и в C#) типы данных можно разделить на примитивные(типы значения) и ссылочные.
Цитата
Тип данных является типом значений, если он содержит данные в пределах своей собственной области памяти. Ссылочный тип содержит указатель на другую область памяти, содержащую данные.

Так вот, в Лиспе числа с плавающей точкой, большие целые, строки, вектора, списки и др. - являются ссылочными. А небольшие целые (int32), символы (symbol(все, кроме специальных) и character), nil - примитивными.

EQ сравнивает два объекта.
Если разные типы, то NIL. Иначе если оба являются одинаковыми примитивными типами и их значения равны, то T, иначе NIL. А если ссылочными, тогда проверяются ссылки, т.е. если обе ссылки указывают на одну и ту же область памяти, то T, иначе NIL.

> число с плавающей точкой не помещается в двойное слово

Кстати, 3.14 можно представить как float16.

megamanx

Members


Статус

307 сообщений

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

#5667   2012-02-03 23:48 GMT+3 часа(ов)      
Примитивные и ссылочные, точно, этих слов и не хватало.
I wish I'd made you angry earlier

filimon

Members


Статус

9 сообщений

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

#5672   2012-02-04 07:34 GMT+3 часа(ов)      
Цитата
megamanx :
Примитивные и ссылочные, точно, этих слов и не хватало.


Да, вот как раз именно этих-то слов и не хватало ))) Теперь всё понятно, больше не туплю. Большое спасибо!
> 1 <


Онлайн :

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




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