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