我尝试在控制台上打印一个数字:数学函数应该返回
两个较大数字的平方和
(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
那我做错了什么?
答案 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为参数。