我想知道如何在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
语法,但不知道如何实现它,也不记得它被调用再次查找它。
答案 0 :(得分:2)
我们在Caveman或Lucerne网络框架中遇到此装饰器语法(或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页面)。我比上面提到的更喜欢它。没有任何经验。