SPF5 strings

4 messages Options
Embed this post
Permalink
Ruvim Pinka

SPF5 strings

Reply Threaded More More options
Print post
Permalink
Привет всем!

В ANS есть слишком сильная увязка строк с файловыми функциями -- они
оперируют длиной  в символах. А это значит, что при двухбайтных
символах нельзя прочитать/записать нечетное число байт. Второе, —
число базовых символов несет мало пользы в случае многобайтных
символов (кодировки, подобной UTF). Поэтому, я бы согласился с
предложением из работы [1] считать длину строк в единицах адреса. Так
же, по теме есть работа [2] (не вникнул в них еще, нашел постфактум).

Таким образом, предожение такое:

1) Длины строк исчисляется в единицах адреса. Слова C@ и С! оперируют
символом базового размера  и могут дать лишь часть от полного символа
(актуально в случае UTF).

2)  CHAR+ и CHAR- дают смещение на размер базового символа.
Соответственно, слова CHARS и >CHARS также подразумевают лишь базовый
символ.

3)  Слова поиска подстроки учитывают базовый размер символа (чтобы
подстрока не могла попасть в середину двухбайтного символа, например).

4) В зависимости от реализации, допустимо требование выравнивать
строки  на базовый размер символа, или на размер ячейки.

5)  Файловые функции оперируют длиной в единицах адреса, и могут
оперировать   блоками менее одного символа, если размер символа более
1 и это позволяет хост-система.



[1] http://dec.bournemouth.ac.uk/forth/euro/ef98/pelcetal98.pdf
  Internationalisation - the user perspective
[2] http://dec.bournemouth.ac.uk/forth/euro/ef99/pelcetal99b.pdf
  ANS Forth and large characters

--
Ruvim
Ruvim Pinka

Re: SPF5 strings

Reply Threaded More More options
Print post
Permalink
On 5/6/07, Ruvim Pinka <[hidden email]> wrote:
> Таким образом, предожение такое:
> 1) Длины строк исчисляется в единицах адреса.

Аргумент в пользу: на google/codesearch фраза "COUNT + C!" встречается
в 10 раз чаще, чем "COUNT CHARS + C!".

Правда, получается, при таком переходе 8 -> 16, этот "нестандартный
код" будет работать, а "стандартный" — перестанет ;)


А кому как удобней работать со строками?

--
Ruvim
Andrey Cherezov

Re: SPF5 strings

Reply Threaded More More options
Print post
Permalink
Some javascript/style in this post has been disabled (why?)
Добрый день, Ruvim Pinka!

Ваше сообщение от 07.05.2007 21:16:
On 5/6/07, Ruvim Pinka [hidden email] wrote:
  
Таким образом, предожение такое:
1) Длины строк исчисляется в единицах адреса.
    

Аргумент в пользу: на google/codesearch фраза "COUNT + C!" встречается
в 10 раз чаще, чем "COUNT CHARS + C!".

Правда, получается, при таком переходе 8 -> 16, этот "нестандартный
код" будет работать, а "стандартный" — перестанет ;)

А кому как удобней работать со строками?
  
Большой опыт работы со строками с разноразмерными символами
на разных платформах у Кости Тарасова. Может он отзовется на вопрос :)

1001

Re: SPF5 strings

Reply Threaded More More options
Print post
Permalink
Andrey Cherezov пишет:

> Добрый день, Ruvim Pinka!
>
> Ваше сообщение от 07.05.2007 21:16:
>> On 5/6/07, Ruvim Pinka <[hidden email]> wrote:
>>  
>>> Таким образом, предожение такое:
>>> 1) Длины строк исчисляется в единицах адреса.
>>>    
>>
>> Аргумент в пользу: на google/codesearch фраза "COUNT + C!" встречается
>> в 10 раз чаще, чем "COUNT CHARS + C!".
>>
>> Правда, получается, при таком переходе 8 -> 16, этот "нестандартный
>> код" будет работать, а "стандартный" — перестанет ;)
>>
>> А кому как удобней работать со строками?
>>  
> Большой опыт работы со строками с разноразмерными символами
> на разных платформах у Кости Тарасова. Может он отзовется на вопрос :)
>
>  

\ chars | replaces with CR
\
: SLITERAL  \ 94 STRING
  STATE @ IF
             ['] (S") COMPILE,
             DUP ,
             BEGIN
              DUP WHILE
              OVER C@
              DUP  0x7C ( "|") = IF DROP 0xA THEN
              C,
              SWAP 1+ SWAP 1-
             REPEAT
             2DROP
             0 C,  ALIGN
          ELSE
             2DUP + 0 SWAP C!
          THEN
; IMMEDIATE

\
\ as SLITERAL for UNICODE
\ !!! returns len in bytes
\ !!! not in chars
\
: WLITERAL
  ?COMP
  STATE @ IF
             ['] (S") COMPILE,
             DUP 2*   ,
             BEGIN
              DUP WHILE
              OVER C@
              DUP  0x7C ( "|") = IF DROP 0xA THEN
              W,
              SWAP 1+ SWAP 1-
             REPEAT
             2DROP
             0 W,  ALIGN
          ELSE
            2DUP + 0 SWAP C!
          THEN
; IMMEDIATE

: CLITERAL ( addr -- )
  STATE @ IF
            ['] (C") COMPILE,
            COUNT DUP C,
            HERE SWAP DUP ALLOT MOVE 0 C, ALIGN
          THEN
; IMMEDIATE

\ create string for ANS text
\
: S"   \ 94+FILE
  [CHAR] " PARSE [COMPILE] SLITERAL
; IMMEDIATE

\ create string for UNICODE text
\
: W"   \ UNICODE
  [CHAR] " PARSE [COMPILE] WLITERAL
; IMMEDIATE

\ create string ANS/UNICODE
\ according to __UC
: OS"  \ MULTIPLATFORM
  [CHAR] " PARSE
  __UC
  IF    [COMPILE] WLITERAL
  ELSE  [COMPILE] SLITERAL
  THEN
; IMMEDIATE

wbr,
~1001



> ------------------------------------------------------------------------
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by DB2 Express
> Download DB2 Express C - the FREE version of DB2 express and take
> control of your XML. No limits. Just data. Click to get it now.
> http://sourceforge.net/powerbar/db2/
> ------------------------------------------------------------------------
>
> _______________________________________________
> Spf-dev mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/spf-dev
>