ну в лексере ничего интересного нет, парсер пытается интерпретировать поток лексем в пропозиции. в это время подпрограмма парсера — дедуктор — попутно разгадывает пропозиции заменяя их типа ассемблерными транзакциями, которые как я вижу в будущем можно будет оптимизировать. (в кэше хранятся precomputed деревья для всех посчитанных диалектов)
в чем прикол почему логосу нужен свой ассемблер? (кстати: все угорают почему го нужен свой ассемблер, но на самом деле для их корутинной модели и растущие стэки у горутин это очень имеет смысл)
короче на уровне логос–ассемблера намного проще оперировать лоу–левел кухней того, как должны меняться данные. можно думать, что промежуточный ассемблер тут выступает роль типа ORM
пропозиция p реально может не меняться в графе. если между текущей транзакцией и последней транзакцией значение p не менялось, то нет нужды его пересчитывать
ну и опять–таки, какие пропозиции кэшить и как? где можно сэкономить, а где нет? вот для этого и есть ассемблер — это понятная промежуточная абстракция между стейтом и лексическими “предписаниями” что нужно с этим стейтом сделать
например, классическая тема если у тебя есть p and q и ты знаешь что q это ложь, то тебе не надо считать p and q, ты моментально знаешь что вся пропозиция ложь
и конечно каждая пропозиция имеет точный адрес в диалекте… эти адреса и выступают в роли ключей для кэша. вот так вот оно и работает (по крайней мере, пока.) блокчейн протокол, dgraph база, redis кэш
и есть графовая база, в которой можно хранить такие-то вещи. ты можешь добавлять ребра в граф, а можешь отнимать их. тебе реально это в конце–концов нужно будет делать только 1 раз в самом конце (текст = транзакция = два списка дельт)