解いた問題

ラベル Clojure の投稿を表示しています。 すべての投稿を表示
ラベル Clojure の投稿を表示しています。 すべての投稿を表示

3/25/2012

ClojureでLispインタプリタ

思いつきでやってみた。意外と面白かった。
ちゃんと動くかは自信がない。
関数を定義するときに [ ] を使わないといけないのは気にしない。

5/20/2011

sleep sort in clojure

話題のSleepSortを描いてみた。

やることは、
・配列の要素と同じ数のスレッドを作る。
・各スレッドは、1つの整数を受け取り、その時間だけsleepする。
・数字を返す。

wait() ==>> notifyAll() ==>> sleep() で実現したかったけど、やり方がよく分からない。
notifiAllしないと微妙に順番が変わる可能性がある? いや、したとしても、変わるか?
とりあえず、sleepする時間を10倍。
(defn sleep-sort [ a ]
  (if (not (empty? a))
    (do
      (.start (Thread.
               (fn []
                 (Thread/sleep (* (first a) 10))
                 (println (first a)))))
      (sleep-sort (rest a)))))

(sleep-sort '(6 1 2 3 7 4 8 9 5 0))
参考サイト
4chan BBS – Genius sorting algorithm: Sleep sort

12/28/2010

Clojureを使ってみた

JavaVMで動作するlisp方言らしい。
遅延シーケンス、並列コンピューティング、Javaとの連携等々が特徴。
まず試しにいつものこれ。
(println "hello Clojure!")
printlnってのがそれっぽい。
次にFizzBuzz。
(defn fizz-buzz [n]
 (if (not= n 0)
   (do
     (fizz-buzz (- n 1))
       (if (= (mod n 15) 0)
         (println "FizzBuzz")
           (if (= (mod n 5) 0)
             (println "Buzz")
               (if (= (mod n 3) 0)
                 (println "Fizz")
                   (println n)))))))

(fizz-buzz 31)
先述の通り、Javaのクラスも利用可能。試しにsqliteを使ってみる。
(import '(java.sql DriverManager)
        '(java.sql Connection)
        '(java.sql PreparedStatement)
        '(java.sql ResultSet))

(Class/forName "org.sqlite.JDBC")

(def con (DriverManager/getConnection "jdbc:sqlite:test.db"))
(def st (.createStatement con))

(.execute st "create table table1( msg string, id integer )")
(.execute st "insert into table1 values (\"Fizz\", 3)")
(.execute st "insert into table1 values (\"Buzz\", 5)")
(.execute st "insert into table1 values (\"FizzBuzz\", 15)")

(defn print-result [rs]
 (if (.next rs)
   (do
     (println (.getString rs 1) (.getInt rs 2))
     (print-result rs))))

(print-result (.executeQuery st "select * from table1"))

(.close st)
少しもlisp方言っぽくない描き方な気がするけど、気にしない。
ちなみに、わざわざJavaからやらなくてもclojure.contribというのを使えば利用できるそうな。

Clojureが無理だとしても、Blogger Syntax Highliterがlispをサポートしてないことに衝撃。
prettifierと併用。それでも微妙に変・・・。

参考にしたページを私的メモ
Clojure
「プログラミングClojure」
Clojure Javaのコンストラクタ、メソッド、フィールドへのアクセス
Clojure のエレガントなところ
SQLite from Clojure