2013-07-22 25 views
1

我想在clojure中寫一個基於週期的Fizz Buzz。它似乎適用於不是Fizz或Buzz的值,但對於Fizz和Buzz的值則返回nil。clojure週期返回無地圖索引

代碼:

(ns fizz-buzz.core 
    (:gen-class)) 

(defn fizz-buzz [value] 
    (let [fizz (cycle ["" "" "Fizz"]) 
     buzz (cycle ["" "" "" "" "Buzz"]) 
     fb (map str fizz buzz)] 
    (nth (map-indexed 
      (fn [i v] 
      (if (clojure.string/blank? v) 
       (str (+ i 1) 
       v))) 
      fb) 
     (- value 1))) 

測試:

(ns fizz-buzz.core-test 
    (:require [clojure.test :refer :all] 
      [fizz-buzz.core :refer :all])) 

(deftest value-2-will-return-2 
    (testing "2 will return the string 2" 
    (is (= "2" (fizz-buzz 2))))) 

(deftest value-4-will-return-4 
    (testing "4 will return the string 4" 
    (is (= "4" (fizz-buzz 4))))) 

(deftest value-3-will-return-fizz 
    (testing "3 will return the string Fizz" 
    (is (= "Fizz" (fizz-buzz 3))))) 

(deftest value-5-will-return-buzz 
    (testing "5 will return the string Buzz" 
    (is (= "Buzz" (fizz-buzz 5)))) 

前兩個測試工作(2,4),但嘶嘶聲和音檢測不起作用。我相信我不明白地圖索引的工作方式。

回答

5

您的if聲明中有一個非常輕微的托架錯位。 這意味着你沒有else情況下您if(因此nil結果)

嘗試改寫:

(if (clojure.string/blank? v) 
      (str (+ i 1) 
      v))) 

由於:

(if (clojure.string/blank? v) 
      (str (+ i 1)) 
      v)) 

PS - 它看起來就像你明白地圖索引罰款:)

+3

一個編輯器(自動)縮進到Clojure約定真的幫助避免和發現這樣的錯誤。例如,我在'vim-clojure-static'中使用'vi',當原始文件被重新縮進時,'v'放在'(+ i 1)'下面,給出一個清晰的視覺信號,「v」是一個參數'str'而不是'if'。我相信Emacs等,也是類似的。 –

+0

非常感謝Daniel。我不能相信我錯過了這一點。 答:我回到vi後約10年不使用它。我必須查看vim-clojure-static。謝謝你們。 –