[Devel-conf] Metalterator: pattern syntax

Stanislav Ievlev stanislav.ievlev на gmail.com
Вт Апр 14 12:45:41 MSD 2009


После прочитывания показалось, что metaalterator не должен быть бакендом,
собственно это и не бакенд - это моделирование данных. Есть определённый
смысл оформить его как библиотеку guile.

Вообще задача моделирования очень сложная - мы кажется уже делали два или
три захода - ничего путного не получилось. Очень хочется чтобы metaalterator
стал-таки средством моделирования в alterator ;)


13 апреля 2009 г. 19:06 пользователь Pavel Wolneykien
<manowar на altlinux.org>написал:

>
>  Всем привет, :)
>
>  При использовании (alterator metalterator) и ajax.scm возникает (по
> крайней мере у меня возник) соблазн вовсе не использовать промежуточный
> бакенд. Это, наверное, нормальная реакция человеческого организма на
> многозвенную архитектуру. Но я не стал этого делать. А вместо этого
> постарался отвести бакенду достойную роль.
>
>  Получилось у меня следующее.
>
>  1. Бакенд закрывает метабакенд от произвольного к нему доступа.
>
>  Ведь через метабакенд можно читать и писать произвольные объекты, в
> том числе, и не предусмотренные конкретным модулем Альтератора.
>
>  Кроме лишних объектов метабакенду можно отправить и просто
> некорректные (с точки зрения работы конкретного модуля) данные. А
> проверкой данных на корректность у нас тоже традиционно
> занимается бакенд.
>
>  2. Бакенд отвечает на запросы "type" и производит другого рода
> проверку корректности данных.
>
>  А ещё в интерфейс часто нужно выводить какой-либо набор констант,
> причём с комментариями на местном языке. Для этой цели тоже можно
> использовать бакенд.
>
>  3. Бакенд отвечает на запросы о константах.
>
>
>  Вторая и третья задача решаются традиционными способами, а первая
> требует непропорционально увесистого куска кода: использовать большой
> набор условных операторов перед проксированием операции чтения/записи в
> метабакенд (где она, фактически, и будет выполнена) показалось мне
> скучным. Поскольку речь идёт об определении некоторого шаблона, через
> который определённые вызовы проходили бы, а определённые -- нет
> (выдавалось бы сообщение об ошибке), то я придумал набор макросов,
> позволяющий описать такой шаблон в более компактном виде.
> Называется он woo-case.
>
>  Формат его вызова такой:
>
>  (woo-case (список_объектов список_параметров)
>    ((имя_операции_1 (шаблон_объектов_1) [(шаблон_параметров_1)])
>     вычисление_1 ...)
>     ((имя_операции_2 (шаблон_объектов_2) [(шаблон_параметров_2)])
>     вычисление_2 ...)
>    ...
>    else вычисление_по_умолчанию)
>
>  Шаблон объектов используется при выполнении двух действий:
> сличения списка объектов и захвата параметров.
>
>  Вместо того, чтобы просто обозначить в шаблоне место, где могут
> находится одно
>
>  ('squid 'groups ? 'domains ?)
>
> или более имён
>
>  ('squid 'groups *)
>
> можно обозначить эти пропуски символами, а затем использовать эти
> символы в программе:
>
>  ('squid 'groups @g 'domains @d)
>
> после сличения, например, с таким списком: ('squid 'groups "wheel"
> 'domains "altlinux"), переменные @g и @d примут значения "wheel" и
> "altlinux" соответственно. Шаблонный параметр вида @имя захватывает 1
> значение, а вида @@имя одно и более значений.
>
>  Шаблон параметров, в отличие от шаблона объектов, может быть опущен, а
> при его наличии он используется только для захвата параметров, но не для
> сличения. Поэтому порядок перечисления параметров в шаблоне параметров
> произвольный. Поскольку каждый параметр в списке параметров однозначно
> связан с впередистоящим именем, то параметр вида @@имя используется для
> захвата всех значений одного параметра, а вида @имя -- для захвата
> только 1, первого значения. Например, шаблон
>
>  ('http_port @p 'auth-mode @a 'internal-ifaces @@e 'mode @m)
>
> сохранит под именем @@e все значения параметра 'internal-ifaces, а
> значение параметра 'mode он не "съест".
>
>  В том случае, если какой либо из обозначенных параметров не был
> указан, то значение соответствующей переменной будет равно #f.
>
>
>  И последнее, но немаловажное: если какая-либо переменная вида @имя
> (или @@имя) уже была определена в результате предыдущей операции
> сличения/захвата, то в следующем шаблоне будет использовано _её
> значение_. Таким образом, во вложенных конструкциях woo-case можно
> использовать значения, определённые внешними шаблонами -- получатся
> контекстно-зависимые шаблоны.
>
>  Павел.
> _______________________________________________
> devel-conf mailing list
> devel-conf на lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/devel-conf
----------- следующая часть -----------
Вложение в формате HTML было удалено...
URL: <http://lists.altlinux.org/pipermail/devel-conf/attachments/20090414/a215bc2c/attachment-0001.html>


Подробная информация о списке рассылки devel-conf