アーカイブ

Posts Tagged ‘clojure’

33. Clojure: Big EndianとLittle Endianのデータファイルを作成

clojureでファイル解析を行う練習をしてみたいので、簡単にテストデータを作っておく。pythonで。

#!/usr/bin/env python
from __future__ import with_statement
from struct import pack

#Little Endian
with file("little-endian.dat", "w") as f:
        f.write(pack('<H', 0x1234))
        f.write(pack('<I', 0x12345678))
# Big Endian
with file("big-endian.dat", "w") as f:
        f.write(pack('>H', 0x1234))
        f.write(pack('>I', 0x12345678))
広告
タグ: ,

32. Clojure: javax.swing.JList を使う

Swingの部品を使う練習 その1

;; javax.swing.JList sample
(import '(javax.swing JFrame JPanel JOptionPane JScrollPane JList))
(import '(javax.swing.event ListSelectionListener))
(import '(java.awt Dimension BorderLayout))

(defn msgbox [frame msg]
  (JOptionPane/showMessageDialog frame msg "Info" JOptionPane/INFORMATION_MESSAGE))

(let [data ["Blue" "Green" "Red" "White" "Black"]
      list (JList. (into-array data))
      frame (JFrame.)
      scrollpane (JScrollPane.)
      panel (JPanel.)]
  (.addListSelectionListener
   list
   (proxy [ListSelectionListener] []
     (valueChanged [e]
                   (let [idx (.getSelectedIndex list)]
                     (msgbox frame idx)))))
  (.setView (.getViewport scrollpane) list)
  (.setPreferredSize scrollpane (Dimension. 200 80))
  (.add panel scrollpane)
  (.add (.getContentPane frame) panel BorderLayout/CENTER)
  (.setDefaultCloseOperation frame JFrame/DISPOSE_ON_CLOSE) ; for running on SLIME
  ;;  (.setDefaultCloseOperation frame JFrame/EXIT_ON_CLOSE)
  (.setTitle frame "javax.swing.JList sample")
  (.setBounds frame 10 10 250 130)
  (.setVisible frame true))
タグ:

13. Clojure: Twitterのタイムラインを取得するサンプル

Clojureはjavaの膨大な資産を、簡単に利用できるから便利だ。

;;; JTwitter を利用して、Home Time Line を取得するサンプル
;;; JTwitter => http://www.winterwell.com/software/jtwitter.php
(import '(winterwell.jtwitter Twitter))
(print (map #(format "%n%s %s:%n %s%n"
                     (.toLocaleString (.createdAt %))
                     (.getUser %)
                     (.getText %))
            (.getHomeTimeline (Twitter. "USERNAME" "PASSWORD"))))
タグ:

12. Clojure: Clojure Box のカスタマイズ

Clojure Boxはインストールしただけで、なんとなく使えるけれども、(compile ‘hogehoge)したらエラーでるじゃん!とかなる初心者(僕だけど…)向け設定

ワーキングディレクトリを

C:\workspace

とする。

このディレクトリに、srcとclassesというディレクトリを作成しておく。つまり、

C:\workspace\src
C:\workspace\classes

というディレクトリを作成する。で、次のようなファイルを作った場合は、

(ns my.hello)
(defn hello [] (println "hello,world"))
C:\workspace\src\my\hello.clj

として保存する。namespaceとディレクトリ(ファイル名含む)パスが一致することが重要。

次に、C:\workspace\src と C:\workspace\classes を “swank-clojure-classpath”に追加するために、emacs/site-lisp/default.elを修正する。Clojure Boxを標準でインストールしていれば、C:/Program Files/Clojure Box/emacs/site-lisp/default.elにあるはず。で、次のように保存して(追加したところはBoldで示した)、emacsを再起動する。

  (add-to-list 'swank-clojure-classpath
        (concat clojure-home "swank-clojure/src"))
  (add-to-list 'swank-clojure-classpath "c:/workspace/src")
  (add-to-list 'swank-clojure-classpath "c:/workspace/classes")
  ;; Start the REPL
  (slime))

ついでに、REPLで日本語も使いたい、という場合は、やはり同じdefault.elの(require ‘slime)という行の次に、slime-net-coding-systemにutf-8を指定する。

  (add-to-list 'load-path (concat clojure-home "slime-cvs/"))
  (require 'slime)
  (setq slime-net-coding-system 'utf-8-unix)
  (slime-setup '(slime-repl))

日本語の入力は、「全角半角キー」じゃなくて、Controlキーを押しながら¥キー。これで、日本語入力モードがトグルする。

ここまでで設定は終わり。emacsを再起動して、(compile ‘my.hello)して、エラーがなければ多分compileは成功していて、C:\workspace\classes以下にclassファイルがいくつか作られているはず。

タグ:

11. Clojure: 関数定義の近くにテストコードをかけるのは便利かも

(ns my-name-space)
(use 'clojure.test)
(with-test
  (defn m2p1
    "与えられた引数を2倍して1を加算した値を返す"
    [x]
    (+ 1 (* 2 x)))

  (is (= -3 (m2p1 -2)))
  (is (= -1 (m2p1 -1)))
  (is (= 1 (m2p1 0)))
  (is (= 3 (m2p1 1)))
  (is (= 5 (m2p1 2)))
  (is (= 7 (m2p1 3))))

(run-tests 'my-name-space)
タグ: