2012-01-05 88 views
2

我試圖實現Land of Lisp's Dice of Doom game,我得到一個Don't know how to create ISeq from: clojure.lang.PersistentList$1

它的出現叫我add-new-dice功能時:

(defn add-new-dice [board player spare-dice] 
    (letfn [(f [lst n] 
      (cond (empty? lst) nil 
        (zero? n) lst 
        :else (let [current-player (first (first lst)) 
           current-dice (first (rest (first lst)))] 
          (if (and (= current-player player) (< current-dice *max-dice*)) 
          (cons (list current-player (+ current-dice 1)) 
            (f (rest lst) (- n 1))) 
          (cons (first lst) (f (rest list) n))))))] 
    (f board spare-dice))) 

與此:

(add-new-dice '[(0 1) (1 3) (0 2) (1 1)] 0 2) 

我這樣做主要是爲了與CL碼熟悉自己,並獲得了一定的經驗移植過來,以Clojure的。

如果有人可以給我一些建議,這將不勝感激。

+0

花了我一段時間,但我確實得到了所有版本的Dice of Doom與Clojure一起工作(儘管我使用compojure而不是家庭網絡服務器)。讓我知道你是否想看看我是如何做到的。我的代碼對於一般發佈來說還不夠好:( – 2012-01-06 12:27:20

+0

嗨艾德里安,你是否在後面聊天?我在理解如何將CL懶惰移植到懶惰seq上:)... – toofarsideways 2012-01-17 11:57:39

+0

嗨toofarsideways,最好只是給我發電子郵件:我是gmail上的adrian.mouat。讓我知道你在哪個國家/時區。 – 2012-01-17 12:15:44

回答

7

在第二行到最後一行,您正在使用功能list而不是您的參數lst(f (rest list) n)應該是(f (rest lst) n)

+0

謝謝Joost,那是我嚴重的打字錯誤。我瘋狂地想知道我誤解了這個部分。非常感激! – toofarsideways 2012-01-05 15:57:31

+1

是的,這是clojure作爲Lisp-1的一個潛在問題(意思是函數和「變量」/參數都佔用相同的名稱空間)。如果你不能爲你的序列命名更有用的東西,那麼最好使用clojure標準庫的命名約定,並使用「coll」而不是「lst」作爲泛型seq'able集合(儘管個人而言,我更喜歡「s」簡單的序列和地圖上的「m」) – 2012-01-05 20:11:23

+0

對於我自己的慫恿,有人願意解釋爲什麼用函數替換seq的輸入錯誤會產生異常? clojure.lang.PersistentList是'list'函數的數據形式嗎? – 2012-01-05 21:58:54

相關問題