ensure

Das Macro ensure erwartet zwei Argumente. Der Wert des gesamten Ausdrucks ist der des ersten Arguments. Unabhängig davon, ob bei der Auswertung des ersten Arguments eine Ausnahme auftritt oder nicht, wird auch das zweite Argument um seiner Seiteneffekte willen ausgewertet.

Das Macro basiert auf catch-and-apply, catch, throw, lambda und prog1:

(setq ensure
  (mlambda args
    (quasi-quote
      (catch-and-apply
        nil
        (lambda (name value)
          (prog1
            (catch nil (unquote (second args)))
            (throw name value)))
        (prog1
          (unquote (first args))
          (catch nil (unquote (second args))))))))