Forth
http://fforum.winglion.ru/

Полёт мысли или встроим форт в JSON
http://fforum.winglion.ru/viewtopic.php?f=33&t=3256
Страница 1 из 1

Автор:  Victor__v [ Пт дек 20, 2019 21:10 ]
Заголовок сообщения:  Полёт мысли или встроим форт в JSON

Поиграл я, значит, в RimWorld и решил понять как это работает хотя бы концептуально.
Чтобы обмозговать эту задачу, я составил JSON-структуру описывающую человека.
Органы, части тела, кровообращение, иммунная система и пр.
И тут я задумался. А как, собственно, менять параметры в этой структуре?
Это ж замаешься их выискивать!
А ведь ещё из-за их изменения человек может скопытиться.
В сухом остатке получится, что надо за 1 условный ход перебрать всё дерево для поиска и изменения параметров.
А после ещё проверить "нормальность параметров".
К примеру, у человека закончилась кровь и он умер.

И тут я подумал, а пусть параметры сами себя меняют!
Как? А расширим JSON функциями-выражениями, которые до боли будут напоминать форт!

Вопрос: Почему именно форт?
Ответ: Простейший парсер
Вопрос: И всё?!
Ответ: Да, если найдёте ещё неочевидные преимущества, буду только рад.

Вот например набросал примерный код для выработки иммунитета от болезни.
Код:
( 60 0 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete  bye )


Смысл выражения:
60 - кол-во ходов, за которые выработается иммунитет
0 - счётчик выработанности иммунитета
'speed hour' - строка-ключ на параметр отражающий скорость выработки иммунитета за 1 ход.
this - взять строку как ключ и вернуть ссылку на этот объект в JSON, берётся начиная от первого объемлющего объекта
+ - увеличить значение объекта-счётчика на значение от объекта на вершине стека
=< - внезапно, сравнить два значения объектов. Если они не равны или счёткик больше покинуть выражение
add - добавить объект в объект, если он это позволяет
delete - удалить объект с ключом "грипп" в объекте.
bye - удалить выражение

Соот-но, каждых ход выражение будет меняться
Код:
( 60 1 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete  bye )
...
( 60 2 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete  bye )
...
и т. д.


А теперь всё это вместе с кусочком данных в формате JSON

Код:
'immune system':
{

'speed hour':1 // скорость выработки иммунитета за ход
'defend':['tetanus',] // к чему выработан иммунитет. Для примера тут написан столбняк
'disease':{
// болезни, с которыми сейчас борется иммунитет
'грипп: [
( 60 0 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete  bye ),
( 240 0 1 + =< 'dead' signal )
]
}

}



Соот-но, у нас тут явно какой-то слабый грипп. :shuffle;

Короче,
задача перебрать за ход все параметры и после перепроверить их на корректность.
превращается в простой перебор, ибо выражения на этом диалекте форта тоже объекты.
И если произойдёт неординарное событие (смерть, обморок и пр.), то об этом станет известно сразу же.
В штатном же режиме параметры будут изменяться сами собой.

А теперь скажите мне, какой велосипед я изобрёл :))

Автор:  f02732 [ Чт дек 26, 2019 20:58 ]
Заголовок сообщения:  Re: Полёт мысли или встроим форт в JSON

Если честно, не совсем уловил мысль :)

Напоминает сорта лиспа, или что-то типа Red/REBOL.

Автор:  dmitri [ Пт дек 27, 2019 01:54 ]
Заголовок сообщения:  Re: Полёт мысли или встроим форт в JSON

Не вижу ничего общего с фортом. Ни одного слова из обычного форта. + и bye здесь имеют совершенно другой смысл.
Получился обычный DSL, понятный только автору.

Автор:  Victor__v [ Пт дек 27, 2019 02:23 ]
Заголовок сообщения:  Re: Полёт мысли или встроим форт в JSON

dmitri писал(а):
Не вижу ничего общего с фортом. Ни одного слова из обычного форта. + и bye здесь имеют совершенно другой смысл.
Получился обычный DSL, понятный только автору.

Ну и какие тогда обычные форт-слова должны быть пригодны для операций с объектами, списками, массивами и прочим зоопарком?

То что DSL это конечно, как бы, самоочевидно)

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