Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 14:57

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 19, 2009 18:05 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
Цитата:в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си
Вот всегда ли хорошо критиковать промышленный стандарт? Может там не всё так нелогично?

я не знаю, долго ли думали создатели Си о том, почему и как должны, но в отношении Форта могу предложить следующую выдержку из перевода "Thinking Forth" от Броуди:
Цитата:
ВЫЧИСЛЕНИЕ РЕЗУЛЬТАТОВ.
------------------------------------------------------------
СОВЕТ
Не принимайте решений, но вычисляйте.
------------------------------------------------------------
226
Во многих случаях условные операторы применяются ошибочно тогда, когда
различные варианты поведения обусловливаются численными различиями. Раз
задействованы числа, то мы их можем посчитать. (См. в главе 4 раздел "Расчеты или
структуры данных или логика".)
------------------------------------------------------------
СОВЕТ
Используйте логические значения в качестве чисел.
------------------------------------------------------------
Это высказывание замечательно венчает собой предыдущий совет "Не принимайте
решений, но вычисляйте". Идея состоит в том, что булевские значения, которые в
компьютере представлены числами, могут быть эффективно использованы для
улучшения принятия решений. Вот один пример, встречающийся во многих Форт-
системах:
: S>D ( n -- d ) \ распространение знака на d
DUP 0< IF -1 ELSE 0 THEN ;
(Задачей этого определения является превращение числа одинарной длины в число
двойной длины. Это последнее представляется как два 16-разрядных числа на стеке,
старшие разряды - на вершине. Превращение положительного целого заключается просто
в добавлении нуля на стек для представления этой старшей части. Но преобразование
отрицательного требует "расширения знака", то есть старшая часть должна быть
представлена всеми единицами.)
Вышеприведенное определение проверяет одинарное число на отрицательность.
Если таковая обнаружена, оно кладет на стек минус-единицу; в противном случае - ноль.
Но обратите внимание, что выход получается чисто арифметическим;
качественных изменений самого процесса нет. Из этого факта можно извлечь выгоду,
используя само логическое
значение:
: S>D ( n -- d ) \ распространение знака на d
DUP 0< ;
Эта версия оставляет на стеке ноль или минус-единицу без принятия решений.
(В системах до 83-го стандарта определение должно было бы быть таким):
: S>D ( n -- d ) \ распространение знака на d
DUP 0< NEGATE ;
См. приложение В.)
С такими "гибридными числами" можно проделывать даже больше:
------------------------------------------------------------
СОВЕТ
Для повышения эффективности формирования числового выхода
используйте AND.
------------------------------------------------------------
227
Для случая структуры, принимающей решение о формировании нуля либо
ненулевого числа "n", традиционная фраза
( ? ) IF n ELSE 0 THEN
эквивалентна более простому выражению
( ? ) n AND
Опять же секрет в том, что в системах стандарта '83 "истина" представляется -1
(всеми единичками). Делая AND числу "n" с флагом, мы оставляем либо "n" (все биты
остаются), либо "0" (все биты очищаются).
Для закрепления - еще пример:
( ? ) IF 200 ELSE 0 THEN
то же самое, что
( ? ) 200 AND
Посмотрите на следующий случай:
n a b < IF 45 + THEN
Фраза либо добавляет 45 к "n", либо нет, в зависимости от соотношения величин
"a" и "b". Поскольку "добавить 45 или нет" - это то же, что и "добавить 45 или добавить
0", то различие в двух возможных исходах - чисто числовое. Мы можем позволить себе
избежать принятия решения и просто вычислить:
n a b < 45 AND +
----------------------------------------------------------------
Мур:
Выражение "45 AND" работает быстрее, чем IF, и, конечно, более
грациозно. Оно проще. Если Вы освоите привычку обращать внимание на точки, в
которых вычисляете отличие одного значения от другого, то обычно при
выполнении арифметических действий над логическими величинами Вы будете
получать тот же результат более чистым образом. Я не знаю, как это называется.
Здесь нет терминологии - просто выполнение арифметики со значениями "истина".
Но это совершенно корректно, и когда-нибудь булева алгебра и арифметические
выражения к этому приспособятся.
В книгах часто встречается множество кусочно-линейных аппроксимаций,
неспособных ясно изобразить положение дел. К примеру, выражение:
x = 1 для t < 0
x = 0 для t >= 0
было бы эквивалентно
t 0< 1 AND
как единому, а не кусочному выражению.
----------------------------------------------------------------
228
Я называю подобные флаги "гибридными величинами", поскольку они - булевские
значения (значения "истина"), которые применяются в качестве данных (арифметических
величин). Я тоже не знаю, как их еще назвать.
Можно сократить также и многочисленные ELSEы (когда оба результата - не
нулевые), вычленяя различие между результатами.
К примеру,
: ШАГОВИКИ 'ПРОВЕРКА? @ IF 150 ELSE 151 THEN LOAD ;
может быть упрощено до
: ШАГОВИКИ 150 'ПРОВЕРКА? @ 1 AND + LOAD ;
Этот подход работает потому, что, по смыслу, мы хотим загрузить либо блок 150,
либо, для тестирования, следующий после него блок.


вопрос писал(а):
Цитата:if(value=true){someting};
если внутри if() действие вместо сравнения ( = вместо ==) то компилятор проглотит, но результаты непредсказуемы -
хотя GCC должен отловить как ошибку

имелось ввиду сравнение, а не присвоение (просто я забыл о дурацком == в сях, впрочем имел место псевдокод)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB