这些宏合并控制流和绑定。它们是对照应性照应宏的改进,因为它们使开发人员可以通过命名来传达含义。因此,建议将它们的使用推荐给比照应的对应对象。
(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库中提供了支持多个变量的版本。