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 庫中提供了支援多個變數的版本。