[Devel-conf] Metalterator: pattern syntax

Pavel Wolneykien manowar на altlinux.org
Вт Апр 14 13:03:59 MSD 2009


Stanislav Ievlev <stanislav.ievlev на gmail.com> wrote:

> 
> 
> После прочитывания показалось, что 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
> 
> 
> 
> _______________________________________________
> devel-conf mailing list
> devel-conf на lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/devel-conf


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