我对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))
)
)
)
)
答案 0 :(得分:2)
()
和第一个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)
使用cider,clojure-mode和paredit设置emacs非常值得(paredit 非常非常有用并且习惯了它有点成就)这是一个开始学习的好地方,许多人选择使用某种入门套件,例如emacs starter套件或emacs live