如何在clojure中将单个数字打印到控制台?

时间:2014-03-22 16:33:52

标签: clojure

我尝试在控制台上打印一个数字:数学函数应该返回

  

两个较大数字的平方和

(ns myapp.core)





(defn mathfunction [a, b, c]
    (let [x (max a b c)
         lst (remove #{x} '(a b c))
         y (max((first lst) (first (rest lst))))]
            (+ (Math/sqrt x) (Math/sqrt y))))



(defn -main [& args]
    (println (mathfunction(1 5 3))))

只是为了确保不是我的数学函数是问题:

(defn -main [& args]
    (println 5.4))
  

java.lang.ClassCastException:java.lang.Long无法强制转换为   clojure.lang.IFn

那我做错了什么?

2 个答案:

答案 0 :(得分:2)

您遇到问题:

(mathfunction(1, 5, 3))

您需要的是:

(mathfunction '(1, 5, 3))

或者:

(mathfunction (list 1 2 3))

因为在(数学函数(1,5,3))中,1是一个数不是函数,这就是你得到的原因:

java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn

另外,由于上述原因,这是错误的:

(max ((first lst) (first (rest lst))))

你需要的是:

(max (first lst) (first (rest lst)))

请记住,在Lisp中,列表中的第一个元素是一个特殊的东西。它被称为: 功能位置

答案 1 :(得分:0)

对于你想要做的事情,这种方式对于clojure来说可能更为惯用:

(defn mathfunction [& args]
  (let [a (apply max args)
        rem (remove #(= % a) args)
        b (apply max rem)]
    (+ (Math/sqrt a) (Math/sqrt b))))

你还需要把它称为(数学函数1 2 3)而不是(数学函数(1 2 3))。

latte ris被解释为一个函数调用,其中1为函数,2,3为参数。