closures - 根据另一个闭包定义一个闭包

标签 closures common-lisp

我有两个相互补充的闭包。我想根据另一个来定义一个。例如,假设我们有函数 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/

相关文章:

common-lisp - 为什么 SET 被弃用?

Javascript 闭包 : How to add dynamic baselayers to Cesium map

swift - 错误 : Bool is not Convertible to Void:

javascript - JS 关闭的问题

swift - 如何从快照闭包返回数组的值并使用它来准备segue?

post - Hunchentoot 处理复选框发布请求

common-lisp - Common Lisp 哈希表

LISP 使用负数作为指数

swift - 快速捕获功能列表

common-lisp - 在 Common Lisp 中传递函数