Explorar el Código

Merge pull request #1059 from finalfantasia/master

[clojure] Update Clojure example with one that's more representative.
Alexandru Dima hace 6 años
padre
commit
95872c9b82
Se han modificado 2 ficheros con 56 adiciones y 8 borrados
  1. 2 0
      .gitignore
  2. 54 8
      website/index/samples/sample.clojure.txt

+ 2 - 0
.gitignore

@@ -1,2 +1,4 @@
+/.idea/
+/*.iml
 /node_modules/
 /release/

+ 54 - 8
website/index/samples/sample.clojure.txt

@@ -1,8 +1,54 @@
-(def object "call object via def()")
-(defn say-hello
-      "Takes name argument and say hello to the name"
-      [name]
-      (println (str "God said let there be " name)))
-(let [l "light"] (println (str (say-hello l) " " object)))
-(doc say-hello)
-(meta (var say-hello))
+(ns game-of-life
+  "Conway's Game of Life, based on the work of
+  Christophe Grand (http://clj-me.cgrand.net/2011/08/19/conways-game-of-life)
+  and Laurent Petit (https://gist.github.com/1200343).")
+
+;;; Core game of life's algorithm functions
+
+(defn neighbors
+  "Given a cell's coordinates `[x y]`, returns the coordinates of its
+  neighbors."
+  [[x y]]
+  (for [dx [-1 0 1]
+        dy (if (zero? dx)
+             [-1 1]
+             [-1 0 1])]
+    [(+ dx x) (+ dy y)]))
+
+(defn step
+  "Given a set of living `cells`, computes the new set of living cells."
+  [cells]
+  (set (for [[cell n] (frequencies (mapcat neighbors cells))
+             :when (or (= n 3)
+                       (and (= n 2)
+                            (cells cell)))]
+         cell)))
+
+;;; Utility methods for displaying game on a text terminal
+
+(defn print-grid
+  "Prints a `grid` of `w` columns and `h` rows, on *out*, representing a
+  step in the game."
+  [grid w h]
+  (doseq [x (range (inc w))
+          y (range (inc h))]
+    (when (= y 0) (println))
+    (print (if (grid [x y])
+             "[X]"
+             " . "))))
+
+(defn print-grids
+  "Prints a sequence of `grids` of `w` columns and `h` rows on *out*,
+  representing several steps."
+  [grids w h]
+  (doseq [grid grids]
+    (print-grid grid w h)
+    (println)))
+
+;;; Launches an example grid
+
+(def grid
+  "`grid` represents the initial set of living cells"
+  #{[2 1] [2 2] [2 3]})
+
+(print-grids (take 3 (iterate step grid)) 5 5)