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库中提供了支持多个变量的版本。