夢とガラクタの集積場

落ちこぼれ三流エンジニアである管理人の夢想=『夢』と、潰えた夢=『ガラクタ』の集積場です。

Clojure

Clojure勉強日記(その28 データ型(その2

前回はまって1回では終わりませんでしたが、続けます。前回データ型を定義して動くことが確認できたので、 今回は実際の中身を実装してみる形になりますね。まず、実際にCryptoFilterの中身を実装したコードが以下のようになりました。 src/reader/crypto.c…

Clojure勉強日記(その27 データ型(その1

徐々に抽象度・・・というか単体では動かしにくいコードが揃ってきましたが、 とりあえず続けます。前回はプロトコルを使って既存の型に新たなメソッドを追加する方法を見てきました。 次は、Clojureで新たな型を作りたくなったらどうするか?を実現する「デ…

Clojure勉強日記(その26 インタフェース/プロトコル

1.インタフェース Javaの場合前回の投稿のようなケースをどうするかというとインタフェースを切って、 実装クラスを追加することで拡張する方式を取ります。インタフェースは以下のような利点があります。 実体クラスは複数のインタフェースを実装することが…

Clojure勉強日記(その25 抽象化に向けたプログラミング

こんにちは。今回からまた話題が変わります。「抽象化」というJavaでもよくつかわれる技法がClojure独自の抽象化方式で どう表されるのか・・という内容です。 元々、Clojureはproxyとgenclassを用いて「Javaの抽象化をうまく利用できる」という方針でした。…

Clojure勉強日記(その24 SnakeGameをClojureで書いてみる(その3

こんにちは。いよいよ大詰め。 今まではコマンドライン上でしか動作しなかったゲームをGUI上で表示してみます。■snake.clj:Graphicの塗りつぶし処理 ; Fill-Points (defn fill-point [graphic pt color] (let [[x y width heignt] (point-to-screen-rect pt…

Clojure勉強日記(その23 SnakeGameをClojureで書いてみる(その2

こんにちは。では、SnakeGameの状態更新部分を進めていきます。 今回、状態が更新されるタイミングは以下の3つです。 ゲームを開始する。 ターンごとにヘビが位置を更新する。リンゴが食べられていたらヘビの長さを伸ばし、リンゴを再配置する。 ヘビの向き…

Clojure勉強日記(その22 SnakeGameをClojureで書いてみる(その1

こんにちは。今まで確認してきた状態管理のAPIを使い、「SnakeGame」を作ってみます。 と言いつつ、そもそもSnakeGameを起動するところからしてはまったのでそこから(汗まず、前提として「https://github.com/stuarthalloway/programming-clojure」からダウ…

Clojure勉強日記(その21 varを使用したスレッドローカルな状態管理

こんにちは。STMの機構を用いた状態更新が完了し、次はvarの確認に入ります。 defやdefnの呼び出しは、メタデータ:dynamicが与えられると動的なvarになるとのことです。・・・わかりませんね(汗 なので、やはりこちらも一度書いて試してみます。 ルート束縛…

Clojure勉強日記(その20 エージェントを使った非同期更新

こんにちは。前回に続いて状態更新ものです。 これまでまとめていたrefとatomは「同期的な更新」を扱っていました。 ここで言う同期的な更新とは、「関数呼び出しが完了した時点で状態の更新も完了している」ということを指します。ですが、Clojureでは非同…

Clojure勉強日記(その19 アトムを使った非協調的、同期的な更新

こんにちは。では続きに入ります。前回はrefを用いたSTMについて書いていましたが、Clojureには別の方式として「アトム」があります。違いとしては・・下記です。 複数のrefの更新はトランザクションを使って協調させなければならなかった。 アトムは単一の…

Clojure勉強日記(その18 ref とソフトウェアトランザクショナルメモリ

こんにちは。前回まででとりあえず関数型プログラミングの流儀の入口のようなものが完了し、 次は並行性、並列性、ロック・・と、今度は関数型を使うことによる具体的な利点を確認する内容です。 1.Clojureが用意する参照型 まず、初めにClojureが用意してい…

Clojure勉強日記(その17 より複雑な再帰

こんにちは。今回は以前試した再帰よりより複雑なケースを用いて再帰を試していく内容のようです。 1.相互再帰 言葉の通り、相互再帰とは2つの関数が互いを呼び合う再帰です。 AがAを呼んでそれがAを呼ぶ・・・という形ではなく、AがBを呼び、BがCを呼び、C…

Clojure勉強日記(その16 より「書かずに」すませる方法

こんにちは。とりあえず遅延シーケンスを体験したので、 次はよりClojureの機能を使って簡単に済ませる方法のようです。 何回パターンが発生する? 下記のようなベクタを考えて、 [:A :B :B :A :A :B] A → Aのようなパターンが発生する回数が何回あるかを考…

Clojure勉強日記(その15 関数型プログラミングの概念

こんにちは。シーケンスについて一段落し、ついに本筋っぽい個所に入ってきます。 関数型プログラミング=FPとして以後書きます。FPによるコードが書きやすく、読みやすく、テストしやすく、再利用しやすい理由として、 下記の理由があげられています。 …

Clojure勉強日記(その14 Clojureにおけるシーケンスの特徴とJavaオブジェクトの扱い

こんにちは。そろそろ、書籍も説明的な内容が増えてきたので単にべた書きではなく、 理解したことをまとめていく方針を取ります。 1.遅延シーケンスと無限シーケンス JavaにあってClojureにないシーケンスの一番の特徴がこの遅延シーケンスと無限シーケンス…

Clojure勉強日記(その13 3.2 シーケンスライブラリを使う

では、続きます。 前回のClojure記事にもあるように、環境がSublime Text2に移ったのでかなり快適になっています。Clojureではシーケンスに対する関数が多くありますが、それらは下記のカテゴリに分類されるとのこと。 シーケンスを生成する関数 シーケンス…

WindowsでSublime Text2からClojure REPLを使えるようにしてみる→実は使えませんでした

こんにちは。今までREPLをコマンドラインで起動して使っていましたが、 さすがに効率が悪いようになってきたため、一度エディタから直接呼べるように環境を整えます。というわけで、Sublime Text2にREPLのプラグインを導入してみます。ですが、まずSublime T…

Clojure勉強日記(その12 3.1 すべてはシーケンスである

こんにちは。連休が挟まったということで若干間があいていますが、続けます。で、この間にプログラミングClojureの第2版が発売されました。プログラミングClojure 第2版作者: Stuart Halloway and Aaron Bedra,川合史朗出版社/メーカー: オーム社発売日: 20…

Clojure勉強日記(その10 3.3 ClojureでJavaのクラスを作る(Vol_1)

ClojureのオブジェクトはJavaに対応するものがあればそのインタフェースを実装している。 Clojureのデータ構造はJavaのコレクションAPIを実装している Clojureの関数はRunnableとCallableを実装している ・・・後者は中々。このあたりやはり並列実行用の言語…

Clojure勉強日記(その9 3.2 性能の最適化

こんにちは。徐々に書けることが広がってきてはいますが、まだ4分の1。 とりあえず地道に続けます。前章で述べたJavaの呼び出しで述べた方法を使ってJavaを呼ぶのがClojureでは普通。 これで基本的には十分に高速のはずだが、さらに高速化を行うことができ…

Clojure勉強日記(その8 3.1 Javaの呼び出し

こんにちは。とりあえず構文の説明が終わり、後は実際に機能をコードを書きながら確認していく形になりそうですね。ClojureコードはJavaバイトコードに直接コンパイルされ、Javaを呼び出す際に変換が挟まれることはない。 Clojureは直接JavaのAPIを活用でき…

Clojure勉強日記(その7 2.7 メタデータ

こんにちは。ついに2章も最後まで来た形になります。 とりあえず概念が大量に出てきたのにたいして書いた量がいまいち不足しているため消化不良な感もありますが・・・ まぁ、それはその先の章でも書き続けることで対処できるでしょう。では、続きです。メ…

Clojure勉強日記(その6 2.6 forループはどこにある?

というわけで、続きです。これまで見てきたが、forループがないし、直接変更可能な変数というものも登場していない。 単に、関数とインプット、アウトプットがあるだけという非常にシンプルなIPOを示すのみとなっている。・・・というのがJava辺りから入った…

Clojure勉強日記(その5 2.5 フロー制御

なんか徐々にまともなプログラムを書くためのパーツがそろってきたように思える今日この頃です。 では、続きです。Clojureではフロー制御の方式はif、do、loop/recurでほとんど賄える。 1.ifによる分岐 Clojureのifは最初の引数を評価し、それが論理的に真で…

Clojure勉強日記(その4 2.4 var、束縛、名前空間

では、続きです。オブジェクトをdefやdefnで定義するとオブジェクトは指定した名前にバインドされる。 下記の例ではuser/fooに10がバインドされる。 user=> (def foo 10) #'user/foo user=> foo 10 user=> user/foo 10 ここで束縛される場所は「var」と呼ば…

Clojure勉強日記(その2 2.1 フォーム

こんにちは。 では、さっそく実際のコードを書いてみましょう。今回の範囲は「2.1 フォーム」です。 「実際にClojureでどうやって記述するか?」の章で、多分この辺が中途半端だったので途中からわけわからくなっていました。 そのため、地道に。 1.フォ…

Clojure勉強日記(その1 Clojure(REPL)実行環境

最近Stormのコードを読んでいるのですが、Clojureの基本文法が曖昧なために 結局深いところは読み解けないという状態に陥っている今日この頃です。というわけで、プログラミングClojureを使って 実際にClojureのコードを書いて、理解を深めることにします・…

1人、Stormソースコードを読んでみよう(No.3

こんにちは。 なんか1年以上忘れ去っていましたが、 最近StormのClojureコードを読むことが増えてきましたので、とりあえずゆるゆると再開してみます。 1.まず重要なのはClojureのコードです これはStormを扱う上でいうまでもない内容になりますね。 ・・・…

1人、Stormソースコードを読んでみよう(No.2

というわけで始まってしまった(?)この記録。まずは、ディレクトリの中身概要を確認してみます。 確認の結果下記のようになっていました。 Storm ├─bin 起動/環境構築スクリプト ├─conf Stormの設定ファイル ├─log4j Stormのログ出力設定ファイル ├─src │…

1人、Stormソースコードを読んでみよう(No.1

こんにちは。とりあえず、某所でStormの環境構築やクラスタ化については 書き進めるつもりですので、 こちらでは余り需要がなさそうなコンテンツを進めようと思います。そんなわけで、Stormソースコード読み記録を開始します!Stormの中身を理解する上で、も…