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

представление чисел
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2221
Страница 3 из 5

Автор:  Hishnik [ Вт авг 04, 2009 23:25 ]
Заголовок сообщения: 

Вообще, это все выглядит несколько косметическим. Есть NUMBER, который занимается преобразованием. Его вариантов можно иметь хоть два десятка - под все мыслимые комбинации правил разбора, приемом/неприемом 0x 0b 0d в качестве принудительной установки системы счисления, L или : для признака числа двойной длины, точки для нее же или для вещественных чисел.

Автор:  Wlad [ Вт авг 04, 2009 23:52 ]
Заголовок сообщения: 

А можно, как в Аде: 16rOFB15 8r4253 10r123 36R_YET_ONE_NUMBER
Последнее число с большим R - длинное, подчёркивания - для наглядности представления групп разрядов...

Автор:  WingLion [ Ср авг 05, 2009 00:42 ]
Заголовок сообщения: 

вопрос писал(а):
и 0 (NULL) перед восьмеричными

точно NULL, а не OCTAL?

Автор:  WingLion [ Ср авг 05, 2009 00:44 ]
Заголовок сообщения: 

Wlad писал(а):
16rOFB15 8r4253 10r123 36R_YET_ONE_NUMBER

ой, а я поначалу решил, что это UUE-кодирование...

Автор:  garbler [ Ср авг 05, 2009 11:48 ]
Заголовок сообщения: 

в бейсике аналогичная система: &h (hex) &b (bin) &o (oct) и т.д. (хотя с адой, конечно, не сравнится)
причём совершенно необязательно тянуть это всё в NUMBER, т.к. префикс можно реализовать отдельным словом.
в принципе, даже сам NUMBER необязателен (особенно в bootstrap компиляторе).
т.е. H: D: B: 2H: 2D: 2B: N: 2N:

Код:
REQUIRE .S lib/include/tools.f

( bootstrap primitives )
DECIMAL : 0 0 ;

\ ---------------------------------------------------------
: N:
    0 0 BL WORD COUNT >NUMBER IF
    ( here we can deal with suffix )
    THEN 2DROP
    STATE @ IF LIT, THEN
; IMMEDIATE

\ ---------------------------------------------------------
: MK-FN-BASE-NUM:
    CREATE , IMMEDIATE DOES> @ BASE @ SWAP BASE !
    [COMPILE] N: STATE @ 0= IF SWAP THEN
    BASE !
;

\ ---------------------------------------------------------
N:  2 MK-FN-BASE-NUM: B:
N:  8 MK-FN-BASE-NUM: O:
N: 10 MK-FN-BASE-NUM: D:
N: 16 MK-FN-BASE-NUM: H:

\ ---------------------------------------------------------
: test D: 321 . H: FF . CR ;
  test D: 123 . H: FF . CR

\ ---------------------------------------------------------
BYE


WingLion писал(а):
ой, а я поначалу решил, что это UUE-кодирование...

в UUE регистр букв всегда одинаковый

p.s.

аналогичный принцип, кстати, к строкам применим

Код:
\ ---------------------------------------------------------
: S:
    BL PSKIP
        >IN @ TIB + C@
        [CHAR] < OVER = IF DROP [CHAR] > ELSE
        [CHAR] ( OVER = IF DROP [CHAR] ) ELSE
        [CHAR] { OVER = IF DROP [CHAR] } ELSE
        [CHAR] [ OVER = IF DROP [CHAR] ] ELSE
        THEN THEN THEN THEN

     >IN 1+! PARSE

     [COMPILE] SLITERAL
; IMMEDIATE

\ ---------------------------------------------------------
    S: <qwe> TYPE CR
    S: (zxc) TYPE CR
    S: /asd/ TYPE CR
    S: "'quote'" TYPE CR
    S: '"quote"' TYPE CR

: test
    S: <qwe> TYPE CR
    S: (zxc) TYPE CR
    S: /asd/ TYPE CR
    S: "'quote'" TYPE CR
    S: '"quote"' TYPE CR
;
test

\ ---------------------------------------------------------
BYE

Автор:  вопрос [ Ср авг 05, 2009 13:11 ]
Заголовок сообщения: 

Цитата:
аналогичный принцип, кстати, к строкам применим

слишком большая свобода рещений препятствует унификации и, в конечном счёте, публичному успеху технологии

Автор:  garbler [ Ср авг 05, 2009 13:34 ]
Заголовок сообщения: 

вопрос писал(а):
garbler писал(а):
аналогичный принцип, кстати, к строкам применим

слишком большая свобода рещений препятствует унификации


да какая уж тут свобода? в парсере полностью отсутствуют исключения и умолчания,
а значение слов исходного текста определяется исключительно префиксами (нечто обратное
к "total rpn").

что касается скобок для текстовых строк (парные скобки + произвольный символ), так это
было ещё в MACRO-11 (ассемблер в PDP системах), а из современных языков, ну, например, PERL.

