Skip to content

Latest commit

 

History

History
115 lines (91 loc) · 8.84 KB

features.md

File metadata and controls

115 lines (91 loc) · 8.84 KB

Реализованные фичи

См также фичи в develop.

F-FEAT-ROOT-NAME

Возможность задавать идентификатор корневому объекту фичи:

register_feature name="alfa" {
roota: column {
  row {
    text text="333";
    button text=@roota->text;
  }
}

F-FEAT-PARAMS

Необходимо уметь иметь параметры у фич, то есть такая ситуация что фичам нужны собственные параметры, адресуемые не как константы, а по ссылкам. То есть что-то в духе circle background(color=@red).

Это приводит нас к необходимости создавать под-окружения. Но наверное возможны и другие варианты.

Из под-окружения необходимо делать доступ к родительскому окружению, куда мы прицепили фичу. Для этого мы делаем:

F-HOST

поле env.host -- указывает на саму env или на ту env, к которой текущая прицеплена в качестве фичи. Допом делаем поле env.hosted которое = true если мы в режиме с host-фичей.

F-SUBFEAT-PATH

Реализация F-FEAT-PARAMS как под-окружения приводит нас к: Необходимо доступ по путям-ссылкам к под-окружениям. (потому что тот же pipe создает link-и между компонентами по путям-именам). Например: circle backround(color=(compute1 | compute2))

Решение - даем имена objname:subenv-name через :. Возможная проблема - разные фичи натащут в под-окружение разных суб-фич с одинаковыми именами. Надо что-то с этим придумать, как вариант - строго следить за именами и в случае не-уникальности что-то делать (задавать новое имя + контекст новый для использования и по старому имени внутри вложенного дерева)

F-PARAMS-GET-OUTPUT

Очень частый наблюдаю на практике шаблон что надо что-то вычислить и присвоить как результат в параметр окружения. fpath: get_query_param name="file_path"; load_file path=@fpath->output; Сообразно идея оптимизации такая: load_file path=( get_query_param name="file_path" ); Это можно реализовать если обрабатывать в языке шаблон paramname=(exprenv) и например договориться что у exprenv берется поле output. Ну а саму эту exprenv можно сдаить в суб-фичи по аналогии с F-FEAT-PARAMS или еще как (можно и отдельно болтать, лишь бы lexicalParent был)

F-ENVS-TO-PARAMS

Хочется уметь передавать наборы окружений как параметры. Например для реализации идеи jetpack compose modifiers

  • декораторы как цепочки в памяти. Решение - идея решения - это поддержать синтаксис something arg={ env; env; env } НО при этом не кидаться создавать эти env а запомнить их как дамп и передать его в arg. Это важно сделать именно потому что при вызове функций фич им уже надо знать, эта фича есть корневое окружение или эта фича есть прицепленное окружение.

F-SUBENVS-RENAME-DUP

Выснилась засада. если у нас 2 разные фичи.. в одном env.. порождают expr_env-ы... то получается что они их именуют одинаково [почему-то..]

вероятно самое правильное это - создавать subenv-пространство для каждого головного применения фичи (на головном окружении)..

но тогда неясно как адресовать эти субфичи извне...

ну пока применим что переименовывать субфичи.. но это тоже плохой вариант - на имя могут ссылаться вполне.. @design и @todo лучше решить. пока переименуем.

F-OBJ-ACCESS-FROM-DECLARATIVE

Необходим доступ к спец-полям объектов, таким как obj.host, из компаланга. Варианты решения: 1 - дублировать их в параметры. Минус - засоряем параметры. 2 - сделать if в links-are-objects. Минус - производительность, плюс только через ссылки доступ будет работать. 3 - сделать специальные аксессоры уже в ссылках аля Денис Перевалов, например: item=@obj.host и запись .host активирует вычисление по доступу к полю. Пока выбран вариант 1. update вариант 1 плохой т.к. некоторые опираются на getParamNames а там левое вот это все. Идем пока на вариант 2. и 2 идеи: сделать там таблицу, т.е. без иф. и вторая - ввести аксессор вида item=@obj->.host и это значит доступ к полю. Можно даже с несколькими точками. Но это получается без уведомлений.. и кстати так мы могли бы ссылаться на функции зато. и может это как-то соединить с параметрами которые через геттеры вычисляются (проект).

update - так-то надо все-таки в параметры, это гораздо удобнее. те че чилдрен реагировать и т.п. надо восстановить getParamNames чем мне не понравилось.

F-NEW-MODIFIERS

новые модификаторы - стабильные окружения, к которым присоединяются модифицируемые объекты (эти окружения уведомляются о присоединении)

F-NEW-MODIFIERS-FTREE

при вставке нового модификатора в {{}}-дерево посылать ему уведомление о присоединении.

F-PARAM-EXPRESSION-COMPUTE

// update 2023-01 оказалось чухней и редким случаем; всегда только с1

Вычислять выражения вида alfa=(a;b;c;) здесь alfa=@c->output должно стать автоматом. При этом если в выражении есть if (который у нас порождает новые окружения) то результат его порождения тоже должен подхватиться. Из этого вытекает решение - создавать для () окружения типа computer которое подхватывает output своего последнего чилда.

update 2022-09. признано что ; это зло, но вместе с тем пока мы их не можем убрать не нарушив пайп. поэтому пока идет отказ от сложных выражений в (). это сделано на warning-aх. кроме того мысль на todo это убрать computer т.к. он становится не нужен, а добавляет лишние прослойки и задержки. если он нужен только для if, то и оставить его только для if.. либо пусть if выдает output - значение output порожденной ветки..

F-ENV-ARGS

выяснилось что нам надо таки уметь задавать списку окружений параметры, и через это превращать их в функции. такие варианты: 1 some { |alfa| rect color=@alfa; } 2 feature "teta" { |sigma| .... } 3 some func={ |a b c| ... }

F-EVAL-SHORTCUT

операция евал с записью вида @{: xxx :} вместо m-eval {: xxx :}