gpt4 book ai didi

java - 在 Clojure 中使用 Java 的扫描器

转载 作者:行者123 更新时间:2023-12-01 13:18:00 26 4
gpt4 key购买 nike

我正在尝试使用 Java 扫描器从 clojure 的读取行中挑选输入。我认为这只是一个基本错误,对于 Clojure 来说,我找不到这个错误。代码如下:

(defn select-option
[]

(def option (read-line))
(println "test")
(def s (Scanner. option))
(println "test")
(def opt (.next s))
(println "test")

(case opt ("s" (println "case test")
(def lastn (.next s))
(def firstn (.next s))
(new-student lastn firstn))))

但是在输入“sfirstNamelastName”时我得到以下输出

test
test
test
ClassCastException java.lang.String cannot be cast to clojure.lang.IFn GradingSystem1.core/select-option (NO_SOURCE_FILE:12)

我认为这是我使用 java 代码时的错误,但非常感谢任何帮助,谢谢!

最佳答案

("s"..) 中有一组额外的括号,它被解释为对函数“s”的函数调用。这会崩溃,因为“s”不是一个函数。最好使用 let 在函数内定义名称,因为这里使用 def 对于并发操作来说是不安全的。

一个翻译可能如下所示:

(defn select-option []                       
(let [option (read-line)
_ (println "test")
s (Scanner. option)
_ (println "test")
opt (.next s)
_ (println "test")]
(case opt
"s" (println "case test")
(let [lastn (.next s)
firstn (.next s)]
(new-student lastn firstn)))))

Def 始终定义一个顶级变量,因此如果您在函数中使用它,该函数的所有实例将共享相同值,并且会相互干扰。在 Clojure 中,用于定义词法范围的构造是 let 表达式。在上面的示例中,我使用名称 _ 表示我不会对其执行任何操作的值(打印的结果),这只是一个约定,尽管它表明可以使用在 let 表达式中多次使用相同的名称(如果需要,后面的表达式可以使用以前的值)。

关于java - 在 Clojure 中使用 Java 的扫描器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22312595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com