Сообщение Re: Когда императивность переходит в декларативность... от 16.10.2023 21:12
Изменено 16.10.2023 21:38 Sm0ke
Re: Когда императивность переходит в декларативность...
Здравствуйте, Shmj, Вы писали:
S>А если всего чуток изменить, то можно без особой переделки сделать чтобы все было декларативно. А именно:
S>
S>Т.е. делаем new не обязательным, создание объекта без него. И даем возможность задать в конструкторе свойства. И все! Теперь без переделки ядра и без создания нового языка — мы можем писать все декларативно. Не нужен XAML или еще что. Получается что все выглядит как JSON или подобие его — все просто и ясно, даже парсить можно парсером в 10 срок кода.
По поводу new
И в squirrel и в ksi не надо писать new
Там просто тип и сразу круглые скобки для параметров, как у функции
В squirrel правда придётся писать конструктор.
В ksi просто обычные структуры с набором свойств, и для любого типа можно задать атрибут initial для значений по умолчанию.
S>Все гениальное — просто.
У вас в примере получается, что Children хранит массив.
Но удобнее же иметь доступ к дочерним элементам управления не по индексу, а по идентификатору, так?
Тогда нужен map, а не array
Либа с тем-же синтаксисом:
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>Т.е. делаем new не обязательным, создание объекта без него. И даем возможность задать в конструкторе свойства. И все! Теперь без переделки ядра и без создания нового языка — мы можем писать все декларативно. Не нужен XAML или еще что. Получается что все выглядит как JSON или подобие его — все просто и ясно, даже парсить можно парсером в 10 срок кода.
По поводу new
И в squirrel и в ksi не надо писать new
Там просто тип и сразу круглые скобки для параметров, как у функции
S>Все гениальное — просто.
В squirrel правда придётся писать конструктор.
В ksi просто обычные структуры с набором свойств, и для любого типа можно задать атрибут initial для значений по умолчанию.
Конструкторов нет, когда оно нужно — делается функция формирования, выдающая инстанс структуры, заполненный как надо
Или можно метод доп-инициализации забабахать отдельно.
Кстати в вашем примере
Children хранит массив.
Но удобнее же иметь доступ к дочерним элементам управления не по индексу, а по идентификатору, так?
Тогда нужен map, а не array
Либа с тем-же синтаксисом:
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 )