通过字符串输入时 Clojure 布尔值混淆

Hug*_*ier 2 boolean prompt vector clojure sequence

我在这里缺少什么?...

虽然这工作得很好:

(def env [true true true false])
=> #'clojquery.core/env
(boolean (first (drop 3 env)))
=> false
Run Code Online (Sandbox Code Playgroud)

如果我将读取行中的字符串转换为第四个值,我将无法获得相同的行为:

(def env (do
           (println "Enter boolean: ")
           (let [in (read-line)]
             (concat [true true true] (map symbol (re-seq #"\w+" in))))))

Enter boolean: 
false
=> #'clojquery.core/env
(vec env)
=> [true true true false]
(first (drop 3 (vec env)))
=> false
(boolean (first (drop 3 env)))
=> true
(if (first (drop 3 (vec env))) "TRUE" "FALSE")
=> "TRUE"
Run Code Online (Sandbox Code Playgroud)

这不是很奇怪吗?感谢您的帮助!

Sea*_*eld 9

在 Clojure 中,falsenil都是假的,而其他一切都是真的。

您正在根据输入字符串创建一个符号。您可以从任何字符串创建符号。符号不是false真实的,nil所以所有符号都是真实的。

(boolean? (symbol "false")) ;;=> false -- it isn't a Boolean
(symbol? (symbol "false")) ;;=> true -- it's a Symbol
(boolean? false) ;;=> true -- false is a Boolean
(symbol? false) ;;=> false -- false isn't a Symbol
Run Code Online (Sandbox Code Playgroud)

因此truefalse不是 Clojure 中的符号——它们是值。

如果您使用的是 Clojure 1.11,则可以调用parse-boolean输入字符串来生成truefalse 。但是,如果您输入无法解析为布尔值的内容,则会引发异常,因此这取决于您要执行的操作。