9章全部。
整数の四則演算ができる計算機のパーサを作成を通して、手続の抽象化とエラーの扱いを学ぶ。
サンプルコードを打ち込みながら読むスタイルで進めた。
サンプルコードの誤記が多く、正誤表だけだと辛い。
また、一部サンプルコードの掲載が省かれている。
(省く旨は、P383にサラッと書かれている。。。)
なので、githubからサンプルコードを落として参考にした方が良い。
おぼえがき
- パーサの紹介
nom
... マクロベース。多機能かつ非常に高速とのことcombine
... 関数ベースpest
... PEGベース
Option::ok_or()
は、Option型からResult型へ変換するResult::and_then()
は、Result型からResult型を返す関数につなげる- Rustのエラーを扱うほとんどの関数がResult型を返すので、
and_then
で続けてプログラムを書ける - Result以外にも、Optionや外部ライブラリにも
and_then
は定義されているものが多いらしい
- Rustのエラーを扱うほとんどの関数がResult型を返すので、
- match式のelseケースは適当な変数名を指定すればelseになる、かつその変数に束縛する
- Errorトレイトは過渡期っぽい。Rust1.33からは下記が推奨の模様。
- descriptionよりDisplayトレイトを使う
- causeは使わずに、sourceを使う
- Errorトレイトは、Displayを継承している
課題
- C言語なら構造体そのまま渡して関数内部でアクセスするような場面
- Rustだと、渡す構造体自体をミュータブルかイミュータブルで渡すことになる
- その為、各メンバをそれぞれ引数に渡す方が安全ではあるが、ちょっと面倒
- 別の方法としてCellと内部ミュータビリティを導入する方法があるらしい
- マクロ定義方法
気になったこと
正誤表にない誤記もいくつかあった。
- P393 compile_inner関数内の誤記
- 誤:
match *expr {
- 正:
match expr.value {
- 誤:
- P393 compile_uniop関数内の誤記
- 1箇所目
- 誤:
use self::UniOp::*;
- 正:
use self::UniOpKind::*;
- 誤:
- 2箇所目
- 誤:
match *op {
- 正:
match op.value {
- 誤:
- 1箇所目
- P393 compile_binop関数内の誤記
- 誤:
match *op {
- 正:
match op.value {
- 誤:
- P393
ref
キーワードの説明って本書内にあったっけ?
- 作者: κeen,河野達也,小松礼人
- 出版社/メーカー: 技術評論社
- 発売日: 2019/05/08
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る