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