Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 02:16

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 19:52 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
incubus370 писал(а):
теперь FILENAME[] содержит следующую строку но без завершающего нуля "File-0.txt".


добавить код 0 EMIT-TO-NAME, и нолик появится.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Код:
: some ( asc1 # asc2 # u --> asc # )
           S>D <#  2SWAP HOLDS  \ расширение
                         #S                   \ добавили циферки
                         2SWAP HOLDS  \ добавили имя файла
                    #> ;
S" aaaa" S" .txt" 123 some TYPE

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 19:57 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
: some ( asc1 # asc2 # u --> asc # )
S>D <# 2SWAP HOLDS \ расширение
#S \ добавили циферки
2SWAP HOLDS \ добавили имя файла
#> ;
S" aaaa" S" .txt" 123 some TYPE


S>D <# HOLDS #> S" - ничего из этого в кварке нет. Речь идет о другом алгоритме.


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Хищник писал(а):
S>D <# HOLDS #> S" - ничего из этого в кварке нет.

В СПФе будет работать,
А вообще кварк со строками работать умеет?

Хищник писал(а):
Речь идет о другом алгоритме.

(я конечно не смотрел, но осуждаю)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 20:00 
Не в сети

Зарегистрирован: Вс апр 17, 2011 12:28
Сообщения: 34
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
incubus370 писал(а):
теперь FILENAME[] содержит следующую строку но без завершающего нуля "File-0.txt".


добавить код 0 EMIT-TO-NAME, и нолик появится.


Надо будет подправить.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 20:27 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
А вообще кварк со строками работать умеет?

Не, у него там блокировки на уровне ядра :))

В чем проблема-то? Что в кои-то веки одноразовые <# # #> пригодились для частной задачки, и то, если вовремя про них вспомнить? А векторизованная словарная статья работает в куче алгоритмов и даже не требует специального обдумывания, как, зачем и для чего оно могло бы пригодиться.


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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Хищник писал(а):
S>D <# HOLDS #> S" - ничего из этого в кварке нет.

Есть же давно. Разве я не выкладывал?
Код:
1 CELLS CONSTANT CELL

: DEFED  \ ( str -- )  \ Синоним двоеточия для строки со стека
  [C]HERE
  CURRENT @ @ [C],    \ LFA  \ записываем адрес начала предыдущего слова
  CURRENT @ [C]!
  BEGIN               \ NFA  \ Пишем имя слова
    DUP C@ [C]C,
    1+
    DUP C@ 0 =
  UNTIL
  DROP 0 [C]C,
  0 [C]C,             \ FFA  \ Один байт для флагов
  ]                   \ CFA  \ А дальше уже код
;

: RET,  \ ( -- ) \ Скомпилировать возврат
  0xC3 [C]C,
;

: :NONAME   \ ( -- xt )  \ Начать определение нового слова без имени, на стеке останется указатель на начало кода(исполнимый токен).
  [C]HERE ]
;

: PROC:   \ ( " name" --> ) \ Начать определение нового слова с именем, взятым из входного потока. Во время выполнения слово оставит на стеке указатель на свой код.
  QUAN [C]HERE [C]HERE 0xA - ! ]
;

: CHAR   \ ( " char" --> ) \ Взять из входного потока следующее слово и оставить на стеке числовой код(ASCII) его первого символа.
  PARSE C@
;

: [CHAR]   \ ( " char" --> ) \ Взять из входного потока следующее слово и скомпилировать числовой код(ASCII) его первого символа. Слово немедленного исполнения.
  PARSE C@ LIT,
; IMMEDIATE

: --   \ ( offset size -- offset+size ) ( " name" --> ) ( addr -- addr+offset )
  CREATE
  OVER , + DOES> @ +
;

: [:]   \ Определить еще одну "точку входа" в слово
  0xE9 [C]C, [C]HERE 0 [C], [C]HERE   \ addr \ адрес, куда записывать переход; "точка" отсчета
  :
  [C]HERE - ABS SWAP !
; IMMEDIATE

\ Пример:
\ : w1
  \ 1
\ [:] w2
  \ 2
\ ;
\ w1 w2  \ --> 2 1 2

