Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 23:38

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

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

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

имелось ввиду сравнение, а не присвоение (просто я забыл о дурацком == в сях, впрочем имел место псевдокод)
Сообщение Добавлено: Чт ноя 19, 2009 18:05
  Заголовок сообщения:   Ответить с цитатой
Цитата:
в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си

Вот всегда ли хорошо критиковать промышленный стандарт? Может :wink: там не всё так нелогично?
Цитата:
if(value=true){someting};

если внутри if() действие вместо сравнения ( = вместо ==) то компилятор проглотит, но результаты непредсказуемы -
хотя GCC должен отловить как ошибку
Сообщение Добавлено: Чт ноя 19, 2009 17:49
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си 8)


Просто то, что называется каноническим значением истины, различается: 1 и -1.
Если каноническое значение 1, канонический способ инверсии есть операция "1 XOR"
Если каноническое значение -1, канонический способ инверсии есть операция "NOT"
У каждого выбора свои преимущества и недостатки.
В 4те, например, менее удобно прибавлять булеву величину к целому, чем в С:
sum += cond;
против
cond @ 1 AND sum +!
Сообщение Добавлено: Чт ноя 19, 2009 16:29
  Заголовок сообщения:   Ответить с цитатой
А вот еще чего нашел
The C99 version of C provides a built-in _Bool data type. It is large enough to store the values 0 and 1.
И вот еще....
During its standardization process, the C++ programming language introduced the bool, true and false keywords, adding a native data type to support Boolean data. Its size is implementation-defined.[3] bool was introduced in 1993[4].

Values of type bool are either true or false.[5] Implicit conversions exist between bool and other integral types, floating point types, pointer types, and pointer-to-member types.[6] In addition, user-defined types can be converted to bool via a user-defined conversion operator. In general, a zero or null-pointer value is converted to false, any other value is converted to true.
Сообщение Добавлено: Пт ноя 13, 2009 18:35
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
скорее википедия глючит.

Вполне может быть, но я уже не раз встречал именно такой расклад.
Да и вполне известный факт что разработчики Си компиляторов не так уж
жестко придерживаются стандарта.
т.е. некотрые тоже поступают
mOleg писал(а):
вполне логично и удобно
Сообщение Добавлено: Пт ноя 13, 2009 18:21
  Заголовок сообщения:   Ответить с цитатой
скорее википедия глючит.
вообще, я так понимаю, проблема будет везде, где будет встречаться что-то подобное:
<pre>
if(value=true){someting};
</pre>
если же будет что-то вроде:
<pre>
if(value){someting};
</pre>
проблем быть вроде как не должно, хотя опять же как там будет преобразование типов в конкретном компиляторе проходить не известно.

в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си 8)
Сообщение Добавлено: Пт ноя 13, 2009 18:11
  Заголовок сообщения:   Ответить с цитатой
Ilya писал(а):
Взял справочник по Сям и увидел там что TRUE = 1 (а не любое значение >0 как в Форте)!!!

А вот я в википедии нашел.
Код:
typedef int bool;
#define FALSE 0
#define TRUE (-1)

Похоже у сишников тоже "..... порядку нет как нет" :dmad;
Сообщение Добавлено: Пт ноя 13, 2009 18:06
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
преобразование Форт-флагов в Сишные и обратно:
\ конвертировать сишный флаг в Форт-представление
: >flag ( f --> flag ) 1 - INVERT ;

\ конвертировать Фот-флаг в сишный
: flag> ( flag --> f ) 0 <> 1 AND ;

Можно попроще:
Код:
\ конвертировать сишный флаг в Форт-представление
: >flag ( f --> flag ) NEGATE ;

\ конвертировать Форт-флаг в сишный
: flag> ( flag --> f ) 0<> NEGATE ;
Сообщение Добавлено: Пт ноя 13, 2009 12:02
  Заголовок сообщения:   Ответить с цитатой
VoidVolker писал(а):
А разве не TRUE = "не ноль" ?

все операции, возвращающие флаги во всех Фортах возвращают в качестве TRUE значение -1 (все биты установлены).
однако, все операции анализирующие флаги (IF WHILE и т.п.) считают за TRUE отличное от нуля значение.
Сообщение Добавлено: Пт ноя 13, 2009 07:55
  Заголовок сообщения:   Ответить с цитатой
Цитата:
А разве не TRUE = "не ноль" ?
так должно быть, но бывает и иначе, по крайней мере ввиду индивидуальности каждого форта
Сообщение Добавлено: Чт ноя 12, 2009 23:11
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
в Форте значение TRUE = -1

А разве не TRUE = "не ноль" ?
Сообщение Добавлено: Чт ноя 12, 2009 20:48
  Заголовок сообщения:   Ответить с цитатой
_Harry писал(а):
mOleg писал(а):
Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).

Хм ни разу с таким не сталкивался. Это скорее особености виндовых функций а не Си.
Что скажут знатоки стандартов??? :<

Хоть я и не знаток стандартов, но столкнулся в именно с тем, что вызов API с произвольным значением <>0 не давало требуемого эффекта. Но это скорее "частный" (либа user32.dll ф-ции связанные с DDE) случай.
Взял справочник по Сям и увидел там что TRUE = 1 (а не любое значение >0 как в Форте)!!!
Сообщение Добавлено: Чт ноя 12, 2009 19:33
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).

Хм ни разу с таким не сталкивался. Это скорее особености виндовых функций а не Си.
Что скажут знатоки стандартов??? :<
Сообщение Добавлено: Чт ноя 12, 2009 19:27
  Заголовок сообщения:   Ответить с цитатой
эм, флаги в Форте всегда были, только их значения отличаются от привычных для других ээ, языков.
в Форте значение TRUE = -1 (то есть все биты уставновлены в 1)
значение FALSE = 0 (все биты сброшены).

Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).
Сообщение Добавлено: Чт ноя 12, 2009 19:24
  Заголовок сообщения:   Ответить с цитатой
Что в форте появились флаги???
Это имеется в виду Fаlse и True.
Только мне сдается что любое значение отличное от 0 в Си будет True.
Так что конвертировать нет необходимости.
Или я не прав? :roll:
Сообщение Добавлено: Чт ноя 12, 2009 19:14

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


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