帮助减少Lisp函数

Ada*_*m S 3 lisp common-lisp

我有一个Lisp函数,它返回两个值的MAX,或两个值的MIN.现在我的代码有一些相对复杂的表达式来评估VALUE1和VALUE2.

(defun treemax (bilist &optional ismin)
  (cond
    ;; Compute minimum
    (ismin (min (COMPLEX_EXPRESSION_1) (COMPLEX_EXPRESSION_2)))
    ;; Compute maximum
    (t (max (COMPLEX_EXPRESSION_1) (COMPLEX_EXPRESSION_2)))))
Run Code Online (Sandbox Code Playgroud)

这里的问题是COMPLEX_EXPRESSION_1和COMPLEX_EXPRESSION_2实际上占用了很多行代码.我真的不想重复它们.有没有更有效的方式来调用它?

基本上我要做的是一元 - 如果在函数而不是值.如果您熟悉C或其变体,基本上我正在寻找的概念是:

((ismin ? min : max) COMPLEX_EXPRESSION_1 COMPLEX_EXPRESSION_2)
Run Code Online (Sandbox Code Playgroud)

由此我有条件地选择发送参数的函数.这有意义吗?

zak*_*rya 9

(defun treemax (bilist &optional ismin)
    (funcall (if ismin #'min #'max) 
             (COMPLEX_EXPRESSION_1) 
             (COMPLEX_EXPRESSION_2)))
Run Code Online (Sandbox Code Playgroud)


Chr*_*ung 9

当然,这更好:

(defun treemax (bilist &optional (op #'max))
  (funcall op (COMPLEX_EXPRESSION_1) (COMPLEX_EXPRESSION_2)))
Run Code Online (Sandbox Code Playgroud)

然后,#'min如果你想使用它,只需作为参数2 传入min.

(当然,zakovyrya的答案也有效.)