Надеюсь все знакомы с тем,
как в СПФ хранятся строки и каких типов они бывают...
А так же знакомы с проблемами, которые возникают при попытке сохранить в памяти
строку со счетчиком, длиной более 255 байт.
Конечно, видится несколько выходов из сложившейся ситуации, с одной стороны
можно достаточно легко расширить длину счетчика символов строки до двух байт,
или даже до четырех. Но при этом никуда не денется большое количество коротких
строк, длиной от одного символа(например, список имен в словаре), и тратить
на счетчик длины строки аж 4 байта немного жалко.
Выходов видится из этой проблемы несколько, например, можно поступить со счетчиком
длины строки так, как поступают с кодированием utf8 символов, которые могут
кодироваться последовательностью от 1 до 6 байт. Как простейший вариант, можно
старший бит в байте отвести под префикс расширения, таким образом, строки длиной
менее 128 символов будут иметь счетчик длиной в один байт, более длинные строки
буду иметь два байта, еще более длинные 3 и так далее:
<pre>
127: 01111111
150: 10000000 00010111
561744: 10100010 10100100 01010000
</pre>
Необходимо найти быстрое и простое решение, позволяющее кодировать длину счетчика
строки наиболее оригиальным и практичным образом в памяти.
Как всегда задаются имена и стековые диаграммы необходимых слов, но в данном задании
стековые диаграммы могут быть изменены наиболее практичным на ваш взгляд образом.
Код:
\ сохранить счетчик длины строки u в памяти по адресу addr
\ вернуть длину # байт, занятых под счетчик строки
: SCNT! ( u addr --> # )
;
\ прочесть счетчик длины строки u из памяти по адресу addr,
\ длину счетчика строки в байтах.
: SCNT@ ( addr --> u # )
;
\ вернуть адрес начала строки addr и ее длину в байтах
: SCOUNT ( '#str --> addr u )
;
\ компилировать строку со счетчиком на вершину кодофайла
: s", ( asc u --> )
;