在 Clojure 中使用 Java 的扫描仪



我正在尝试使用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))))

但是在输入"s firstName lastName"时得到以下输出

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表达式中多次使用相同的名称是可以的(后面的可以使用前面的值,如果他们愿意)。

相关内容

  • 没有找到相关文章

最新更新