Clojure 序列?测试不能与 if 一起工作

Clojure seq? test not working in function with if

我创建了这个函数make-seq。如果传递了一个像 '(true false) 这样的 seq 列表,它 returns 它是原样的,但是如果传递一个单一的 false 它 returns (false)。

(defn make-seq [data] (if seq? data) data (list data))

出于某种原因,它总是将 if 检查评估为 false。

(make-seq '(true false))

 => ((true false))

(make-seq true)
 => (true)

不确定为什么要这样做,因为 运行 在 repl 上它可以通过测试。

 (seq? '(true false))

  => true

为什么 defn make-seq 逻辑在 if 中不起作用?

谢谢

现在,您的 make-seq 函数基本上丢弃了 (if seq? data)data 表达式,只返回最后的 (list data).

您缺少一个开括号和一个闭括号以保持平衡。

;                         ⌄                            ⌄
(defn make-seq [data] (if (seq? data) data (list data)))

Clojure linting 工具,如 eastwoodkibit 可以帮助您检测误用,例如您丢弃表达式的 make-seq 的原始版本,如果这些表达式有副作用,这可能是有意义的-效果,但你的没有。

if 语句语法需要更正:

(defn make-seq [data] (if (seq? data) data (list data)))

(make-seq '(true false))
=> (true false) 

(make-seq true)
=> (true)

除了其他答案,我还建议使用缩进。即使是像这样的简单表达,它也有助于眼睛更快更可靠地识别事物:

(defn make-seq
  [data]
  (if (seq? data)
    data
    (list data)))

(make-seq '(true false))     => (true false)
(make-seq   true)            => (true)