Clojure

Clojureの思い出

ふと思い立ったので、記憶から忘却される前に書いてみようと思います。もう2年くらい書いてないけど、4年ほど仕事で使っていました。その期間はコード書くときはほとんどClojureだったので、まあまあヘビーに使っていたと思います。 前提 Clojureを使うよう…

Clojureのソースコードを読む

プログラム言語のソースコードを読もうとしたのはRが一番最初だったと思いますが、あのときはCの知識がろくにないまま戦っていた気がします。Clojureのソースコードを読んでみようと思ったけどRのときよりは割と読めるようになっている気がするし、clojure自…

pvaluesとか

clojureは並行処理を得意としているので各処理が独立してできる場合、並行で処理をさせると高速化できる場合があります。代表的な関数としてはpmap、pvalues、pcallなど。 pmap vectorの各要素に関して、ある処理を回したいとかの場合、pmapがよいでしょう。…

openしたらcloseを忘れないようにしましょう

Rubyだと File.open("hoge.txt", "w") {|file|...} のようにやっておけばcloseして片づけてくれます。後片付けがきちんとできない人間にも安心ですね。ところで、clojureのjsonライブラリを使っていたのですが、書き出すときにハッシュの終わりが閉じていな…

clojureでスクリプトっぽいこと(?)をする

Leiningenは依存しているものを自動に取ってきてくれたりして便利。jarで配布するときなどはproject.cljに (defproject HogeProject "1.0.0-SNAPSHOT" :description "FIXME: write description" :dependencies [[org.clojure/clojure "1.2.0"] [org.clojure/…

clojureのオブジェクトからjson形式へ

メモメモ。 % java -server -Xmx1024m -cp lib/clojure-1.2.0.jar:lib/clojure-contrib-1.2.0.jar clojure.main Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 Clojure 1.2.0 user=> (use 'clojure.contrib.json) nil user=> (json-str {:hoge 1}) "{\"ho…

Clojureにヒアドキュメント的な機能を追加しつつ、compojureでコードを埋め込んでsyntax highlightを効かせる

タイトルが長い。compojure(clojureでsinatra likeなことができる)でwebサイトを作っていたが、RubyやらClojureやらのコードを埋め込みたい。要ははてなのsuperpre記法っぽいものが欲しかったのである。clojureに標準でヒアドキュメント的なことはできないが…

ネストしたvector or hashmap

機械学習とかで隠れ変数を扱っているときに、「隠れ変数zに割り当てたサンプルの数を保存しておきたい」みたいな要望に答えるにはvectorやhashmapを使うのが上等手段だと思うが、隠れ変数が2段、3段となっていくとそれらの構造もネストしていってしまうわけ…

Clojureではまること

関数の引数やletの中で"vec"とかっていう変数を使った後で戻り値を返すときに関数としての"vec"を使ったりするとエラーが意味分かない感じになってしまうので無駄に解読に時間がかかってしまった(例えば"Key must be integer"とかと言われる)。かれこれ3回目…

transientとpersistentについて

Clojureの1.1から使えるようになった機能。Clojureの公式サイトから引用すると If a tree falls in the woods, does it make a sound? If a pure function mutates some local data in order to produce an immutable return value, is that ok? Clojure - T…

Clojureにおける関数の部分適用について

取る引数が複数あって、どれかだけ固定して残りはまだ引数になってる(説明の仕方が悪い)ようなときにはpartial関数が便利。"+"とか"*"のような順序を交換しても結果が変わらないような関数に関してはpartialはとても便利なのだが、"-"とか"/"とかはどっちを…

atomの配列と配列のatom

Clojureは基本的にmutableなものを許さない設計になっているので、do-syncなどのトランザクションの中でrefを変更するコストは結構高い(はず)。ドランザクションではないけど、atomの場合でちょっと実験してみる。atomの配列と配列のatomを用意。要素をラン…

threading macros便利

clojureを書いていると(reduce f4 (filter f3 (map f2 (map f1 lis))))みたいなのがネストしまくって、ソースが横に長くなるときがある(というかよくよくある)。clojureにはそういうのを解決してくれるマクロがいてそれは"->"と"->>"。名前はthread-first ma…

Clojure + swank + slimeでのプログラミングの感覚はR on ESSに似ている

最近でこそ使わなくなったものの、自分にとってRは母国語(第一言語?)みたいなもので結構影響を与えている。Rの言語として好きなところ(例えばapplyで行毎にばさっと関数適用してplotしてデータの様子をさくっと眺めるとか)もあるが、データ解析言語としてのR…

Clojure始めます

NLPの下のレイヤー(segmentationやparsing)で公開されているプログラムはC++やJavaであることが多い。XXXの(Ruby|Python|Perl) bindingみたいなのが用意されていることもあるが、そうでないものも多い。あるいはbindingには公開されてない情報も使いたいとか…