Информация об изменениях

Сообщение Re: Когда императивность переходит в декларативность... от 16.10.2023 21:12

Изменено 16.10.2023 21:38 Sm0ke

Re: Когда императивность переходит в декларативность...
Здравствуйте, Shmj, Вы писали:

S>А если всего чуток изменить, то можно без особой переделки сделать чтобы все было декларативно. А именно:


S>
S>Form(
S>   Children: [
S>      Button(
S>         Color: Colors.Blue
S>      )
S>   ]
S>)
S>


S>Т.е. делаем new не обязательным, создание объекта без него. И даем возможность задать в конструкторе свойства. И все! Теперь без переделки ядра и без создания нового языка — мы можем писать все декларативно. Не нужен XAML или еще что. Получается что все выглядит как JSON или подобие его — все просто и ясно, даже парсить можно парсером в 10 срок кода.


По поводу new
И в squirrel и в ksi не надо писать new
Там просто тип и сразу круглые скобки для параметров, как у функции

В squirrel правда придётся писать конструктор.
В ksi просто обычные структуры с набором свойств, и для любого типа можно задать атрибут initial для значений по умолчанию.

S>Все гениальное — просто.


У вас в примере получается, что Children хранит массив.
Но удобнее же иметь доступ к дочерним элементам управления не по индексу, а по идентификатору, так?
Тогда нужен map, а не array

-- ui

main_form = Form(
  children: {
    "button1" : Button(
      color: Colors.Blue
      caption: "ok"
    )
    "input1" : Text_area(
      scroll: Scroll.both
    )
  }
)

-- main events

main_form.events.on_resize = #fn (from) {
  form.children.input1.size.width = form.size.width
}

main_form.events.on_close = #fn (from) {
  (form.data.is_saved == $bool.false) #then { /* prompt */ }
}

Либа с тем-же синтаксисом:
-- определения для ui

Form = #struct (
  children
  size
  font
  events
)

Form->initial.font = Fonts.system_default

Events = #struct (
  on_resize
  on_close
)

-- controls

Button = #struct (
  caption
  color
  border_size
)

Button->initial(color: Colors.system_button_text, border_size: 1)

Text_area = #struct (
  scroll
  value
)

Text_area->initial(scroll: Scroll.none, value: "")

-- inner types

Scroll = #enum ( none vertical horizontal both )
Size = #struct ( width height )
Re: Когда императивность переходит в декларативность...
Здравствуйте, Shmj, Вы писали:

S>А если всего чуток изменить, то можно без особой переделки сделать чтобы все было декларативно. А именно:


S>
S>Form(
S>   Children: [
S>      Button(
S>         Color: Colors.Blue
S>      )
S>   ]
S>)
S>


S>Т.е. делаем new не обязательным, создание объекта без него. И даем возможность задать в конструкторе свойства. И все! Теперь без переделки ядра и без создания нового языка — мы можем писать все декларативно. Не нужен XAML или еще что. Получается что все выглядит как JSON или подобие его — все просто и ясно, даже парсить можно парсером в 10 срок кода.


По поводу new
И в squirrel и в ksi не надо писать new
Там просто тип и сразу круглые скобки для параметров, как у функции

S>Все гениальное — просто.


В squirrel правда придётся писать конструктор.

В ksi просто обычные структуры с набором свойств, и для любого типа можно задать атрибут initial для значений по умолчанию.
Конструкторов нет, когда оно нужно — делается функция формирования, выдающая инстанс структуры, заполненный как надо
Или можно метод доп-инициализации забабахать отдельно.
instance = ( My_struct(prop1: 1, prop2: "2") !init(param1 param2) )


Кстати в вашем примере
Children хранит массив.

Но удобнее же иметь доступ к дочерним элементам управления не по индексу, а по идентификатору, так?
Тогда нужен map, а не array

-- ui

main_form = Form(
  children: {
    "button1" : Button(
      color: Colors.Blue
      caption: "ok"
    )
    "input1" : Text_area(
      scroll: Scroll.both
    )
  }
)

-- main events

main_form.events.on_resize = #fn (from) {
  form.children.input1.size.width = form.size.width
}

main_form.events.on_close = #fn (from) {
  (form.data.is_saved == $bool.false) #then { /* prompt */ }
}

Либа с тем-же синтаксисом:
-- определения для ui

Form = #struct (
  children
  size
  font
  events
)

Form->initial.font = Fonts.system_default

Events = #struct (
  on_resize
  on_close
)

-- controls

Button = #struct (
  caption
  color
  border_size
)

Button->initial(color: Colors.system_button_text, border_size: 1)

Text_area = #struct (
  scroll
  value
)

Text_area->initial(scroll: Scroll.none, value: "")

-- inner types

Scroll = #enum ( none vertical horizontal both )
Size = #struct ( width height )