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

преобразование строкового представления угла вида 12°12'12"
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2929
Страница 1 из 5

Автор:  mOleg [ Сб май 04, 2013 21:47 ]
Заголовок сообщения:  преобразование строкового представления угла вида 12°12'12"

source file: alp.fts
\ 13.03.2013 ~mOleg
\ Copyright [C] 2013 mOleg mOlegg@ya.ru
\ преобразование строкового представления угла вида 12°12'12" в угловые секунды

branch/ case.fts
math/ double.fts

\ попытка распознания строки символов как числа,
\ в случае успеха возвращается распознанное значение ud строка
\ с нераспознанными символами asc # и значение завершающего символа
\ в случе неуспеха возвращается 0
: >nux ( asc # --> ud asc # char | 0 )
DUP >L
0`0 DSWAP 0x0A >number
L> OVER - IFNOT DDROP DDROP FALSE ;THEN
*IF OVER C@ >L SKIP1 L> *IF ;THEN DROP THEN
DDROP DDROP FALSE ;

\ попытка распознать строку asc # как значение угла в угловых секундах
: sec ( ud asc # --> ud 2 | 0 )
>nux *IF [CHAR] " = IF IFNOT DROP D+ 2 ;THEN
DDROP TDROP FALSE ;THEN
TDROP TDROP FALSE ;THEN
NIP NIP ;

\ попытка распознать строку asc # как значение в угловых минутах и секундах
: min ( ud asc # --> ud 2 | 0 )
>nux *IF CASE [CHAR] ' OF D>L 0`60 UD* D+ DL> *IF sec ELSE DDROP 2 THEN ENDOF
[CHAR] " OF NIP IFNOT D+ 2 ELSE DDROP DDROP FALSE THEN ENDOF
TDROP DDROP FALSE
ENDCASE
;THEN
TDROP FALSE ;

\ попытка распознать строку asc # как значение угла вида 123°35'12"
\ допустимы только положительные значения угла
\ в случае успеха возвращается значение угла в угловых секундах и 2
\ в случае неуспеха возвращается 0
: agl>sec ( asc # --> ud 2 | 0 )
>nux *IF CASE [CHAR] ° OF D>L 0`3600 UD* DL> *IF min ELSE DDROP 2 THEN ENDOF
[CHAR] ' OF D>L 0`60 UD* DL> *IF sec ELSE DDROP 2 THEN ENDOF
[CHAR] " OF IFNOT DROP 2 ELSE TDROP FALSE THEN ENDOF
TDROP DDROP FALSE
ENDCASE
THEN
;

ALSO HIDDEN

\
: sAglLfa ( asc # vid --> lfa | 0 ) DROP \ vid словаря не нужен
agl>sec *IF DROP last-number D! LFA (vdlit) THEN ;

init: VOCABULARY \ создание стандартного словаря.
VOC-LIST A@ >L \ wordlist
['] sAglLfa L@ off_quest A!
0 L@ off_vtable A! \ отсутствует vtable
0 L@ off_last A! \ слов в словаре нет
['] no-mount L@ off_mount A!
['] no-umount L@ off_umount A!
&vinit L> off_vflags B!
;stop ANGLES

PREVIOUS

дальше
ALSO ANGLES
и можно вводить углы

Автор:  gudleifr [ Сб май 04, 2013 21:58 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

Мур:
Цитата:
Your application may need special number formats:
45'6 for 45ft.6in., an integer
1,000,000 an integer
$45.69 an integer
It is not hard to include such numbers in NUMBER, but you cannot include all possible formats. Some are incompatible:
3'9 for 3ft.9in.
12'30 for 12min.30sec. of arc
12'30 for 12min.30sec. of time
4'6 for 4 shillings 6 pence

Автор:  mOleg [ Сб май 04, 2013 22:07 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

gudleifr писал(а):
It is not hard to include such numbers in NUMBER, but you cannot include all possible formats. Some are incompatible:

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

Автор:  gudleifr [ Сб май 04, 2013 22:16 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

mOleg писал(а):
добавляешь словарь
Я понимаю слова Мура так:
Есть в твоей задаче такой формат?
Значит, когда будешь писать под нее Forth, в его NUMBER засунешь и его.
Но не раньше!

Изменить NUMBER , не меняя Forth?
Извращение, конечно, но вполе по силам.
1. У меня его функционал описывается регулярным выражением,
2. У Вас словари имеют свои FIND, почему же не могут иметь и свой NUMBER ?

В любом случае IF-ы, это слишком скучно.

Автор:  mOleg [ Сб май 04, 2013 22:25 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

во-первых, причем тут NUMBER ? таки обычно распознавалка внутри INTERPRET
во-вторых, я засуну формат когда мне надо, точнее активно правя контекст могу включать и исключать распознавание любых вещей. Хочу - убираю распознавание чисел вообще, хочу, выбираю порядок "распознавалок" нужным мне образом. (в отличие, к примеру, от механизма NOTFOUND)

gudleifr писал(а):
Изменить NUMBER , не меняя Forth?

еще раз, NUMBER ни при чем

gudleifr писал(а):
У меня его функционал описывается регулярным выражением,

gudleifr писал(а):
В любом случае IF-ы, это слишком скучно.

имхо, дело вкуса.

gudleifr писал(а):
2. У Вас словари имеют свои FIND, почему же не могут иметь и свой NUMBER ?

утверждение не понял, посяни.

Автор:  gudleifr [ Сб май 04, 2013 22:34 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

mOleg писал(а):
еще раз, NUMBER ни при чем
А распознавать числа где-то в другом месте - лишняя трата ресурсов, лишний источник ошибок...
gudleifr писал(а):
утверждение не понял, посяни.
В смысле у Вас FIND один на все словари?
Значит у меня склероз, мне казалось структура словарей у Вас была нефиксированной.
Или - в смысле разный NUMBER некуда цеплять?

A-a... Дошло... Но зачем вставлять "преобразователь" между FIND и NUMBER , если можно засунуть его в NUMBER ?

Автор:  mOleg [ Сб май 04, 2013 22:46 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

gudleifr писал(а):
А распознавать числа где-то в другом месте - лишняя трата ресурсов, лишний источник ошибок...

эхм, ну, вот в СПФ смотрим:
Код:
: INTERPRET_ ( -> ) \ интерпретировать входной поток
  BEGIN
    PARSE-NAME DUP
  WHILE
    SFIND ?DUP
    IF
         STATE @ =
         IF COMPILE, ELSE EXECUTE THEN
    ELSE
         S" NOTFOUND" SFIND
         IF EXECUTE
         ELSE 2DROP ?SLITERAL THEN
    THEN
    ?STACK
  REPEAT 2DROP
;

вообще NUMBER в стандарте отсутствует, есть >NUMBER

что же касается интерпретатора в форке:
Код:
\ интерпретировать одну лексему ?
: EVAL-TOKEN ( asc # --> )
             SFINDLFA
             *IF ?EXECUTABLE LINK>XTI
               ELSE DROP ?NOTFOUND
             THEN
             0 > IF EXECUTE ;THEN
                    REGULAR ;

\ интерпретировать входной поток ?
: (INTERPRET) ( --> )
              BEGIN NextWord *WHILE
                    EVAL-TOKEN ?STACK
              REPEAT DDROP ;

вобщем нету вообще ничего кроме словарей (оно проще выходит и гибче)

gudleifr писал(а):
В смысле у Вас FIND один на все словари?

каждый словарь ищет данные внутри себя сам, но SFIND один:
В кратце здесь.

Автор:  gudleifr [ Сб май 04, 2013 23:06 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

Про NOFIND до меня, наконец, дошло.
Но мне кажется, это очень неудобно.
FIND ищет слова, NUMBER распознает литералы, какой-нибудь FDISK ищет ненайденные слова на диске... Каждый работает в своей области, не пересекаясь с остальными...

А так, допустим, мне надо умножить значение угла на целое...
Если оба числа распознаются NUMBER , мне плевать на контексты, и я могу вводить эти два числа в любом порядке...
А в Вашем случае я должен быть уверен, что "угловой" NOFIND правильно распознает еще и целые числа. А если потом мне понадобится ввести множитель по-римски?

Все. Идею уловил... Не буду Вас больше доставать, пока опять не забуду, что такое fork...

Автор:  mOleg [ Сб май 04, 2013 23:23 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

gudleifr писал(а):
Про NOFIND до меня, наконец, дошло.Но мне кажется, это очень неудобно.

это просто достаточно неуправляемо (в отличие от контекста).

gudleifr писал(а):
FIND ищет слова, NUMBER распознает литералы, какой-нибудь FDISK ищет ненайденные слова на диске... Каждый работает в своей области, не пересекаясь с остальными...

это хорошо и плохо одновременно.
Единый механизм поиска все же заманчивее.

gudleifr писал(а):
А так, допустим, мне надо умножить значение угла на целое...Если оба числа распознаются NUMBER , мне плевать на контексты, и я могу вводить эти два числа в любом порядке...

с контекстом то же самое, только можно еще и задать приоритет (порядок).

gudleifr писал(а):
А в Вашем случае я должен быть уверен, что "угловой" NOFIND правильно распознает еще и целые числа.

так, стоп, NOFOUND (?) это вообще из дургой оперы.

по умолчанию в контексте находятся следующие словари:
ROOT NUMBERS FORTH
NUMBERS распознает целые числа и числа двойной длины, все.
если его убрать из контекста, числа вообще не будут распознаваться,
если, к примеру, хочется чтоб распознавались числа в формате с плавающей точкой, необходимо:
ALSO FLOAT

gudleifr писал(а):
Не буду Вас больше доставать

8) вы меня особо и не доставали

Автор:  gudleifr [ Сб май 04, 2013 23:44 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

Да, конечно, не NOFIND , а NOTFOUND ...
Тогда, допустим, все потребные контексты в наличии и я ввожу что-то вроде
2. 30° D*
или
30° 2. D*
как это пройдет по цепочке распознавателя (в [не]зависимости от порядка включения контекстов]?

Автор:  mOleg [ Сб май 04, 2013 23:57 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

если в контексте: ROOT NUMBERS FORTH ANGLES
то в первом случае, т.е. 2. попытается распознать ANGLES, потом FORTH, вернет значение NUMBERS
30° вернет ANGLES, т.е. сразу же будет распознано

вообще, мне кажется, вы не очень хорошо понимаете как работает контекст, т.е. как устроен поиск в таком случае.

Автор:  gudleifr [ Вс май 05, 2013 00:03 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

mOleg писал(а):
вы не очень хорошо понимаете как работает контекст
Черт, опять забыл, что Ваш путь - отказ от наследования лексиконов. Осталось выучить, что такое off_quest... А-а, "свой FIND"...
...
Блин, все равно, через задницу. И, все равно, будут конфликты. Проще NUMBER поправить, чем считать любую хрень с предвыборкой словарем.

Автор:  mOleg [ Вс май 05, 2013 00:15 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

gudleifr писал(а):
Ваш путь - отказ от наследования лексиконов

ну, таки это в стандарте прописано 94.

gudleifr писал(а):
Осталось выучить, что такое off_quest...

смещение внутри структуры, описывающей словарь.
собственно, я уже приводил выше ссылку, где описано как все устроено.

Автор:  gudleifr [ Вс май 05, 2013 00:30 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

Еще чуть-чуть и Вы поймете, что слово WORD тоже является контекстом - с пустым off_quest . Круг замкется.
mOleg писал(а):
ну, таки это в стандарте прописано 94.
В стандарте, в данном случае прописано - делайте, как хотите, мы умываем руки.

Автор:  mOleg [ Вс май 05, 2013 00:44 ]
Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'

gudleifr писал(а):
WORD

что есть слово WORD ?

gudleifr писал(а):
В стандарте, в данном случае прописано - делайте, как хотите, мы умываем руки.

там предложен механизм, который реализован в большинстве систем совместимых с ANSI X3.215-1994

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