«Естественный» язык описания интерфейсов
Всё что изложено пока является только идеей на далёкое будущее ... но кто знает когда оно наступит ;)
Стандартные описания
Любой конфигурационный файл есть ни что иное как текст на некотором формальном языке. Одни языки,например серии «параметр – значение», очень простые. Другие – достаточно сложные. Однако практически никто из этих языков даже близко не обладает некоторыми полезными свойствами языков естественных – а зря!
Возьмём традиционное описание интерфейса
alterator.
Имеем схему следующего вида
(объект атрибут атрибут ... ). Где атрибутом может выступать:
- примитивный тип данных (строка “aaa”, булево значение #f)
- объект типа атрибут (например text,pixmap)
- другой объект со своими атрибутами ( button внутри hbox)
Всё конечно хорошо, достаточно примитивно и дубово. Но уже первые естестенные упрощения являются невозможными. Например я захотел изменить текст кнопки, естественно это сделать как
(button text “new-text”). Но наш язык этой возможности не поддерживает.
Аналогично. Мы можем написать
(button active). Но не можем –
(active button). Попытаемся преодолеть эти странные ограничения. А именно, добавим категории хорошо знакомые нам по естественным языкам:
- существительное
- прилагательное
- числительное
- единственное и множественное число
Сразу отметим, что хотим получить язык полностью совместимый с существующим, дабы пользователи не жедающие этих «улучшений» могли продолжать работать по стандартной схеме.
Правила нового языка
Просто не будет. За удовольствие надо платить ;)
- Разбор предложения идёт с лева на права. Конструкция “a b” ниже будет описываться как a применяемый к b.
- Предложение ограничивается круглыми скобками. Возможно вкладывать одно предложение в другое. Например (a b (c d)). То есть скобки – это своеобразные знаки препинания.
- Все базовые объекты – есть существительные. Например существительными являются все примитивные типы данных, а также производные объекты типа button,label,text и т. д.
- Существительные могут быть едиственного и множественного числа. В случае множественного числа количество объектов может быть как определено так и не определено.
- Существительные единственного числа могут быть сочетаемые с другими существительными, а могут быть не сочетаемые. В случае сочетаемости существительное + существительное даёт прилагательное. В противном случае – список из существительных. Например, text сочетаем с любой строкой, поэтому text “aaa” – есть прилагательное (или по старинке аттрибут с заданным значением). А вот label и button не сочетаемы друг с другом, а поэтому их соединение даёт просто два существительных, собственно label и button.
- Прилагательное при присоединении к нему прилагательного даёт составное прилагательное (ни или по старинке список аттрибутов с заданными значениями). Например layout-policy сочетаемо с цифрами. А получившееся прилагательное сочетаемо тоже с цифрами, а получившееся прилагательное сочетаемо с символами. А получившееся прилагательное уже ни с кем не сочетаемо. Получаем возможные аттрибуты (layout-policy 10), (layout-policy 10 20) и (layout-policy 10 20 center).
- Прилагательное + сочетаемое с ним существительное, даёт расширенное прилагательное ( это позволит нам сделать аттрибуты со списками значений, например, text “aaa” activity #t ).
- Прилагательное + не сочетаемое с ним существительное, равносильно «существительное + прилагательное». То есть они просто меняются местами. Например active button превращается в button active, active invisible button равносильно button active invisible
- По-умолчанию, у существительного множественного числа реальное количество объектов не определено. buttons – это просто несколько кнопок. А сколько их? Неизвестно.
- Числительное применямое к прилагательному или существительному, превращает его в соотв. объект множественного числа с заданным числом экземпляров.
- Числительное применяемое к числительному, есть числительное отвечающее их сумме .twenty two – это двадцать два.
- Количество объектов так и не определено для существительного, то производится автоматическое его определение, а именно оно равно в точности следуемым за ним существительным. Прилагательные следующие за таким объектом применяется к каждому полученному экземляру. Например texts “aaa” “bbb” bold – это в точности равосильно списку из text “aaa” bold и text “bbb” bold. Здесь bold – прилагательное.
- Вообще когда к существительному множественного числа применяются прилагательные, последние применяются к каждому экземпляру.
Ну вот кажется и всё. Благодаря последним правилам можно даже задать такие конструкции как «две активные кпопки» –
(two active buttons) ну или «активные кнопки с текстами aa и bb» – //(active buttons texts “aa” “bb”).
Вот мы и получили язык, в котором помимо стандартных конструкций допустимы ещё несколько «естественно» звучащих с точки зрения человеческих языков. Более того получают смысл конструкции (button text) – это прилагательное и (button text “aaa”) – это существительное с прилагательным. Кроме того мы получили возможность сразу проверять применимость тех или иных атрибутов к виджетам. Имеющиеся синтаксические правила позволяют
автоматически создать документацию по языку описания интерфейса.
От описания к виджетам
То что язык есть – это хорошо. Осталось превратить описание в реальный виджет. Для этого мы немного усложним базовое понятие нашего языка – существительное.
Прилагательное есть не что иное как существительное с заданными свойствами. Завершённое предложение описывающее виджет есть не что иное как прилагательное. Если это не так – значит предложение составлено не верно.
Существительное может быть как не раелизованное так и реализованное (уже есть соотв. ему кнопка). Когда идёт предварительный разбор предложения ещё ничего не существует и все прилагательные добавляемые к существительному – тщательно откладываются на будущее.
Как только следует команда на реализацию. Начинают последовательно возникать виджеты, им передаются их прилагательные в качестве аргументов и далее обрабатываются согласно правилам того или иного рода. Например при получении текста – задаётся соотв. аттрибут. А при получении виджета – последний становится дочерним вижетом к данному.
Если существительное уже реализовано, то его поведение уже несколько иное. При действиии на реализованное существительное сочетаемым с ним существительным получается не прилагательное, а возникает требование к реализации отдать свойство заданное соответствующим именем. (button text) – вернёт текст кнопки. При действии на реализованное существительное прилагательным, реализации поступает команда на изменнение свойстве (button text “aaa”) – изменит текст кнопки.
Реализация
Этот раздел всё ещё в стадии написания
Для реализации этой затей потребуются следующие структуры:
- задание имеющихся существительных (все базовые типы Scheme по-умолчанию считаются существительными)
- задание групп существительных – для упрощения дальнейших конструкций
- древообразное задание совместимости существительных и производных от них прилагательных.
- задание существительных множественного числа (кто какому единственному числу соответствует)
- задание прилагательных (удобно иметь некоторые предопределённые прилагательных)
- задание числительных
.....