Sum函数不起作用:/

时间:2010-04-30 23:11:19

标签: clojure

前一段时间,这段代码似乎有效,但现在它已不复存在了。这有什么问题吗?

user=> (defn sum [a b] (a + b))
#'user/sum
user=> (sum 3 4)
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)
user=>

可能是时候休息一下了:)

3 个答案:

答案 0 :(得分:9)

也许试试:

(defn sum [a b] (+ a b))

作为Lisp系列的成员,Clojure总是使用前缀表示法来表示算术表达式。

答案 1 :(得分:2)

因为你正在尝试编写这样一个函数,我想知道指出 +只是Clojure中的常规函数​​是否有帮助,就像在任何其他Lisp中一样。实际上,在Clojure中没有特殊的“算术表达式”,只是函数应用程序,其参数是数字,其运算符函数执行算术运算。

事实上,在大多数Lisps中,没有特殊的“运算符”,因为它们的功能可以以函数的形式提供。在这方面,Clojure作为Lisp是不寻常的,因为它明确地依赖于它的主机平台来获得一些相当基本的功能;例如浮点指数在vanilla Clojure中以pow类的java.lang.Math方法的形式提供(但是请参阅clojure.contrib.math以获得一些很好的函数来执行不在{{1}中的各种算术运算}})。

Java方法必须包装在Clojure中以用作函数(例如传递给clojure.core等),因此这样他们可能会从C,Python或Java等语言中提到运算符本身。不过,它们仍然使用前缀表示法调用。

答案 2 :(得分:2)

  • clojure.core中已经有一个+函数,所以在重新定义它时要非常小心,你可能最好避免这种情况。
  • 包括Clojure在内的所有Lisps都使用前缀表示法。你应该调用像(fn-name args)这样的函数。在您的示例中,Clojure尝试将Integer作为函数调用,因为这是列表的第一个元素。整数不实现IFn接口,因此解释了错误消息。
  • 实际上,您可以使用函数获取数学函数的中缀表示法。有关此功能,请参阅The Joy Of Clojure第一章的第13页,可在此处免费获取:http://www.manning.com/fogus/Fogus_MEAP_Ch1.pdf