if-let when-let foo-let 宏

这些宏合并控制流和绑定。它们是对照应回指宏的改进,因为它们让开发人员通过命名来传达意义。因此,建议他们使用他们的照应对手。

(if-let (user (get-user user-id))
  (show-dashboard user)
  (redirect 'login-page))

FOO-LET 宏绑定一个或多个变量,然后使用这些变量作为相应条件的测试形式(IFWHEN)。多个变量与 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 库中提供了支持多个变量的版本。