日曜プログラミング

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

Clojure

オレオレ Clojure スタイル

小ネタ。 Clojure スタイルガイド にあるかどうか全部見てないけど、自分がコーディング時に決めてるスタイルを一つ。 マップの値参照時の関数呼び出し (マップ キー) と言う呼び出しで統一している。 これはマップデータに設定するキーが Clojure の keywor…

Calva の v2.0.109 以降で REPL の仕様が変わった模様

盆休み明けで Calva 触って気づいたんだがどうも v2.0.109 から REPL Window の代わりにファイルで REPL するようになったっぽい。 参考 公式ドキュメント Rationaleとか 全体を読み込んだ訳ではないので自分が気づいた所だけ。 REPL Window 廃止 じゃぁ REP…

Clojure の Macro 中(defmacro)での型ヒント

英語ならググれば割とすぐ出てくる話題だが自分用にメモ。 最近は Clojure で CLI ツール書く時、GraalVM で実行 exe を生成できる可能性を残すべく 自分が書くコード中では reflection warning を出さないよう型ヒントをつけまくってる。 ある日 defmacro …

この Protocol の使い方正しいんだろうか?

Clojure に限らないんだが関数名決めるのってプログラミングで一番難しいとか 誰か偉い人も言ってた気がする。 んで、自分で作った関数に付けたい名前が clojure.core にある関数名と被っている事があった場合どうするのが良いのか。 最も単純なのは被らない…

Clojure でコマンドラインツール作成のお供に lein-jlink のススメ

前置き 前提 jdeps で必要モジュールを調べる project.clj に必要モジュール指定の設定を追加する カスタム JRE 作成 カスタム JRE 作成場所の設定 実行スクリプト作成 パッケージング 最後に 前置き 英語的には Motivation に当たるのかな。 Clojure + Graa…

Programming Clojure, Third Edition 読む(宣言)

どうも最近の(と言っても随分前だが) Clojure の新機能イマイチ理解できてないなあと思い公式やネットの解説とかつまみ食い的に読んだりするのだがなーんかあんまり身についた気がせず、そろそろ GW だけど今のご時世遠出はリスクあるしここらで一つ Program…

Windows GraalVM で Clojure 製CLI ツールの native-image 作ってみた

2020/07/01 追記 GraalVM 20.1.0出たので インストールしてる時 native-image を gu install native-image で入れようとした時に 入れられなかったのでローカルでインストールした手順も追加。20.0 でも同じ PKIX なんちゃらのエラーだったので おそらく証明…

Clojure の Java interop で可変引数メソッドを呼び出す方法

例えばSomeClassと言うクラスのsomeStaticMethodの引数が String first, String... moreな場合。 (SomeClass/someStaticMethod first (into-array String [more...])) more は渡したい引数分だけ要素を突っ込む。例ではスタティックメソッドになってるがイン…

四角形を動かす、描画する

arcade-clj シリーズ。全体の目次はこちら。 元記事での追加機能 まずは四角を描画してみる すごくどうでも良い事 Entity System について 四角を動かす 斜め移動の判定 動かすコード 動かすコードを呼び出すコード 画面内のみで動くようにする 画面のリサイ…

Screen の 切替

arcade-clj シリーズ。全体の目次はこちら。 元記事での追加機能 作業 赤い画面と緑の画面二つ用意する ところでイベントハンドラに渡してる関数って Clojure 的にはタダの関数だよね github スナップショット 元記事での追加機能 スペースが押されたら背景…

ESC を押したら終了するようにする(イベントハンドリングの触り)

arcade-clj シリーズ その 2。シリーズ全体の目次はこちら。 元記事での追加機能 イベントハンドリング :on-keydown github スナップショット 元記事での追加機能 エスケープかxが押されたら終了するように変更する 以上。x は play-clj では特に何もしなく…

play-clj のインストール、シンプルなウィンドウの表示

arcade-clj シリーズ 1 つ目。シリーズ全体の目次はこちら。 一部以前の記事と重複している所もあるけどご容赦を。 play-clj のインストール ひとまず動かしてみる 元記事の仕様に合わせる REPL で動かしてみる それでもまだ面倒 emacs の設定書き換えるの嫌…

ArcadeRS サンプルゲームを通じて play-clj に慣れる

ArcadeRSという ゲーム制作を通じての Rust 言語を学ぼうと言うチュートリアル記事がある。 この記事はそのチュートリアルを通じて完成するゲームを play-clj で作ってみようと言う記事。 元記事と違って Clojure そのものは既にある程度学習済で、ここのタ…

cider で play-clj 触り始めました

libGDX を Clojure 上でより使い易くされた play-clj 触り始めました。 github.com まだサンプル触ってる段階だけど REPL で起動したままいじれるのは 非ゲーム分野では経験済みとは言えゲームでも可能なのが改めて新鮮。 今日は 公式チュートリアル ではフ…

cider での TDD っぽいワークフロー

