common-lisp if-let,when-let,-let宏
示例
这些宏合并控制流和绑定。它们是对照应性照应宏的改进,因为它们使开发人员可以通过命名来传达含义。因此,建议将它们的使用推荐给比照应的对应对象。
(if-let (user (get-user user-id)) (show-dashboard user) (redirect 'login-page))
FOO-LET宏结合一个或多个变量,然后使用这些变量作为测试形式为相应的条件(IF,WHEN)。多个变量与组合AND。所选分支在绑定生效的情况下执行。一个简单的变量实现IF-LET可能类似于:
(defmacro if-let ((var test-form) then-form &optional else-form)
`(let ((,var ,test-form))
(if ,var ,then-form ,else-form)))
(macroexpand '(if-let (a (getf '(:a 10 :b 20 :c 30) :a))
(format t "A: ~a~%" a)
(format t "Not found.~%")))
; (LET ((A (GETF '(:A 10 :B 20 :C 30) :A)))
; (IF A
; (FORMAT T "A: ~a~%" A)
; (FORMAT T "Not found.~%")))Alexandria库中提供了支持多个变量的版本。