(define-modify-macro orf (&rest args) or)
Another possibility is to modify the place only if it's null. This definition is more involved:
(defmacro orf (place &rest forms &environment environment)
(multiple-value-bind (temps vals news writer reader)
(get-setf-expansion place environment)
`(let* (,.(mapcar #'list temps vals))
,(if (rest news)
(flet ((mvs (form)
`(multiple-value-setq
,news ,form)))
`(multiple-value-bind ,news ,reader
(cond (,(first news) (values ,@news))
(t (or ,.(mapcar #'mvs forms))
,writer))))
;; There is only one store variable.
`(or ,reader (let ((,(first news)
(or ,@forms)))
,writer))))))
There's also an atomic version of orf, using SBCL's get-cas-expansion.
macro example