Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб апр 20, 2024 07:45

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Замена >NUMBER в СПФ4
СообщениеДобавлено: Пн фев 19, 2007 21:18 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
надоел мне SPFовский >NUMBER - так по-моему будет получше
Код:
\ Преобразование числовых литералов при интерпретации.

\ умножение числа двойной длинны на одинарное
: DU* ( d u --> d ) TUCK * >R UM* R> + ;

\ преобразовать символ в цифру √
\ выход за пределы диапазона не контролируются
: >CIPHER ( c --> u )
          BEGIN DUP [CHAR] 9 > WHILE
                DUP [CHAR] ` > WHILE
                   87 - EXIT
            REPEAT 55 - EXIT
          THEN     48 - ;

\ попытаться преобразовать символ char в цифру,
\ в системе исчисления, определяемой base √
: DIGIT ( char base --> u TRUE | FALSE )
        SWAP >CIPHER TUCK U>
        IF TRUE ELSE DROP FALSE THEN ;

\ добавить цифру x к числу d*base √
: CIPHER ( d x --> d )
         U>D 2SWAP BASE @ DU* D+ ;

\ перевести символьное представление числа во внутреннее ( двоичное ) √
\ преобразование ведется до конца строки или до первого непреобразуемого
\ символа. Если #2 равно нулю преобразование успешно.
: >NUMBER ( ud1 asc1 #1 --> ud2 asc2 #2 )
          BEGIN DUP WHILE               \ пока не конец строки
            OVER C@ BASE @ DIGIT WHILE  \ до первой непреобразуемой цифры
            -ROT SKIP1 2>R CIPHER 2R>   \ добавить цифру
           REPEAT
          THEN ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 21, 2007 23:23 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
небольшая правка назрела:
Код:
\ преобразовать символ в цифру √
: >CIPHER ( c --> u|-1 )
          DUP [CHAR] 0 [CHAR] : WITHIN IF 48 - EXIT THEN
          DUP [CHAR] A [CHAR] [ WITHIN IF 55 - EXIT THEN
          DUP [CHAR] a [CHAR] { WITHIN IF 87 - EXIT THEN
          DROP -1 ;

а то глюкаво получается


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

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


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

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


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

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