Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

F#で遊んでみる(1)

2年ぐらい前に、戯れにOCamlの勉強をしてみた。ML系の言語は、広く使われているとは言えないもののこれが必要な人にとっては他に換えがたいもののようである。その中で、OCamlという言語はMLとしては実用的な言語として開発母体もそこそこちゃんとしていて、…

Python2.7をインストールして、ちょっとしたツールを書く。

仕事で、Python2.7しかない環境でちょっとした修正をしなくてはならなくなり、 手元にインストールする。 pyenvを使う。 今は、3.8しか入ってない。自分はPythonといえばこれしか使ったことがないRuby野郎である。 > pyenv version 3.8.5 (set by /Users/tam…

Elixirで遊んでみる(11)

13章はまだまだ続く。13.11から。全開までで、GitHubから取得したIssueのデータは、マップの形にまでなった。 今度はこれをテーブルの形に整形する。 文字列の表にしたいから、まず、各列の文字列の最長幅を知る必要がある。 そのために、データをいったん列…

Elixirで遊んでみる(10)

13章の続き。 さて、GitHubのAPIからJSONが返ってきているので、これを処理してやる必要がある。 JSONのライブラリとしてはpoisonを使うみたい。 hex.pmに行って検索し、depsの記述をコピってmix.exsに入れる。 P.156の記述を元に、Issues.GithubIssues.hand…

Elixirで遊んでみる(9)

13章はビルドツールのMixの話。最近は言語ごとにビルドツールがあるのが当たり前になった。 このタイミングで自分のMacにElixirをインストールすることにする。brew install elixirするだけ。 いろいろ依存で入るので、そこそこ時間がかかる。というかPython…

Elixirで遊んでみる(8)

12章は制御フロー。といっても、パターンマッチとガード説で制御フローの大半を作ってしまうので、Elixirでは登場頻度は低い。 ifは今までの構文と同じようにdo:を指定できる。さらにelse:も指定できる。 この構文の特徴をもう一度確認しておこう。 iex> if(…

Elixirで遊んでみる(7)

11章は文字列。 Elixirで面白いのは、シングルクォートとダブルクォートで全く違うものを表すこと。 ダブルクォートがいわゆる文字列で、シングルクォートは文字コードのリスト。内部表現は全然違う。 というか、ワイルドなことにElixirは文字列として出力可…

Elixirで遊んでみる(6)

9章は2ページしかない。Elixirには型みたいなものが2つのレベルである。 プリミティブなデータ型と、モジュールとそれが提供する関数が規定するレベルでの型だ。 あるモジュールはプリミティブなデータ型に加えてある構造を要求する。 例えば、ListもKeyword…

Elixirで遊んでみる(5)

7章は「リスト」。いわゆるconsリストについて説明している。まあ、いいでしょう。理解はしてる。使えるかはアレだけど。 8章は「マップ、キーワードリスト、セット、構造体」。盛りだくさんだ。 マップのパターンマッチの仕方は慣れる必要がありそうだ。 ie…

Elixirで遊んでみる(4)

6章は「モジュールと名前付き関数」である。 ここでやっと普通の関数定義の説明がある。 で、Rubyっぽいこんな感じだ。でも、Rubyならdoはいらない defmodule Times do def double(n) do n * 2 end end しかし、do...endはシンタックスシュガーで、do: (...)…

Elixirで遊んでみる(3)

5章は無名関数。普通の関数やってないのに、無名関数からやるという(笑) 無名関数は変数に束縛して使う。関数呼び出しの時に.がいるのがポイント iex> sum = fn (a, b) -> a + b end #Function<43.79398840/2 in :erl_eval.expr/5> iex> sum.(1, 3) 4 iex> s…

Elixirで遊んでみる(2)

本を先に進んでみよう。 2章はパターンマッチ。未だに慣れない。とりあえず=でマッチ出来る。 左側に変数があると、マッチすると束縛が起きる。 左側の変数の値をマッチに使いたい場合は^を付ける。 iex> a = 1 1 iex> [^a, b] = [2, 3] ** (MatchError) no …

Elixirで遊んでみる(1)

年末年始、「プログラミングElixir」の第2版を買ったので、ちょっと遊んでみよう プログラミング Elixir(第2版)作者:Thomas,Dave発売日: 2020/12/01メディア: 単行本 ElixirのインタラクティブシェルIExを実行する。イマドキはDockerだよねと。P4を写経する…

Re:viewを試してみたい

ちょっと事情があって、C言語講座っぽいものを書いた -> GitHub - tmbrms/c-lang-world けっこうな量書いたんだけど、これは書籍で言うと何ページぐらいなんだろうということが知りたいし、あわよくば技術書典とかに出したいと思い、技術書向け製本システム…

MacへSubversionを入れたい

2020年にもなって、svnを使っているプロジェクトに関わることになった。まあ、だからどうと言うことはない。 どうと言うことはないんだけども、Macでのsvnには苦い思い出がある。 かなり前のことだけど、WindowsなどとUnicodeの正規化の扱いが違い、濁点が含…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(17)

元のJavaのテストではfiveBucksはMoneyではなくExpressionだった。ここから派生する汎用化を15章では行っている。例えば、plusメソッドがExpressionを受け付けるようにしたり、Expressionにplusメソッドを追加したりだ。これは結局、何がしたいのかというと…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(16)

15章。ついに「5ドル+10フラン」のテストを書くぞと、ケント・ベック先生は意気込んでいる。こんなテストを書いている。 @Test public void testMixedAddition() { Expression fiveBucks = Money.dollar(5); Expression tenFrancs = Money.franc(10); Bank b…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(15)

さて、もうちょっとコードをキレイにしてから先に進みたい。 今、通貨は文字列で定義されている。Java版だとStringだ。私のRustのコードだと、ここが&'static strになっている。 Rustの&strはヒープに確保された領域に書き込まれたUTF-8シーケンスに対する参…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(14)

さて、ここでちょっと立ち止まって、コードを眺めてみよう。 コード全体は今でも100行ちょっとに過ぎない。 #[derive(Debug, Clone)] pub struct Money { amount: f64, currency: &'static str, } impl Money { pub fn dollar(f: f64) -> Money { Money { am…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(13)

14章に入る。いよいよ通貨の変更を実装する。2フランを1ドルに換算したい。 本で示されたテストはこうだ。 @Test public void testReduceMoneyDifferentCurrency() { Bank bank = new Bank(); bank.addRate("CHF", "USD", 2); Money result = bank.reduce(Mo…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(12)

13章「実装を導くテスト」に入る。 最終的にどんなコードを目指しているのか見失ったままストーリーが続いているのだが (いや、一度、この部分は読んでいるんだけど・・・これが写経の効果だな)、 とりあえず、著者のインサイトに従っていくことにする。 さ…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(11)

どうやらほとんど11章まで終わっていたみたいなので、12章に入る。 やりたいことはドルとフランの間で透過的に演算が出来ることだ。 「$5 + 10 CHF = $10 (レートが2:1の場合)」みたいなことがしたい。 ただし、まずやるべきは同じ通貨同士の足し算だ。 とい…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(10)

9章に入る。いよいよ、通貨の導入だ。 その前に、Dollar構造体とFranc構造体の統一を片付けてしまおう。 9章の展開とは違うんだけど、とりあえず、以下の様なテストが通ることを目標にする。 #[cfg(test)] mod tests { use super::*; #[test] fn test_multip…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(9)

第8章に入る。 この辺りから、本のコードと自分のコードの差が大きくなって、 本の戦略がそのまま使えない感じになってきた。ちょっと試行錯誤しながら進めたい。 まず、本の方ではtimesメソッドがDollarとFrancの両方にあるので、それをまとめたいと言って…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(8)

7章に入る。 ドルとフランは比較できるのだろうかという疑問をテストに書いてみるところから始まる。 この本のコードでは、equalsメソッドはObjectを受けているので、ドルとフランは区別なく 扱われ、スイス経済に大打撃を与えている。 一方、私のRustの実装…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(7)

5章「原則をあえて破るとき」に入る。 この章は、クソコードを作って終わり。 ただし、これをどうにかしないうちは家に帰らないことも誓う。 とりあえず、今まで作ったドルとは別にフランを作る。それも単なるコピペで作る。 フラン・・・そんな通貨単位はも…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(6)

4章「意図を語るテスト」に入っていこう。 amountという内部構造がインターフェースとして外に出ているのは 見づらいし良くないよねということでリファクタリングしている。 もっともだ。 そもそも、こちらにはコンストラクタすらないので、このタイミングで…

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(5)

3章「三角測量」に入る。 DollarをValue Objectにしたいと言い出す。等値であることをチェックできるようにするのだと。 Value Objectというパターンに馴染みはないんだけど、 オブジェクトを値として扱うことにはいろいろな難しさがあることは知っている。 …

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(4)

2章「明白な実装」に入る。 仕様が変わった。timesメソッドはDollarを返す様になった。 あ、今、私のtypoも見つかった。DollarじゃなくてDollerになってる・・・。 ともあれ、仕様変更の結果、テストはこうなった。 #[test] fn test_multiplication() { let …

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(3)

いよいよ「テスト駆動開発」に入っていこう。 まずは、P4の最初のテストだ。おもむろに存在しないDollerクラスをnewして、 ありもしないtimesメソッドやamountフィールドを参照している。テストファーストなのだ。 ・・・Rustでデータ型を表現するのはどうす…