Регистрация | Войти
Lisp — программируемый язык программирования
RSS
Пользовательские параметры
amartynov - 07.06.2016 07:48, Сообщений - 7
На текущий момент дополнительные декларации в маршрутах дают возможность добавления метаинформации к маршрутам. Но при раскручивании чего-нибудь посложнее хотелось бы иметь возможность добавлять свои параметры. Например, при реализации REST API удобно ассоциировать информацию о том, какие объекты обрабатывает маршрут для автоматической генерации ссылок в HATEOAS.

В каком-нибудь замшелом C++ можно было бы регистрировать интерфейс или функцию, связав ее с именем  параметра. Но как-то в CL это выглядит бредово. Логично опубликовать 

(defgeneric parse-declarations (type declarations traits))

Но она не принимает символа маршрута или монтируемого модуля, где также используется. Поэтому ее параметры можно расширить:

(defgeneric parse-declarations (type declarations target traits))

Второй вариант: не публиковать измененный интерфейс, а написать макрос вида:

(defmacro define-declaration (declaration scope (declarations target traits) &body body)

)


где scope задает тип параметра :route или :module.

Если варианты выглядят разумно, могу прислать Pull Request на любой. Второй мне как-то больше нравится. 
[#]
А можешь привести пример, как бы это выглядело в пользовательском коде?
archimag - 09.06.2016 11:06
[#] Ответ на комментарий от archimag 09.06.2016 11:06
Регистрируется как-то так:

(restas:define-declaration :model-object :route (declarations target traits)
  (declare (ignore traits))
  (when (cdr declarations)
    (error "Multiple instances of ~A declaration" type)
  ...
  
)


А используется (из расчета, что где-то определен класс object):

(restas:define-route get-object ("/api/object/:id" :method :GET)
  (:model-object object)
  ...
  
)
amartynov - 09.06.2016 13:59
[#] Ответ на комментарий от amartynov 09.06.2016 13:59
Так, видимо мозг перегружен. А к каким последствиям это ведёт? Что в итоге делает (:model-object object) в маршруте?
archimag - 09.06.2016 14:13
[#] Ответ на комментарий от archimag 09.06.2016 14:13
Складывает в hash map с ключом object функцию, которая по экземпляру object  вызовет genurl*

Основная идея в том, чтобы дать клиентскому коду возможность ассоциировать дополнительную информацию с маршрутами. А для этого надо дать возможность создавать свои параметры. Все другое выглядит недекларативно: можно написать обертку над define-route. Но мне это не очень нравится.
amartynov - 09.06.2016 14:58
[#] Ответ на комментарий от amartynov 09.06.2016 14:58
Хм, а декоратор для этих целей не подойдёт?
archimag - 09.06.2016 15:15
[#] Ответ на комментарий от archimag 09.06.2016 15:15
В принципе, можно и через декоратор. Но тут более важный момент в том, что смысл декоратора в модификации поведения маршрута. А мне нужно расширить процесс создания маршрута, само поведение не меняется. Поэтому, хотя декораторы, видимо,  и могут это сделать, это не свойственная им задача.
amartynov - 09.06.2016 15:41
[#] Ответ на комментарий от amartynov 09.06.2016 15:41
Ну ок, я всегда считал, что следует доверять мнению того, кому это действительно надо :) Делай.
archimag - 09.06.2016 15:58
@2009-2013 lisper.ru