【问题标题】:java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn [duplicate]java.lang.ClassCastException:java.lang.Long 无法转换为 clojure.lang.IFn [重复]
【发布时间】:2023-03-15 09:27:01
【问题描述】:

这是我在这里的第一个问题,希望您能帮助我。 我正在 clojure 中编写合并函数。我在 tryclojure 上测试了我的代码,得到了标题中的错误。

这是我的代码

(def merge
(fn [lon1 lon2]
{:pre[(every? number? lon1)(every? number? lon2)]
:post[(every? number? %)]}
(cond
(empty? lon1) lon2
(empty? lon2)lon1
:else
(cons (min (first lon1) (first lon2))
(merge (rest lon1) (rest lon2))))))
#'sandbox7750/merge
> (merge (1,2,5) (3,4))
java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn

那么,这里的问题是什么?期待答案:)

问候

【问题讨论】:

  • 能否请您加强您的问题? (代码缩进,句子中的大写/小写字母)

标签: java clojure lisp


【解决方案1】:

首先,您需要引用列表,否则它们会被评估,并且它们的第一个元素被视为要调用的函数,因此例外:

(1,2,5)
;; => java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn

引用将帮助您获得带有数字的列表:

'(1,2,5)
;; => (1 2 5)

不使用元素分隔符(如,)也更惯用,您可以看到上面打印的表格((1 2 5))。

这似乎是一个练习,我会让你修复merge 函数中的其他问题。

【讨论】:

  • 感谢您的意见,这确实是一个练习。我的其他部分也有一些小错误。这是新的有效代码:code (def merge (fn [lon1 lon2] {:pre[(every? number? lon1)(every? number? lon2)] :post[(every? number? %)]} (cond (empty? lon1) lon2 (< (first lon1) (first lon2)) (cons (first lon1) (merge (rest lon1) lon2)) :else (cons (first lon2) (merge lon1 (rest lon2))))))
  • 没有类似自动格式化的东西吗?这段代码读起来很烂..
  • 您可以从编辑器中复制格式化代码,将其粘贴到 StackOverflow 编辑器中,选择代码 sn-p 并单击 {} 图标将其标记为代码 sn-p。
  • 这在添加评论部分是行不通的 :) 因为你可以看到我的第一篇文章是格式化的。谢谢你的帮助,我现在很好
【解决方案2】:

正确的调用是 (merge '(1 2 3) '(4 5)) 或 (merge [1 2 3] [4 5]) (逗号是可选的)。当您编写不带引号的列表 (1,2,3) 时,第一个元素被视为函数。 1 不是函数,您会收到错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2017-04-06
    相关资源
    最近更新 更多