日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

Clojure

On Lisp -> Clojure へ移植: 8.1~8.9

8.1 マクロ引数の捕捉 p75 ここで挙げられている for はリスト内包表記な Clojure の for でなく、 命令プログラミング的な for をマクロ実装してみたもの。 Clojure でサンプルを素直に読み替えて定義してみた場合だと実際は使えない。 (defmacro for-a [[s…

On Lisp -> Clojure へ移植: 6.9~6.11

6.9 マクロへの依存 p66 Clojure も事情は同じと考えていいのかな。 (defmacro mac [x] `(inc ~x)) ;=> #'user/mac (def f (fn [y] (mac y))) ;=> #'user/f (defmacro mac [x] `(+ ~x 100)) ;=> #'user/mac (f 1) ;=> 2 6.10 関数からマクロへ p67 ここでは …

On Lisp -> Clojure へ移植: 6.4~6.8

6.4 マクロ展開の確認 p60 図 33 マクロ展開確認用のマクロ (defmacro mac [expr] `(clojure.pprint/pprint (macroexpand-1 '~expr))) cider なら C-c C-m すればいいんだが一応。 6.5 引数リストの構造化代入 p61 最初サンプルほぼそのまま書いてみたのだが…

On Lisp -> Clojure へ移植: 6.1~6.3

6 マクロ 6.1 マクロはどのように動作するか p54 (defmacro nil! [x] (list 'def x nil)) 6.2 逆クォート そのままバッククォートと言われたりもする。 一応補足すると、Common Lisp でのバッククォート中のカンマは Clojure では ~ に相当する。 同様に Com…

On Lisp -> Clojure へ移植: まえおきと目次

まえおきのまえおき ここは On Lisp -> Clojure へ移植記事シリーズのエントリポイントとして書いてます。 なので目次は中身が更新され次第合わせて更新します。 意思表明的な意味を込めてまえおきも置いてますがんなもんどうでもいいよと言う人は まえおき…

JavaFX の Drag and Drop

JavaFX に限らず、一言に Drag and Drop と言っても、Source と Target が何か、Target の扱いを どうするかで話は大分変わるんじゃないかなと思いつつ、まずは日本語リソースをググってみるがサッとは見当たらない。 この記事の続き には書かれてるかもしれ…

JavaFX の Low-Level Binding API の使い方整理

いやあ、ハマりにハマりまくったが何とか解決できたので整理する。 前に JavaFX の Binding ってあまり使う事ないかも とか言ったけど撤回します。その後調べてると Low-Level Binding とも組み合わせたら割とやりた い放題、と言うか異なる型同士の Propert…

Clojure の destructuring でちょっと驚いた事

祝 Clojure1.6 正式リリース 個人的に目を引くような変更点 はあんまりないんだが、1.5 から使い勝手は変わらずに不具合修正もいくらかされているみたいので、既に 遭遇してる人はもちろんの事、この先要らん地雷を踏みたくない人もアップデートかけた方が良…

Clojure で mutable な field を持つ deftype の例

doc 見れば書いてはいるんだが試した事はなかったので試してみた。 Clojure deftype that has mutable field and setter ...

Clojure の一つの名前空間で複数ファイルに分けたい

とあるオレオレライブラリの管理をする時、ソースファイルとしてはある程度機能別に分けたいのだが、 そのライブラリを使うとなった時にはあまり require, use で指定する名前空間は増やしたくない。 そう言う時どうすりゃいいんだろと少しググって見たら、C…

4Clojure の別解

4Clojure#95って clojure.zip使うとも少し分かり易く書けるのではとふと思い立ち書き直してみた。 4Clojure#95別解 ネタバレになると思うので埋め込まずにリンクだけ載せときます。

Clojure + JavaFX プログラムを配布できないものか試してみる

[2014-05-08] 手順一部更新 Github を使いだしたので慣れる為にも今回からはてブロでも対応してる Markdown 記法で記事を書くことにする。まあ見た目には変わらないんだけど。 さて、これまでしつこく JavaFX を試してたのだが、気にはしつつもほったらかし…

Clojure のお手軽オプショナル引数(かなりニッチ)

小ネタ。個人的には使わないとすぐ忘れてしまう筆頭機能の一つである Clojure の Destructuring。これをちょっとだけ利用した小技を一つ。一つだけオプショナル引数として欲しいなあって時は (defn foo [bar & [baz]] (hoge-fn baz bar)) と書くと楽。baz が…

Clojure の future は shutdown-agent と一緒に使うべし

Clojure には気軽に別スレッドに処理を投げて結果をもらう事ができる関数として future があるんだけど 、これ future の処理が正常終了しててプログラム終わらせようとしてもしばらく終わらない事がある。自分が使った時がプログラムが終わるまで 1~2 分か…

Clojure での docstring 挿入位置

defn は一番良く使うので忘れる事はないのだが、他の def 系を使う時に docstring 挿入位置*1ってどうなってたっけと手が止まる事が時々ある。どうも自分の中でイマイチ整理できてないのでここらでちょっとまとめてみた。 基本形 (def ^{:doc " これが基本 "…

Clojure の Tagged Literals について

Clojure の Tagged Literalsで遊んでたところ、タグリテラル単体を評価する時ではタグとヒモ付けた関数が展開されてるみたいなんだが、他の式と組み合わせるとダメ。あるシーケンスを返すリーダーマクロなんだが、そいつにごく単純に first かけても以下のよ…

関連付け起動で clj ファイルを emacs で開く

自分は Clojure でコードを書く時、 用途 ツール 通常のテキスト編集 xyzzy Clojure での開発 emacs + コマンドプロンプト ファイル操作 xyzzy ファイラ と言う、多分世界で何人もいないんじゃないかwと言う相当ニッチな環境で作業してる。これで一つだけ困…

Clojure から無理やり FXML UI を参照する

無理やりシリーズ連続w今日も今日で飽きもせず JavaFX API を眺めていると Node#id なるプロパティを見つけた。API doc の String ID と言う項目に説明がある。んん?これ FXML の fx:id と違うんだっけ?お手軽に試すため fx:script を試した時の project …

Clojure + JavaFX で無理やり REPL

タイトルは元々前から何とかできないかとちょいちょい調べてたのだが、先日以下のブログの記事を見つけて Scala REPL でできるならきっと Clojure だってできるはずだー、と無意味なライバル心が芽生えて改めてがっつり調べてみたくなったのが発端w Scala RE…

JavaFX アプリ用 leiningen テンプレートを作ってみる

公式ドキュメントを斜め読みしてもイマイチピンとこないので実際に自分で試してみる。日本語で読めるお試し記事がこちらにあり、記事では謙遜してるけど実際にはこちらの記事の方が大いにお世話になった。 やりたい事 JavaFX スタンドアロンアプリ用の Cloju…

codox 良いね

多分バリバリ開発してる人には今更なんだろうけど自分の作ってる関数がとっ散らかってきてどんな命名にしてたっけか、と言うのを見たくて leingen プラグインとして提供されてる Clojure アプリ/ライブラリの API 自動生成ドキュメントである codox を入れて…

require 一辺倒でなく use もいいかなあ

Clojure を使い始めた頃は名前の衝突とどの名前空間だか分からなくなるので (require '[clojure.string :as s]) のスタイル一択でしょ、と思ってたが、書くコードが増えてくるにつれ :as で短くした修飾すら打つのを面倒に感じるようになってきた。emacs で…

Clojure の ratio? と rational?

小ネタ。昨日から Clojure で分数を扱いたくちょいちょい調べてるが、分数かどうか判定する関数は ratio? が使える。 (ratio? 1/3) ;=> true (ratio? 1) ;=> false (ratio? 1.1) ;=> false 似たような名前の関数で rational? もあるが、こちらは整数でも tru…

Clojure の leiningen プロジェクトでファイル分割する際の注意点

とある leiningen プロジェクト内でまぁ何となく機能別にファイルを分割したくなりファイルを分割した。元々 core.clj の 1 ファイル内で REPL 上で試しながらコードを書いていて量が増えてきたので機能別にこんな依存関係で分割した。 foo.core -> foo.a ->…

ライブラリ整理

ちょくちょく使ったり気になるライブラリをちょっと整理したくなった。 使った事ある 名前 概要 Datomic 何か新しいデータベース clj-time Joda-Timeをベースとした日付時刻操作ライブラリ clojure.java.jdbc JDBC Clojure ラッパライブラリ clojure.data.cs…

Clojureの遅延シーケンスのファイル出力

小ネタ。Clojure では何気に使ってる関数で返されるのが遅延シーケンス(LazySeq)な事は良くある。 REPL では LazySeq を勝手に具現化してくれるのだが、ここで遅延シーケンス foo-seq をファイルに吐き出したくて以下のように spit としても、 (spit "some.f…

datomic でハマった事いくつか

datomic でまだまだ遊んでいる所なのだがハマった事を順次書いていく。 DB は常に最新を見ましょう 結論から言うと DB 指定する所では過去を振り返る必要が出てくる時以外は常に (db conn) で最新の DB を指定すべきと言うお馬鹿なオチ。話を単純化するため…

Clojure のキーワードを文字列に変換する

小ネタ。キーワードを文字列に変換するのは name がお手軽。 (name :foo) => "foo" コロンも含めたければ単純に str で良い。 (str :foo) => ":foo" ただ :foo/bar のような名前空間修飾があるタイプのキーワードはちょっと事情が異なる。 これを "foo/bar" …

Clojure シンタックスクォートマクロで名前空間修飾を回避する

Clojure のシンタックスクオートを使用したマクロでは、マクロ展開時シンボルに名前空間が修飾されて名前衝突を回避するようになっている。多分大部分はこれで問題ないんだろうけど、敢えて修飾したくない場合は以下のように書くとマクロ展開でシンボルその…

[Clojure] clj-time を使う

java.util.Date でフォーマットとか考えると途端に面倒くさくなったので clj-timeを使ってみた。楽だ。ただ、少し調べた事もあったのでメモ。 日時と日でクラスが違う (require '[clj-time.core :as t] '[clj-time.format :as tf] '[clj-time.local :as tl])…