Clojure 和函数不';t工作:/

Clojure 和函数不';t工作:/,clojure,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=> 也许是时候休息一下了:)也许可以试试: (defn sum [a b] (+ a

不久前,这段代码似乎还有效,但现在它不再有效了。有什么问题吗

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=>
也许是时候休息一下了:)

也许可以试试:

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

Clojure是Lisp家族的一员,它总是使用前缀表示法来表示算术表达式。

既然您正试图编写这样一个函数,我想指出,+在Clojure中只是一个正则函数,就像在任何其他Lisp中一样,这是否会有所帮助。事实上,Clojure中没有特殊的“算术表达式”,只有参数为数字且运算符函数执行算术运算的函数应用程序

事实上,在大多数Lisp中,没有特殊的“运算符”,即需要包装的语法片段,它们的功能才能以函数的形式提供。Clojure在这方面作为一个Lisp是不寻常的,因为它明确地依赖于它的宿主平台来实现一些相当基本的功能;e、 g.在香草Clojure中,浮点求幂是以
java.lang.Math
类的
pow
方法的形式提供的(但请参见
Clojure.contrib.Math
了解一些不错的函数,它们可以执行
Clojure.core
中没有的各种算术运算)

Java方法必须包装在Clojure中才能用作函数(例如,传递给
map
等),因此,通过这种方式,它们可能会让人想起来自C、Python或Java本身等语言的运算符。不过,它们仍然使用前缀符号进行调用。

  • clojure.core中已经有一个+函数,所以在重新定义它时要非常小心,最好避免使用它
  • 包括Clojure在内的所有Lisp都使用前缀表示法。您应该调用类似于
    (fn name args)
    的函数。在您的示例中,Clojure尝试将整数作为函数调用,因为这是列表的第一个元素。整数不实现IFn接口,因此可以解释错误消息
  • 事实上,您可以使用函数获得数学函数的中缀符号。有关此功能,请参见《Clojure的欢乐》第一章第13页,可在此处免费获得:

尽管这个特定的中缀示例不会进入最终草案,但我应该注意,它是作为函数实现的,而不是作为宏来实现的。@fogus进行了相应的编辑。