我有一个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)
由此我有条件地选择发送参数的函数.这有意义吗?
(defun treemax (bilist &optional ismin)
(funcall (if ismin #'min #'max)
(COMPLEX_EXPRESSION_1)
(COMPLEX_EXPRESSION_2)))
Run Code Online (Sandbox Code Playgroud)
当然,这更好:
(defun treemax (bilist &optional (op #'max))
(funcall op (COMPLEX_EXPRESSION_1) (COMPLEX_EXPRESSION_2)))
Run Code Online (Sandbox Code Playgroud)
然后,#'min如果你想使用它,只需作为参数2 传入min.
(当然,zakovyrya的答案也有效.)