Common Lisp中宏实现的Router为何与手写代码行为不一致?
问题分析与解决
你的代码宏展开后看起来和手写版本一致,但行为异常,最可能的原因是你修改宏定义后没有重新编译router函数。Common Lisp中,函数编译时会展开其中的宏,后续修改宏不会自动更新已编译的函数,导致router仍使用旧的宏展开结果。
解决步骤
重新编译
router函数:(compile 'router)或者直接重新加载包含
router定义的文件。(可选)优化宏的写法
你可以改用Trivia支持的:guard修饰符,让宏更简洁直观,效果和原写法一致:(defmacro route (valid-path &body body) (let ((path (gensym))) `((property :path-info ,path :guard (equalp ,valid-path ,path)) ,@body)))
验证方法
修改宏后,先重新编译宏,再重新编译router函数,然后测试:
;; 重新编译宏 (compile 'route) ;; 重新编译router函数 (compile 'router) ;; 测试不同路径 (router '(:path-info "/")) ; 应调用home (router '(:path-info "/live/clicked")) ; 应调用live-clicked (router '(:path-info "/other")) ; 应返回404
如果重新编译后问题仍存在,检查home和live-clicked函数是否有逻辑错误,或确认env确实是符合预期的plist结构。
内容的提问来源于stack exchange,提问作者michaeldelago
相关产品推荐
相关产品推荐

