调用递归函数的Clojure错误 - 很可能是括号问题

时间:2015-02-07 00:48:02

标签: clojure functional-programming

我对Clojure非常环保。但我试图通过创建一些函数来学习语法。我一般都遇到括号和语法问题......

这个函数应该是一个列表和一个位置,并返回删除该位置的列表 - 但是我收到一个我不完全理解的错误。我做了一些阅读,看起来这是嵌套括号的问题..但我不知道如何解决它。

非常感谢任何反馈。

错误:

  

ClassCastException java.lang.Long无法强制转换为clojure.lang.IPersistentCollection clojure.core / conj(core.clj:83)

代码:

(defn delete-at
"accepts a list and position--returns the list with
 value at that position removed"
(
[L, pos]
(cond
  (empty? L) nil
  (zero? pos) (rest L)
  :else (
          delete-at (first L) (rest L) (- pos 1))
  )
)
([L-new, L2, pos]
(cond
  (zero? pos) (conj L-new (rest L2))
  :else (
          (delete-at (conj L-new (first L2)) (rest L2) (- pos 1))
          )
  )
)
)

1 个答案:

答案 0 :(得分:2)

给它一个通过emacs格式化程序的传递会让问题跳出来:在最后一次调用delete-at时,额外的一组()和第一个conj调用的参数相反。

(defn delete-at
"accepts a list and position--returns the list with
 value at that position removed"
([L, pos]
 (cond
  (empty? L) nil
  (zero? pos) (rest L)
  :else (delete-at (first L) (rest L) (- pos 1))))
([L-new, L2, pos]
 (cond
  (zero? pos) (conj L-new (rest L2))
  :else ((delete-at (conj L-new (first L2)) (rest L2) (- pos 1))))))

在阅读Clojure时,许多堆叠的关闭parens )))))是正常的并且看起来很好(一旦你习惯了)并且堆叠的开口parens ((跳出来是可疑的。它主要在您调用返回函数的函数时出现,然后您想调用结果函数。

user> (defn delete-at
 "accepts a list and position--returns the list with
  value at that position removed"
([L, pos]
 (cond
  (empty? L) nil
  (zero? pos) (rest L)
  :else (delete-at (first L) (rest L) (- pos 1))))
([L-new, L2, pos]
 (cond
  (zero? pos) (conj (rest L2) L-new)
  :else (delete-at (conj L-new (first L2)) (rest L2) (- pos 1)))))
#'user/delete-at
user> (delete-at [1 2 3] 1)
(1 3)

使用ciderclojure-mode和paredit设置emacs非常值得(paredit 非常非常有用并且习惯了它有点成就)这是一个开始学习的好地方,许多人选择使用某种入门套件,例如emacs starter套件或emacs live