Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 19:12

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: стек строк
СообщениеДобавлено: Ср фев 18, 2009 21:54 
Не в сети
Moderator
Moderator
Аватара пользователя

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

<pre>
\ 13.02.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ стек для строк

util/ fld.fts
string/ add.fts

0 struct sstack
addr[] off_ssBottom \ дно стека строк
addr[] off_ssTop \ вершина стека строк
cell[] off_ssCount \ количество строк в стеке
/struct

\ очистить стек строк
: ClrStrStack ( ss --> )
DUP off_ssCount OFF
DUP off_ssBottom A@
SWAP off_ssTop A! ;

\ создать неименованный стек строк размером в # байт в хипе
: StrStack ( # --> addr )
/sstack + DUP ALLOCATE THROW
TUCK + OVER off_ssBottom A!
DUP ClrStrStack ;

\ затолкнуть строку в стек
\ для строк длиной не более 255 байт (вне зависимости от кодировки)
: PushStr ( asc # ss --> )
DUP >L off_ssTop A@ OVER - OVER s## - \ asc # addr
L@ /sstack + OVER >
ABORT" В стеке строк нет места для указанной строки!"
DUP L@ off_ssTop A!
SCOPY
1 L> off_ssCount +! ;

\ вернуть количество строковых элементов с стеке
: SStrings ( ss --> # ) off_ssCount @ ;

\ вернуть адрес последней строки в стеке
: LastStr ( ss --> asc # )
DUP SStrings 0 = ABORT" Стек строк пуст!"
off_ssTop A@ COUNT ;

\ удалить строку с вершины стека строк
: DropStr ( ss --> )
DUP LastStr + OVER off_ssTop A!
-1 SWAP off_ssCount +! ;

\ вытолкнуть строку с вершины стека строк
\ возвращенная строка не защищена,
\ заталкивание в стек новой строки ее затрет!
: PopStr ( ss --> asc # )
DUP LastStr
ROT DropStr ;

\EOF пример использования:

20 StrStack VALUE ss

s" first" ss PushStr
s" second" ss PushStr
s" thrid" ss PushStr
s" fourth" ss ' PushStr ECATCH IFNOT ERROR" Не поймалось переполнение стека строк!" THEN
ss PopStr s" thrid" COMPARE IF ERROR" не найдена последняя строка" THEN
ss PopStr s" second" COMPARE IF ERROR" не найдена предпоследняя строка" THEN
ss PopStr s" first" COMPARE IF ERROR" не найдена первая строка" THEN
ss ' PopStr ECATCH IFNOT ERROR" Не поймалось переопустошение стека строк!" THEN

s" Проверка стека строк завершена успешно!" TYPE CR
</pre>

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


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

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Я планировал хранить в стеке указатели на строки ,
думаю в скором времени смогу испытать предложенный
вариант.

_________________
Линукс решает, винда глотает.


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

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
лучше проще - храните лучше указатели строк, а строки либо в словаре, либо динамически

Код:
: get_addr_str ( baseaddr index -->  addr )  cells + @ ;


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
vikt писал(а):
Я планировал хранить в стеке указатели на строки ,
думаю в скором времени смогу испытать предложенный
вариант.

такая библиотека уже есть в СПФе, если не ошибаюсь, называется str5.f

Alexander писал(а):
лучше проще - храните лучше указатели строк, а строки либо в словаре, либо динамически

от задачи зависит. В данном случае удобнее не с указателями работать.

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


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

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
mOleg писал(а):
Alexander писал(а):
лучше проще - храните лучше указатели строк, а строки либо в словаре, либо динамически

от задачи зависит. В данном случае удобнее не с указателями работать.

хорошо, я понял...
Код:
: push_str ( addr -- )
  dup len str_stack swap move ;


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вот, продолжаем размышлять по поводу стека строк:
1) на стеке хранятся указатели на строки
2) строки располагаются в динамическом пространстве
3) работа над строками ведется на вершине стека (над верхними 2 элементами)
4) при удалении строки с вершины стека память освобождается
5) в качестве промежуточного буфера используется PAD

<pre>
\ 02.05.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ стек, работающий со строками

stack/ stack.fts

\ удалить элемент с вершины стека строк
: DropStr ( stack --> ) PopFrom FREE THROW ;