\ Вот еще одна дешевая альтернатива локальным переменным
: L1   LOCALSTACK LOCALDEPTH 1-  -FTH ;
: L2   LOCALSTACK LOCALDEPTH 2 - -FTH ;
: L3   LOCALSTACK LOCALDEPTH 3 - -FTH ;
: L4   LOCALSTACK LOCALDEPTH 4 - -FTH ;
: L5   LOCALSTACK LOCALDEPTH 5 - -FTH ;
: L6   LOCALSTACK LOCALDEPTH 6 - -FTH ;
: L7   LOCALSTACK LOCALDEPTH 7 - -FTH ;
: L8   LOCALSTACK LOCALDEPTH 8 - -FTH ;
: L9   LOCALSTACK LOCALDEPTH 9 - -FTH ;


0 , CREATE fpad 256 ALLOT
: -CNT 4 - ;

: char>fpad   \ ( char -- )
  fpad fpad -CNT @ + C!
  CHAR fpad -CNT +!
;

: F>STR   \ ( F: D -- str ) \ Преобразовать флоат-число в строку
  ['] char>fpad TO EMIT  \ Перенаправляем печать в буфер и печатаем в него флоат-число
  0 fpad -CNT !
  F.
  ['] EMIT1 TO EMIT
  0 fpad fpad -CNT @ + C!
  fpad
;

: STR>F   \ ( str -- F: D ) \ Преобразовать строку во флоат-число
  EVALUATE
;


: str>float   \ ( str -- F: D )
  1 >R
  DUP 0
  BEGIN OVER C@ WHILE
    DUP IF R> 10 * >R THEN
    OVER C@  \ Заменяем в строке разделитель на пробел
    [CHAR] , OVER = SWAP [CHAR] . = OR
      IF OVER 32 SWAP C! DROP 1 THEN
    SWAP 1+ SWAP
  REPEAT
  2DROP
  EVALUATE
  SWAP S>F S>F R> S>F F/ F+
;

: /STRING   \ ( a u n -- a+n u-n ) \ Обрезать au-строку слева на n символов
  DUP NEGATE SWAP D-
;

: EXIT RDROP ;

: 2SWAP  ROT >R ROT R> ;
: 2>L   >L >L ;
: 2L>   L> L> ;

: ZLEN
  >R 0 BEGIN R@ OVER + C@ WHILE 1+ REPEAT  RDROP
;

: Z>AU  DUP ZLEN ;


: ERASE  \ ( a len -- )
  0 ROT ROT CFILL
;

: UNLOOP   \ ( -- ) \ Выйти из цикла DO LOOP
  LSTACKI @ 1+ LSTACKIMAX !
;

: UNNEXT   \ ( -- ) \ Выйти из цикла FOR NEXT
  LSTACKI @ LSTACKIMAX !
;

: GET-WORDS
  " words.txt" NEWFILE TO HF-OUT
  CONTEXT @ BEGIN @ DUP WHILE
    HF-OUT OVER CELL +  Z>AU  \ lfa nfa u
    WRITEFILE
    "   " 1 OVER 4 - ! 0 OVER 1+ C! PRINTF
    CRF
  REPEAT
  HF-OUT CLOSE
  DROP
;


256 ARRAY formats
VARIABLE str-posx

: FPRINT   \ ( str -- ) \ Печать с форматированием
  WHEREX str-posx !
  BEGIN DUP C@ DUP WHILE
    formats OVER -TH @ DUP
      IF
        NIP EXECUTE
      ELSE
        DROP EMIT
      THEN
    1+
  REPEAT
  2DROP
;

: StrFormat  \ ( char -- )
  formats SWAP -TH
  [C]HERE SWAP !
  ]
;

: StrFormat:  \ ( char -> )
  CHAR StrFormat
;

: ;StrFormat [COMPILE] ; ; IMMEDIATE

CREATE abc-nums 256 ALLOT
0xFF abc-nums 256 CFILL

HEX
0 abc-nums CHAR 0 + C!  8 abc-nums CHAR 8 + C!
1 abc-nums CHAR 1 + C!  9 abc-nums CHAR 9 + C!
2 abc-nums CHAR 2 + C!  A abc-nums CHAR A + C!
3 abc-nums CHAR 3 + C!  B abc-nums CHAR B + C!
4 abc-nums CHAR 4 + C!  C abc-nums CHAR C + C!
5 abc-nums CHAR 5 + C!  D abc-nums CHAR D + C!
6 abc-nums CHAR 6 + C!  E abc-nums CHAR E + C!
7 abc-nums CHAR 7 + C!  F abc-nums CHAR F + C!
DECIMAL

: gethex   \ ( addr -- addr1 num )
  0
  BEGIN  OVER C@ abc-nums + C@ DUP 0xFF = NOT WHILE
    SWAP 4 LSHIFT +
    SWAP 1+ SWAP
  REPEAT
  DROP
;

StrFormat: \  \ ( addr -- addr1 ) \ Экранирование символов (всех)
  1+ DUP C@ EMIT
;StrFormat

StrFormat: #  \ ( addr -- addr1 )
  DUP 1+ C@ [CHAR] / =
    IF
      1+ SWAP SETCOLOR
    ELSE
      DUP C@ EMIT
    THEN
;StrFormat

StrFormat: $  \ ( addr -- addr1 )
  DUP 1+ C@ [CHAR] / =
    IF
      1+ SWAP SETBGCOLOR
    ELSE
      DUP C@ EMIT
    THEN
;StrFormat

StrFormat: /  \ ( addr -- addr1 )
  DUP 1+ C@
  [CHAR] # OVER =
    IF
      DROP 2 +
      GETCOLOR SWAP
      gethex SETCOLOR
      1-
    ELSE
      [CHAR] $ =
        IF
          2 +
          GETBGCOLOR SWAP
          gethex SETBGCOLOR
          1-
        ELSE
          DUP C@ EMIT
        THEN
    THEN
;StrFormat

0xA StrFormat
  WHEREXY 1+ GOTOXY
;StrFormat

0xD StrFormat
  str-posx @ WHEREY GOTOXY
;StrFormat


256 ALLOT HERE 4 - VALUE PAD   \ Растет вниз. \ «4 -» - строка оканчивается нулем
VARIABLE PAD#

" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" VALUE nums-abc


: HOLD   \ ( char -- ) \ Вставить символ с кодом char в буфер форматного преобразования чисел.
  PAD PAD# @ - C!
  1 PAD# +!
;

: #   \ ( base num -- base num ) \ Выделить одну цифру с конца и добавить ее в буфер форматного преобразования чисел, оставив частное на стеке.
  OVER /MOD
  nums-abc + C@
  HOLD
;

: HOLDS   \ ( str -- ) \ Вставить строку в буфер форматного преобразования чисел.
  DUP ZLEN DUP ROT    \ len len str
  OVER PAD SWAP PAD# @ + - 1+  \ len len str addr
  ROT CMOVE                \ len str addr len
  PAD# +!
;

: #S   \ ( base num -- base num ) \ Преобразовать оставшуюся часть числа.
  BEGIN  OVER /MOD 2DUP OR  WHILE
    nums-abc + C@ HOLD
  REPEAT
  DROP
;

: {#   \ ( num base -- ? base num ) \ Начать форматное преобразование числа в системе счисления base
  OVER 0 MIN -1 MAX
  ROT ABS ROT SWAP
;

: #}   \ ( ? base num -- ) \ Закончить форматное преобразование числа.
  3DROP
  PAD PAD# @ - 1+
  PAD# OFF
;

: <#   \ ( num -- ? base num ) \ Начать форматное преобразование числа в текущей системе счисления.
  DUP 0 MIN -1 MAX SWAP
  ABS
  BASE @ SWAP
;

: #>   \ ( ? base num -- ) \ Закончить форматное преобразование числа.
  3DROP
  PAD PAD# @ - 1+
  PAD# OFF
;

: SIGN   \ ( ? base num -- ? base num ) \ Если число отрицательное, то вставить знак минуса в буфер форматного преобразования чисел.
  2 PICK IF [CHAR] - HOLD THEN
;

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Ну, в ядре нет. Понятно, что сделать можно без проблем.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Вс апр 15, 2012 12:45 
Не в сети

Зарегистрирован: Вс апр 17, 2011 12:28
Сообщения: 34
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Возникли проблемы

Код:
0 ?.SPACE !

VARIABLE STEP
VARIABLE SYM-COUNTER
CREATE FILENAME[] 256 ALLOT

: EMIT-TO-NAME 
  FILENAME[] SYM-COUNTER @ + C!
  1 SYM-COUNTER +!
;

: File
FROM EMIT
' EMIT-TO-NAME TO EMIT
" File-" PRINT STEP @ . " .txt" PRINT
TO EMIT
0 FILENAME[] SYM-COUNTER @ + C!
FILENAME[] NEWFILE CLOSE
FILENAME[] OPENRW TO HF-OUT ;

File


Слово file не выполняется в режиме компиляции

Если его тело выполнить в обычном режиме

Код:
FROM EMIT
' EMIT-TO-NAME TO EMIT
" File-" PRINT STEP @ . " .txt" PRINT
TO EMIT
0 FILENAME[] SYM-COUNTER @ + C!
FILENAME[] NEWFILE CLOSE
FILENAME[] OPENRW TO HF-OUT


работает без проблем. Почему?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Вс апр 15, 2012 13:17 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Проблема в слове '

При компиляции - компилируется его исполнение, в результате, оно ищет слово, которое будет после file в момент его исполнения.

Чтобы такого не было, надо делать примерно так:

Код:
: File
FROM EMIT
[ \ здесь вернулись в режим интерпретации
' EMIT-TO-NAME  LIT, \  'хитро' скомпилитровали адрес
\ исполнения слова EMIT-TO-NAME  как литерал
] \ вернулись к компиляции
\ скомпилированный литерал
TO EMIT \ и запишется здесь в EMIT как надо
" File-" PRINT STEP @ . " .txt" PRINT
TO EMIT
0 FILENAME[] SYM-COUNTER @ + C!
FILENAME[] NEWFILE CLOSE
FILENAME[] OPENRW TO HF-OUT ;


А дело в том, что ' получает адрес следующего слова не в момент компиляции, а в момент исполнения.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Вс апр 15, 2012 13:40 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Зачем же так все усложнять? Есть же ['] и USE:
Код:
: File
FROM EMIT
['] EMIT-TO-NAME TO EMIT
" File-" PRINT STEP @ . " .txt" PRINT
TO EMIT
0 FILENAME[] SYM-COUNTER @ + C!
FILENAME[] NEWFILE CLOSE
FILENAME[] OPENRW TO HF-OUT ;


Код:
: File
FROM EMIT
USE EMIT-TO-NAME TO EMIT
" File-" PRINT STEP @ . " .txt" PRINT
TO EMIT
0 FILENAME[] SYM-COUNTER @ + C!
FILENAME[] NEWFILE CLOSE
FILENAME[] OPENRW TO HF-OUT ;

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Вс апр 15, 2012 13:51 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
VoidVolker писал(а):
Зачем же так все усложнять? Есть же ['] и USE:



Описание Кварка писал(а):
['] -- Выбрать имя слова из входного потока. Положить
на стек адрес начала кода этого слова. Слово
немедленного исполнения.


немедленное исполнение, значит, адрес на стек попал в момент компиляции... А кто его оттуда в код скомпилировал, да еще и литералом? значит, надо LIT, и его надо исполнить, а не компилировать, а значит, [ LIT, ]

И тогда запись
[ ' EMIT-TO-NAME LIT, ]

оказывается короче, чем

['] EMIT-TO-NAME [ LIT, ]

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Вс апр 15, 2012 13:58 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Омг. У слова ['] стандартное поведение: оно компилирует исполнимый токен слова из входного потока.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Вс апр 15, 2012 14:03 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
['] EMIT-TO-NAME TO EMIT внутри определения действительно решает проблему. USE - полная копия ['] (приятнее выглядит, проще читать).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Вс апр 15, 2012 14:04 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
VoidVolker писал(а):
Омг. У слова ['] стандартное поведение: оно компилирует исполнимый токен слова из входного потока.


Я знал! Я знал! (c)...

Стандартное поведение, но не стандартное описание...

Или это "КлюГ" в описании!

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


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

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


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

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


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

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