我有两个相互补充的闭包。我想根据另一个来定义一个。例如,假设我们有函数 more-than
定义如下
(defun more-than (v) #'(lambda (x) (> x v)))
CL-USER> (funcall (more-than 5) 7)
T
CL-USER> (funcall (more-than 5) 3)
NIL
我们想使用上述闭包定义它的补码,less-than-or-equal
。这似乎不像上面的闭包那么容易,因为我的尝试到目前为止还没有奏效。有人可以指出一个可能的解决方案或告诉我这是否是常见模式(即,而不是独立于第一个闭包定义第二个闭包)。
这是我的两个尝试,但没有成功
;; compile time error
(defun less-than-or-equal (v)
#'(lambda (x) #'(not (more-than v))))
;; returns nil for every comparison
(defun less-than-or-equal (v)
#'(lambda (x) (not (more-than v))))
最佳答案
正如我在评论中提到的,您可以使用 COMPLEMENT
补一个函数:
(defun less-than-or-equal (v)
(complement (more-than v)))
在您尝试使用 NOT
来否定 MORE-THAN
返回的函数时,而不是调用该函数并否定结果。 X
根本没有使用。要修复它,您需要做
(defun less-than-or-equal (v)
;; The #' is not necessary here
(lambda (x) (not (funcall (more-than v) x))))
但是使用 COMPLEMENT
更好。
关于closures - 根据另一个闭包定义一个闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38962833/