Forth
http://www.fforum.winglion.ru/

конвертирование флагов
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2310
Страница 2 из 2

Автор:  mOleg [ Чт ноя 19, 2009 18:05 ]
Заголовок сообщения: 

вопрос писал(а):
Цитата:в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си
Вот всегда ли хорошо критиковать промышленный стандарт? Может там не всё так нелогично?

я не знаю, долго ли думали создатели Си о том, почему и как должны, но в отношении Форта могу предложить следующую выдержку из перевода "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 должен отловить как ошибку

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

Страница 2 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/