2015-02-07 25 views
2

我非常綠色的Clojure。但我試圖通過創建一些函數來學習語法。我有括號和一般的語法問題...Clojure的錯誤調用遞歸函數 - 最有可能是括號問題

此功能應該採取列表和位置,並返回與該位置刪除列表 - 但我得到的是我不知道的錯誤充分認識。我已經做了一些閱讀,它似乎是嵌套括號的問題..但我不知道如何解決它。

任何反饋,將不勝感激。

錯誤:

ClassCastException java.lang.Long cannot be cast to 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

Clojure中的括號或任何其他Lisp在這方面與C族語言中的花括號不同。你設計你的代碼的方式似乎表明你相信他們是。看看這裏:http://hitchhikersclojure.com/blog/hitchhikers-guide-to-clojure/對Clojure語法的介紹。 – 2015-02-07 01:55:15

回答

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的時候,大量的堆積關閉的括號)))))是正常的,看起來不錯的眼睛(一旦你習慣了它)和堆疊開括號((跳出來爲可疑。它主要在您調用返回函數的函數時出現,然後您想調用結果函數。

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) 

這是很值得讓emacs的設置與ciderclojure-mode和paredit(paredit是非常有用的習慣是有點成就的),這是開始學習的好地方,許多人們選擇使用某種初學者工具包,例如emacs starter工具包或emacs live

+0

只是作爲一個側面說明這個可以寫成'(CONCAT(取(DEC POS)L)(下降POS 1))'以及許多其他方面。 – 2015-02-07 01:33:52

+0

我一定會檢查出來的,謝謝。 – StillLearningToCode 2015-02-07 01:35:55