换句话说,就是把外层的 form 作为可选项,同时避免在 if-else 分支里各写一遍 body。
除了把 body 抽象到另一个函数(还是要写两遍)之外,有没有更简便的写法?
dash 有没有现成的函数,例如可以写成如下形式:
(-yyy (cond with-xxx) body)
-->
倒是可以勉强为之,但写起来也没比 let
更简洁:
(--> (if t 'prog1 'progn) ;; => (let ((it (if t 'prog1 'progn)))
(eval `(,it 1 2 3))) ;; (eval (cons it '(1 2 3))))
(--> '(1 2 3) ;; => (let ((it '(1 2 3)))
(eval `(,(if t 'prog1 'progn) ,@it))) ;; (eval (cons (if t 'prog1 'progn) it)))
如果封装一个 with-xxx-if
:
#+BEGIN_SRC emacs-lisp :results value pp :with-emacs
(defmacro with-xxx (&rest body)
`(let ((xxx 1))
,@body))
(defmacro with-xxx-if (cond &rest body)
`(,(if cond 'with-xxx 'progn)
,@body))
(list (with-xxx-if t (or (bound-and-true-p xxx) 2))
(with-xxx-if nil (or (bound-and-true-p xxx) 2)))
#+END_SRC
#+RESULTS:
: (1 2)
但这样的命名有误导之嫌,看起来更像是:(if cond (with-xxx body))
,应该起个什么样的名字才好?