前一段时间,这段代码似乎有效,但现在它已不复存在了。这有什么问题吗?
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=>
可能是时候休息一下了:)
答案 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)
(fn-name args)
这样的函数。在您的示例中,Clojure尝试将Integer作为函数调用,因为这是列表的第一个元素。整数不实现IFn接口,因此解释了错误消息。