龍虎氏の記事に対するコメント。
今回もまずはRustとC言語のコードを並べてみよう。
引数は名称のあとに:で型を指定するんだな、と。i16って?なるほど
これも何度か書いてるけど、C言語の場合、
型名 変数名
と表記するんだけど、コンピュータサイエンス的には間違っている。
間違ったままC++、Javaを通じて広まってしまった。
しかし、Rustは「正しい語順に戻した」。
変数名: 型名
Pascal、Lisp(特にCLOS: Common Lisp Object System、やGaucheのオブジェクト指向)、Pythonの型付きのパラメータリストなんかは「正しい」語順になっている。
なお、Rustは低レベルレイヤーでのプログラミングを意図してるんで、整数を扱う際に何ビット幅、ってのを指定出来るようになっている。
動的型付け言語とか、あるいは、性的静的型付け言語でも「真の」高級言語ならコンパイラ辺りが判断してくれる事も人間が面倒を見なければならないようになってる。
つまり、整数の特定の「型」は上限値と下限値が厳密に決められてるわけだ。
ついつい動的型付け言語なんかに慣れてると「全部一番デカい64bit幅でエエんじゃない?」とか言う誘惑に逆らえないが(笑)、小さい数さえ使えれば済む辺りで64bit幅の整数を使うと、要は「メモリの無駄遣い」って事になっちゃうわけだな。
そしてもう一つ整数には、「符号付き」と「符号なし」の2種類がある。ここで言う「符号」ってのは+、−、の事だ。要は「符号なし」は性の正の整数しか扱えない。
んで、iはinteger(整数)のiで、uはunsigned(符号なし)のuだ(※1)。
謎の→だったけど、なるほど関数全体の返り値の型を指定すると・・慣れたら面倒でもなくなるのかなぁ
これは慣れると思う。多分。Pythonも採用してる形式だし、今後も増えるかも。
ふーん、Stringで型を指定してnew()って言うメソッドで作ると。
これがLisp/Pythonに慣れてると嫌なんだよな(笑)。new()。データ生成だけで1行を費やす(怒)。
LispやPythonだと引数を与えていきなり「使える」データ型を作っちゃうし。このnew()ってのが如何に不格好な存在なのか、とか思うわ(笑)。
ホント、許せん(※2)。
さて、ここでもRacketっぽくプログラムを書けばどうなるか、ってのを紹介しておこう。
アルゴリズム自体は原作と同じだ。
ただ、上のnew()の問題や、mutの問題がここでは解決されている。
結局、new()やmutが何故に嫌なのか、と言うと破壊的変更が前提のプログラムになってるからだ。
特に、mutに関しては何度か指摘してるけど、「イミュータブル前提の変数でmutと言う余計な記述を要する」のは、単純にペナルティなんだよ。
つまり、Rustの設計者は破壊的変更をすんな、っつってるわけだ。
よって、正解はLispのように、イテレータmapを使いながら新規にデータを生成して、直接それを返す事、だ。
※1: ダビスタ製作者の薗部さんのインタビューでの
ってのが「それ」だ。もちろん、薗部さんがC言語やRustを使ってる、って話じゃないけど(ファミコンならアセンブリだろう)、ここで言うパラメータの型はRustで言うu8になってる、と言う事だ。2進数で11111111の状態で「馬がより調教されて」1が加算されると上限値を越えて00000000に戻ってしまう。
※2: Lispで要「空のデータ新規作成」なのは、ハッシュテーブルくらいじゃないか。
ハッシュテーブル「だけ」は新規作成で1行費やす事となる。