p.s.


и, если очень хочется, всегда можно сделать ' D: IS NOTFOUND
(этот фрагмент кода для "воображаемой" системы)

Автор:  garbler [ Ср авг 05, 2009 14:00 ]
Заголовок сообщения: 

по поводу вопроса mOleg, на самом деле - все варианты могут быть полезны.

я вижу 2 формы использования:

1.2 => 2 1 позволяет управлять содержимым ячеек на стеке, и доступом к ним
но тогда это не число, а числовая пара (скажем - указатель на что-то или
значение плюс тег или эмуляция плавающей точки (ввода))

1.2 => 12 0 (или 0 12) позволяет вводить числа двойного размера для дальнейших действий
с ними.

представляется полезным оставить формат: 1.2, который бы всегда выдавал 2 числа: 2 и 1
и добавить к нему набор конвертеров: CVTF в плавающую точку, CVTD в целое число двойного размера
(т.е. превращая эти 2 1 в 12 0 или 0 12 в зависимости от архитектуры) и т.д.

правда, при такой схеме становятся представимы не все числовые константы,
но, опять-же, лично я реализовал бы 2D: (или DD: - кому что нравится)

если очень хочется по умолчанию иметь возможность обрабатывать числа двойной
длины, то точку лучше закрепить за флоатами, а признаком числа двойной длины сделать "_",
которыми (в произвольном количестве) визуально разделять разряды:

123_456 или 2_3_4_56_78_9 или 10_000 или 99_999_999_999

тем более, что это согласуется с мэйнстримом
http://www.ruby-doc.org/docs/Programmin ... types.html

Автор:  Pretorian [ Ср авг 05, 2009 16:47 ]
Заголовок сообщения: 

Что то уж сильно навороченно получается, парсер сам может разобраться какой размер числа в строке. Может тогда по выходу с преобразования давать добавочный аргумент который будет объяснять что все же после парсинга на стеке лежит?

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

garbler писал(а):
по поводу вопроса mOleg, на самом деле - все варианты могут быть полезны.
я вижу 2 формы использования:

ну, для начала напомню, что в Форте с точкой идут двойные числа, но вот тут есть хитрый момент, одни форты считают точку просто признаком двойного числа (СПФ), а другие(СМАЛ32) точкой разделения младшей части от старшей части, так к примеру пока что и в форке сделано.
Но, точка у большого количества народа вызывает отвращение, поэтому, я решил таки ставить :
собственно говоря я так же уже сделал предупреждение в случае, если число имеет двойную длину но не содержит точку :)
напомню, что у меня числа опознаются так же, как обычные слова, то есть их распознает словарь, поэтому навернуть можно любой синтаксис с помощью другого словаря 8)

Автор:  Hishnik [ Ср авг 05, 2009 20:53 ]
Заголовок сообщения: 

Pretorian писал(а):
Что то уж сильно навороченно получается, парсер сам может разобраться какой размер числа в строке. Может тогда по выходу с преобразования давать добавочный аргумент который будет объяснять что все же после парсинга на стеке лежит?

Бывают ведь и опечатки. Автоматическое распознавание может зайти слишком уж далеко, и получится хитрая логическая ошибка. Например, D0 вместо DO может автоматически распознаться как 0xD0, что вполне допустимо с точки зрения формата числа, но бессмысленно как замена слову DO.

Автор:  garbler [ Ср авг 05, 2009 22:29 ]
Заголовок сообщения: 

Хищник писал(а):
.... skip... Бывают ведь и опечатки. Автоматическое распознавание может зайти слишком уж далеко, и получится хитрая логическая ошибка. Например, D0 вместо DO может автоматически распознаться как 0xD0, что вполне допустимо с точки зрения формата числа, но бессмысленно как замена слову DO.


угу, очень похожий пример из реальной жизни: http://catless.ncl.ac.uk/Risks/5.66.html#subj2 NASA ракеты со спутниками так теряла

Автор:  garbler [ Ср авг 05, 2009 22:32 ]
Заголовок сообщения: 

mOleg писал(а):
...skip... Но, точка у большого количества народа вызывает отвращение, поэтому, я решил таки ставить :


ну, к слову, в лиспе она применяется для этих целей, запись вида (1.2) там никого не смутит
(точечная пара из двух чисел 1 и 2) http://www.csci.csusb.edu/dick/samples/lisp.syntax.html

Автор:  Wlad [ Чт авг 06, 2009 00:00 ]
Заголовок сообщения: 

Точечная пара - не представление числа.

Автор:  вопрос [ Чт авг 06, 2009 00:49 ]
Заголовок сообщения: 

Хищник писал(а):
Например, D0 вместо DO может автоматически распознаться как 0xD0, что вполне допустимо с точки зрения формата числа, но бессмысленно как замена слову DO.

Префиксы - всему, что не десятичное и, может быть, вообще всему, что может вызвать разночтение

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