\ вернуть адрес и длину верхней строки в стеке строк.
\ строка не удаляется с вершины стека строк
: TopStr ( stack --> asc # ) ReadTop COUNT ;

\ получить адрес и длину строки, находящейся под вершниной стека строк
: SecStr ( stack --> asc # ) 1 SWAP PickFrom COUNT ;

\ перенести содержимое строки asc # в хип текущего потока
\ затолкнуть указатель на строку в стек строк
: PushStr ( asc # stack --> ) >L S>HEAP L> PushTo ;

\ перенести содержимое верхнего элемента стека строк в PAD
\ память, занимаемую под строку освободить
: PopStr ( stack --> asc # ) <| DUP TopStr KEEPS DropStr |> ;

\ поменять местами две верхних строки на вешине стека строк
ALIAS Swop SwapStr ( stack --> )

\ перенести содержимое второй от вершины стека строк строки в PAD
\ ссылку на строку из стека изъять, занимаемую память освободить
: NipStr ( stack --> asc # ) DUP >L PopFrom L@ PopStr ROT L> PushTo ;

\ сравнить две строки на равенство, вернуть флаг на стек данных,
\ со стека строк снять верхнюю строку и удалить
: CmpStr ( stack --> flag ) DUP PopStr ROT TopStr COMPARE ;

\ объединить строки двух верхних элементов в одну строку
\ то есть после объединения на стеке строк останется один элемент
: Merge ( stack --> )
DUP >L PopStr DDROP
0 HOLD
L@ TopStr KEEPS |>
L@ DropStr
L> PushStr ;

\ разделить строку на две по символу в позиции #
\ вернуть "хвост" на вершине стека данных в виде asc #
\ "голову" строки оставить на стеке строк
: Split ( # stack --> asc # )
>L >R L@ PopStr \ asc #
OVER R@ L@ PushStr \ asc #
R@ 0 R> - D+ ;

\ укоротить на символ с конца строки
: Crop ( stack --> ) ReadTop DUP COUNT 1 - ROT SCOPY ;

\ укоротить на символ с начала строки
: Shrink ( stack --> ) ReadTop DUP COUNT 1 -1 D+ ROT SCOPY ;

\ укоротить на указанное количество байт с начала строки
: CutDown ( # stack --> ) DUP >L Split L@ DropStr L> PushStr ;

\ укоротить на указанное количество байт с конца строки
: Curtail ( # stack --> ) Split DDROP ;

?DEFINED test{ \EOF -- тестовая секция ---------------------------------------
test{

USER-VALUE SS
10 NewStack TO SS

: sm1 s" sample string" ;
: sm2 s" second string" ;
: sm3 s" thrid string" ;

sm1 SS PushStr
sm2 SS PushStr
sm3 SS PushStr

SS PopStr sm3 COMPARE THROW
SS PopStr sm2 COMPARE THROW
SS PopStr sm1 COMPARE THROW

sm2 SS PushStr
SS TopStr sm2 COMPARE THROW
sm3 SS PushStr
SS TopStr sm3 COMPARE THROW

SS SwapStr
SS PopStr sm2 COMPARE THROW
SS PopStr sm3 COMPARE THROW

sm2 SS PushStr sm3 SS PushStr
SS SecStr sm2 COMPARE THROW
SS NipStr sm2 COMPARE THROW
SS PopStr sm3 COMPARE THROW

sm1 SS PushStr sm1 SS PushStr sm2 SS PushStr sm3 SS PushStr sm3 SS PushStr
SS CmpStr THROW
SS CmpStr 0 = THROW
SS CmpStr 0 = THROW
SS CmpStr THROW
SS PopStr sm1 COMPARE THROW

sm1 SS PushStr sm2 SS PushStr sm3 SS PushStr
SS Merge <| sm3 KEEPS sm2 KEEPS |> SS TopStr COMPARE THROW
sm3 NIP SS Split sm2 COMPARE THROW
sm3 SS TopStr COMPARE THROW
SS Crop SS TopStr sm3 1 - COMPARE THROW
SS DropStr
SS Shrink SS TopStr sm1 1 -1 D+ COMPARE THROW
6 SS CutDown SS TopStr sm1 7 -7 D+ COMPARE THROW
SS DropStr
sm1 SS PushStr
7 SS Curtail SS TopStr sm1 DROP 7 COMPARE THROW
}test
</pre>

Итак, каких операций не хватает?

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


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
ReadStrings ( прочитать из файла строки, разделенных символами 0D 0A (или что там еще у других осей) на стек данных вернуть количество считанных строк - N)
WriteStrings ( записать в файл N строк, разделяя их соответствующими символами)
PrintStrings
EditStrings
ConvertCode ( конвертор кодировок )
и т.д. и т.п.

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
WingLion писал(а):
ReadStrings ( прочитать из файла строки, разделенных символами 0D 0A (или что там еще у других осей) на стек данных вернуть количество считанных строк - N)

странно, а зачем? То есть какой смысл в стек пихать строки из файла-то? чтобы обрабатывать в обратном порядке?)

WingLion писал(а):
WriteStrings ( записать в файл N строк, разделяя их соответствующими символами)

то же самое

WingLion писал(а):
ConvertCode ( конвертор кодировок )

это тоже не совсем то.
к тому же оно делается запросто поверх предложенного кода.

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


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
mOleg писал(а):
странно, а зачем? То есть какой смысл в стек пихать строки из файла-то? чтобы обрабатывать в обратном порядке?)


При редактировании текстов, строки, все равно добавляются в конец, так что порядок считывания вполне подходящий. Как и порядок записи. (надо только не забыть, что и та и другая операция должны вести счет строк в одинаковую сторону - из глубины стека, а не в глубь...)

Впрочем, это все можно и не делать, если не интересно, так же, как и все остальное...
Я то эти функции вижу в применении к текстовому редактору, где стек строк вполне мог бы оказаться применим... Хотя, быть может, там более применим не просто стек, а двунаправленый список слов...

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн май 04, 2009 08:47 
Не в сети

Зарегистрирован: Пн окт 15, 2007 17:24
Сообщения: 164
Откуда: Бийск
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
WingLion писал(а):
Впрочем, это все можно и не делать, если не интересно, так же, как и все остальное...
Я то эти функции вижу в применении к текстовому редактору, где стек строк вполне мог бы оказаться применим... Хотя, быть может, там более применим не просто стек, а двунаправленый список слов...

Был такой редактор K52 (PDP-11, ОС - RT-11, RSX-11) - кстати, самый удобный из всех что мне встречались и его модификации ... в нем редактируемый файл логически представлялся как два стека: вершины их можно сказать совпадали в текущей точке редактирования, а донья находились всегда у одного в начале файла, у второго - в конце.
Перемещение по тексту соответствовало перекидыванию объекта из одного стека в другой, вставка/удаоление - соответсвенно. Логически там было даже много стеков: символов, слов, строк, абзацев и т.д.

_________________
And so forth ...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн май 04, 2009 18:00 
Не в сети
Аватара пользователя

Зарегистрирован: Чт апр 26, 2007 21:09
Сообщения: 303
Благодарил (а): 12 раз.
Поблагодарили: 10 раз.
А я тоже его помню. Практически всё, что в конце 80-х писал - на нём. :)
Но оценивать его не очень берусь - это был мой первый редактор (один из) - может быть, как и всякое "первое встречное", он просто показался самым лучшим...
А идеология, что Вы описали далее воплощена в редакторе среды BlackBox (www.oberon.ch). Кстати, проект открыт, язык прост и лёгок, разобраться будет довольно легко. Кто имеет желание, - можно портировать. Либо Форт в среду, либо взять редактор оттуда (получив при этом ещё некоторые бонусы, кроме ПРОСТО редактирования текста).


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

Зарегистрирован: Пн окт 15, 2007 17:24
Сообщения: 164
Откуда: Бийск
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Wlad писал(а):
А я тоже его помню. Практически всё, что в конце 80-х писал - на нём. :)
Но оценивать его не очень берусь - это был мой первый редактор (один из) - может быть, как и всякое "первое встречное", он просто показался самым лучшим...

Ну, у меня он тоже был один из первых, но тем, которыми приходилось пользоваться позже, ощутимо не хватало стройности и лаконичности K52 - ничего сравнимого я так и не нашел, хотя искал начиная с перехода на IBM PC compatible компьютеры и поставляемые с ними ОС.
В наших же stand-alone форт-системах тех лет было реализовано нечто похожее (с поправкой на их узкую специализацию).
Цитата:
А идеология, что Вы описали далее воплощена в редакторе среды BlackBox (www.oberon.ch).

Спасибо, посмотрю.


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

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

ну, это не совсем так. Я по крайней мере за собой такого не замечаю, потому что чаще всего текст пишется "в середине" файла.
для редактора двусвязного списка с головой хватать должно, по крайней мере там возможно делать insert внутрь списка без проблем.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 05, 2009 11:37 
Не в сети
Аватара пользователя

Зарегистрирован: Вт сен 11, 2007 11:07
Сообщения: 187
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
вообще-то "два стека строк" были и в МикроМир (для СР/М), но в то время памяти мало было у компьютеров, поэтому приходилось "извращаться". из современных редакторов мне известен только MultiEdit, который в состоянии переварить многогигабайтовый текст. все остальные - сдохнут, т.к. попытаются прочесть всё в ОЗУ. порочный подход (в данном случае). насчёт удобства и полезности (я видел К13 в бОльшей степени, чем К52)..... трудно сказать, мне МикроМир больше нравился.


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

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


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

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


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

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