2016-08-20 4 views
0

新しいのリストを逆転ので、私はこのプロジェクトにジャンプする前にコアライブラリに慣れると、この質問に走ってきた4Clojureの質問を通過してきた:Clojureのは、やると再発形式のClojureに

// Write a function which reverses a sequence. 
(= (__ [1 2 3 4 5]) [5 4 3 2 1]) 

これは単なるテスト・ケースの一つであるが、ここで私が思い付くていたものです:

(fn [x my-seq] 
    (if (empty? my-seq) 
    x 
    (do 
     (into x (take-last 1 my-seq)) 
     (recur x (into [] (drop-last my-seq)))))) [] 

私は[]ので 私はそうのようにコードを変更しREPLでこのコードを実行した後、空のベクターを得ていました。

(fn [x my-seq] 
    (if (empty? my-seq) 
    x 
    (recur (into x (take-last 1 my-seq)) (into [] (drop-last my-seq))))) [] 

質問以前のコードが機能しなかったのはなぜですか?私にとってそれは論理的には同等であると思われますが、変更されたコードはdoフォームを避けるときれいに見えます。繰り返しますが、私はClojureを初めて使っていますので、私はdoとrecur形式に完全に精通していません。

答えて

1

(into x (take-last 1 my-seq))が問題です。 xを変更することはできません。 (into x ...)は新しいベクトルを作成して返します。

ただし、最後の文を除く(do ...)内のすべての文の戻り値は削除されます。あなたは元のままで繰り返されています - 空 - x

+0

これは不変性がある場所です。ありがとうございます – lest96