ワークフロー REPL 起動(C-c M-j) ※ 1 回のみ 何か関数書く REPL 上でテスト ok なら保存・リロード(C-x C-s, C-c C-n, C-c C-k) REPL 上で実行したコードと結果を = とした is フォームにコピペし、 適当な名前を付けて保存・リロード(C-x C-s, C-c C-n, C-…

codox を使った GitHub へのもう少し手抜きな API doc 公開方法メモ

GitHub へ API doc を deploy する方法としては既に codox の HowTo としてもあるんだが、ここではもう少し手抜きな方法をメモしておく。GitHub Pages となるリポジトリは既に作っているものとする。 lein doc してできた doc フォルダを普通に git commit&p…

cider を 0.8.1 にアップデートしてみた

cider が 0.8.1 になってた のでアップデートしようとしたが割と手間取ったのでその手順をメモしておく。 今回は 0.7.0 の時と違い単なるインストール記事で使用感までは書いてない。 個人的に色々気になるのはあるけども今回は 元Changelog。 を見てもらう…

日本語キーワード

久しぶりの更新。小ネタだけど。 Clojure で日本語 Keyword は避けた方が良さそう。 :あとか:いとか単純なものだと普通に使えるんだけど アルファベットや漢字と混合したものだと関数のプロセスによっちゃ キーはあるのに値が取れない事がある。 取れなかっ…

Clojure のちょい便利マクロ

複数のシーケンスを対象に先頭からそれぞれ要素を取って処理したい時どうするか。 map が順当なんだけど渡す処理がごく簡単な場合ならまだしも ちょっと複雑になってくると少し見辛くなる。 例えばこんなの。 (map (fn [avar bvar cvar] (->> (foo-fn avar) …

Clojure で lazy-seq を生む関数についてのトラブルシューティング

Clojure で lazy-seq を生む関数と言うのは cheatsheetの Creating a Lazy Seq に書かれている関数の他に も良く使う所では map 関数なんかもそうだったりする。Programming Clojure を読んだ事があれば 何となく記憶してるかもしれない。 REPL で確かめてみ…

Clojure の名前空間とファイル名

Clojure では名前空間を切る時、通常は名前空間名と.cljを除いたファイル名を同じにするよう構成する事になっている。 また、名前空間をドットで区切るのはパス区切りと対応付けられる。 名前空間が foo.bar だったら foo\bar.clj となる。 一方、lisp での…

Clojure の SQL DSL の一つ sqlingvo なかなかイイですよ

[2014-07-22 追記] table 別名がデフォルトで AS なしに修正された事を示すリンクを追記 Clojure 界隈では、SQL DSL の選択肢が結構前からいくつか存在する。初期からある Korma や HoneySQL そして今は Clojure で JDBC ラッパーのデファクトスタンダートと…

トップレベルでの let,letfn を使った private 化

Clojure でコード書いてる時、^:private な変数や関数で 行数が増えてくるとこれってどこで使ってたっけ?と思う事が増えてきた。 原始的な検索や、タグジャンプでまあ分からん事もないんだけど 行数が増えてくるとそれすらも億劫になってくる。 良く書くパ…

codox でドキュメント出力されない ns がある件

codox、作ったツールの関数群を俯瞰するのには 十分使えるものだと思ってる。もう少しこなれてくれば提出用にしてもいいんじゃないかってくらい。 が、その場合割と致命的に困る事があり、一部 ns で何故かドキュメント出力されない事がある。 AOT コンパイ…

Clojure 界隈での高階関数がらみのグチ

外部ライブラリを色々使い出して最近ふつふつ思うのが、どーも高階関数が絡んだ時の説明がイマイ チな事がチラホラあるような。ここで言ってるのはさすがに今更高階関数そのものの説明してくれと 言ってるわけではなく、API として説明不足と言うか。個人的…

On Lisp -> Clojure へ移植: 12.1~12.3

ここでも一応書いておくが、前の 11 章はベースになる setf に該当するものが Clojure には見当たらないので章全体を飛ばしている。 また、この章のサンプル移植は most-of しかなく、殆ど無いも同然なので ここも飛ばしてもらっても構わない。 12.1 新しい…

On Lisp -> Clojure へ移植: 10.4~10.6

10.4 反復 p96 (defmacro forever [& body] `(loop [] ~@body (recur))) 図 53 単純な反復用マクロ.while, for は既出なので till のみ。 Clojure の loop には go や return はないが、条件分岐と recur を組み合わせたら マクロ定義時だけは同様の事が可…

Emacs cider を 0.7.0-SNAPSHOT へ update

cider なんだがどうやら GW 前に 0.6.0 リリースがリリースされてた模様。 そこで REPL 上で 0.6.0alpha と表示されてた cider を 0.7.0-SNAPSHOT へ更新した。 更新は el-get で Github master から remove -> install と実行し、 後 leiningen プラグイン…

On Lisp -> Clojure へ移植: 10.1~10.3

この辺りから段々と変態じみてくるw 10.1 コンテキストの生成 p90 図 47 let のマクロによる実装。 binds の奇数 index はローカル変数のシンボルなので、それを関数の仮引数として渡し、body を実行。 で、binds の偶数 index を関数の実引数として後半部で…

On Lisp -> Clojure へ移植: 9.1~9.4

9.1 評価の回数 p84 On Lisp で言う複数回の評価を起こし得るマクロが Clojure 版にあるかどうか 良く分からん。形式的に近いのとなると for-b なんだが、 (defmacro for-b [[sym start stop] & body] `(loop [~sym ~start] (when (<= ~sym ~stop) ~@body (r…