没有Parantheses和异常调用语法的Common Lisp宏

时间:2018-04-05 02:02:20

标签: macros common-lisp

我想知道如何在Common Lisp中编写宏,允许他在调用前者时使用Lisp表单。

例如,假设我有以下宏:

(defmacro define-route ((app uri method) &body body)
  `(setf (ningle:route ,app ,uri :method ,method)
     ,@body))

对它的调用看起来像这样:

(define-route (*app* "/" :GET)
       (print "Welcome to ningle using GET!"))

如果想要编写一个可以这样调用的宏,那该怎么办:

@route(*app*, "/", :GET)

或者像这样:

route: *app*, "/", :GET

这可能吗?我以前在某处看过@route语法,但不知道如何实现它,也不记得它被调用再次查找它。

1 个答案:

答案 0 :(得分:2)

我们在CavemanLucerne网络框架中遇到此装饰器语法(或CL中的注释):

@route GET "/"
(defun index ()
  (render #P"index.tmpl"))

我怀疑你能做route: *app*, "/", :GET

cl-annot是CL的通用注释库。

这是一个读者宏,这里有更多示例:http://lisp-lang.org/wiki/article/reader-macros

ps:Snooze,由Sly(和yasnippet)的作者,是一个Web框架,它将路由视为常用函数,因此将参数作为通常的函数参数进行路由。它还具有内置的错误报告(在浏览器中,在调试器中,具有自定义404页面)。我比上面提到的更喜欢它。没有任何经验。