You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure中isClose函数调用返回true的原因是什么?

问题分析:为什么Clojure函数调用结果为true?

你写的isClose函数存在括号使用错误,导致匿名函数的逻辑和你预期的完全不一样。

先看你的代码:

user=> (defn isClose [t1] (fn [t2] (and (<= (- t1 t2) 20)) (<= (- t2 t1) 20)))
#'user/isClose
user=> ((isClose 50) 10)
true

这里的核心问题是匿名函数的函数体包含两个独立表达式:

  1. 第一个表达式:(and (<= (- t1 t2) 20)) —— 这个and只包裹了一个条件,计算结果是false,但这个结果会被直接丢弃
  2. 第二个表达式:(<= (- t2 t1) 20) —— 这是匿名函数实际返回的结果,计算时(- 10 50)得到-40,(<= -40 20)的结果是true

所以最终调用返回的是第二个表达式的结果,也就是true。

而你预期的逻辑是两个条件通过and同时判断,正确的写法应该把两个条件都放在and的括号内:

(defn isClose [t1] (fn [t2] (and (<= (- t1 t2) 20) (<= (- t2 t1) 20))))

此时调用((isClose 50) 10)就会计算:

(and (<= 40 20) (<= -40 20))

结果为false,和你预期一致。

内容的提问来源于stack exchange,提问作者mmachenry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:52:39