Forth
http://fforum.winglion.ru/

Еще один способ работы с параметрами на стеке
http://fforum.winglion.ru/viewtopic.php?f=2&t=3141
Страница 2 из 2

Автор:  mOleg [ Ср янв 31, 2018 14:00 ]
Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке

_KROL писал(а):
Хм, но это же область пользователя, да и слова пользовательские, или я что-то недопонимаю?

похоже на то.
У тебя есть главный процесс, внутри него можно запустить еще несколько потоков, у которых будет общая память, за исключением как раз пользовательской области. Т.е. если у тебя крутится два потока, то изменение одной глобальной переменной будет влиять на другой.

Чем тебя пользовательская область памяти смущает мне не ясно, тем более, что стек каждого потока тоже в ней находится.

Автор:  Victor__v [ Ср янв 31, 2018 14:02 ]
Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке

mOleg писал(а):
Victor__v писал(а):
А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение)

А обосновать можете?
Обычно, как раз наоборот считается.


юзверь должен использоваться для конечной задачи, которую решает форт.
А, к примеру, механизм лок. переменных, явно вспомогателен.
Если же новый стек активно используется в многопоточном приложении, то пусть будет.
Но ежели это что-то вспомогательное, стреляющее отсюда и до обеда, (лок. переменные) то смысл это в пользовательскую память засовывать?

Автор:  chess [ Чт апр 12, 2018 23:00 ]
Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке

Вспомнил еще одну свою-же старую идею варианта работы с параметрами на стеке - вариант, похоже наиболее для меня подходящий.
Код:
\ два стека параметров с одним указателем - "качалка"
             |<--60 байтов -->|
\ ------|----|---------|------|
\       sp1  s1beg     sp0    s0beg

S0 @      CONSTANT s0beg
S0 @ 60 - CONSTANT s1beg
USER AddrSt  s0beg AddrSt !
: ~  \ переключатель стеков
  S0 @ s0beg =
  IF   s1beg DUP s0beg
  ELSE s0beg DUP s1beg THEN
  AddrSt ! S0 ! SP!
;
: ~0 \ исходное сосстояние качалки
  s0beg DUP S0 ! SP! ;

: [1 AddrSt @  4 - @ ;
: [2 AddrSt @  8 - @ ;
: [3 AddrSt @ 12 - @ ;
: [4 AddrSt @ 16 - @ ;
: [5 AddrSt @ 20 - @ ;
: [6 AddrSt @ 24 - @ ;
: [7 AddrSt @ 28 - @ ;
: [8 AddrSt @ 32 - @ ;
: [9 AddrSt @ 36 - @ ;

: SumSq \ 1 2 -- 11* 22* +
~ [1 [1 * [2 [2 * + ;
\ тоже в стенографической форме
: SumSq \ 1 2 -- 11* 22* +
/[11*22*+ ; \ здесь символ '['  это переключатель стеков - слово ~

1 2 SumSq .

Пс. В принципе вариант безопасный - не надо помнить какой из 2-х стеков текущий(выходной), а какой входной.
По сравнению с предыдущим вариантом нет пересылки параметров единым массивом.

Автор:  Victor__v [ Пт апр 13, 2018 20:10 ]
Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке

Код:
S0 @      CONSTANT s0beg
S0 @ 60 - CONSTANT s1beg

А ничего так, что S0 это USER-переменная?

А при вложенности качалка будет переключаться. Правильно понял?

Автор:  chess [ Пт апр 13, 2018 20:44 ]
Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке

Victor__v писал(а):
А ничего так, что S0 это USER-переменная?

Ну так и задумано в SPF для поддержки многозадачности, а я не выключаю эту поддержку, закидывая значения адресов
оснований стеков 1 и 2 также в USER-переменную ( AddrSt ).
Victor__v писал(а):
А при вложенности качалка будет переключаться. Правильно понял?

Смысл качалки в чем? В том, что на исходном стеке лежат параметры, например так 1 2 3, где 1 - самый нижний параметр,
а 3 - самый верхний. Теперь мы начинаем выкладывать параметры с 1-го стека на второй в нужном нам порядке для обработки
этих выложенных на 2-ой стек параметров соответствующими процедурами-словами( второй стек перед этим очищается).
После обработки на 2-м стеке могут остаться новые параметры, которые в свою очередь могут быть выложены на 1-й стек,
также предварительно очищенный и т.д. Как такового вложения здесь не наблюдается.
В этом варианте нет нужды в словах типа SWAP OVER ROT >R R> и им подобным. Стеки рассматриваются как пары массив1-стек2,
а затем как стек1-массив2. На каком стеке мы остановимся не имеет значения, поэтому тут не вводится новый инструментальный контекст.

Автор:  diver [ Пт апр 13, 2018 22:03 ]
Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке

Блин...вся тема - из серии - "а месье знает толк в извращениях" :D

Автор:  chess [ Сб апр 14, 2018 18:23 ]
Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке

diver писал(а):
Блин...вся тема - из серии - "а месье знает толк в извращениях"

Ну вот и нашелся ценитель мастерства :))

Автор:  chess [ Ср апр 25, 2018 16:55 ]
Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке

Небольшое усовершенствование механизма качалки.
Иногда нужно дополнить набор параметров на исходном стеке небольшим количеством дополнительных параметров,
получаемых из исходных параметров на этом стеке.
Код:
: ~s   s1beg DUP S0 @ <> 60 AND + AddrSt ! ; \ после ~s параметры добавляются на тот же стек откуда они берутся
И тогда, например:
Код:
\ конкатенация строк в хипе
\        1  2  3  4    5 2+4
: s+ \ a1 u1 a2 u2 -- a u
  ~s 2> 4> + ALLOCATE THROW \ к существующим параметрам a1 u1 a2 u2 на исходном стеке добавляется
                                                \  адрес результирующей строки в хипе
  ~  1> 5> 2>      MOVE
     3> 5> 2> + 4> MOVE
     5> 2> 4> +
;
\ или стенографическая форма
\         1  2  3  4    5 2+4
: s+ \ a1 u1 a2 u2 -- a u
  /]24+h[152V352+4V524+ ; \ символ ']' это слово ~s
: tst
  S" 12 " S" AB " s+ S" cdef" s+   ;
tst TYPE

ПС. Интересный момент - полностью отсутствуют присвоения, все становится похожим на функциональный язык.
Не привожу примеры где параметры именуются произвольно - там все по-старому.

Автор:  _KROL [ Ср апр 25, 2018 21:29 ]
Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке

diver писал(а):
Блин...вся тема - из серии - "а месье знает толк в извращениях" :D

Это скорее не совсем извращения, а неординарный подход к проблеме.
Мне вот вспомнился процессор Z80 с двумя регистровыми парами, где нельзя сразу знать, какая именно активна...

Страница 2 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/