龍虎氏の記事に対するコメント。
おお~・・生まれて初めてコンパイラでのプログラム実行したわ~
ああそうか、OCamlは直接触ってないのか。
Racketでもraco(Racketコンパイラ)は使ってなかったもんなぁ・・・パッケージのインストールだけ?
(もっとも、パッケージをインストールする際、コンパイルするが)
しかし書き方がちょっと・・なんで行頭に}を持ってくるのか?構造がすごく分かりにくい気がするんだよなぁ・・
試しに{}だけでも普通に包んでみる。これでもちゃんとコンパイルと実行は出来たのでケツの}}も(どうせエディタで対応してる{が発光するので)まとめたるべきやったな。別にインデントも関係なさそうなので自前で書くときにはRacket準拠の見た目になるように書いたろ。
ごめん(笑)。大爆笑してた(笑)。
そっか〜。Lispからプログラミングをはじめると波括弧の通常の置き方が「すわりが悪く」感じるかぁ(笑)。
もちろん、C言語を初めとしたこのテの構文は、通常フリースタイルなんで、どうカッコを置いてもいいです。
そうね、Pythonなんかでもブロック構造はインデントで記述するんで、なるほど、波括弧ってのは今までの経験上イマイチピンと来ないかも。
OCamlなんかでも波括弧使わなかったしね。
なるほど、C系避けてくるとそういう印象になるか(笑)。
ごめん、面白い(笑)。人間の感覚って面白いよな。
なお、RustでのFizzBuzzは次のように書いてもいいです。
![](https://blogimg.goo.ne.jp/user_image/10/15/44c1c283bd897896d625a5872edf3d7a.png)
何度か書いてるけど、Rustは「割にLispのように書ける」。結局、いっつも書いてるけどprintln!を何度も書くのはどーよ問題、ってのがあって(笑)。
このスタイルはRacketで言うとこういう事をやっている。
(for-each println (map (lambda (x)
(cond ((zero? (modulo x 15)) "FizzBuzz")
((zero? (modulo x 3)) "Fizz")
((zero? (modulo x 5)) "Buzz")
(else x))) (range 1 101)))
map以降で「FizzBuzzのデータ」を作って、それをfor-eachに渡して順次出力する。
こんなカンジでLispっぽく書けはするんで、色々と試してみるのが吉。
ちとオブジェクト指向っぽいんで、Rustではrange(1 101).map(lambda ...)...みたいに内側と外側が逆になるような記述になってるけどね。ただ、このテの表記はRubyやJavaScriptでは良く見られる書き方だ。関数を連鎖するんじゃなくって「メソッドを連鎖」する。そのまんまメソッドチェーン、と呼んだりする。見た目は異質だけど、やってる事は関数型言語っぽいんで、多分慣れるでしょう(笑)。
ただ、上記のRustコードは「型変換」でto_string()が頻出なのがイマイチなんだけど、この辺はどうしようもない。
Rustではまず、"..."と言う記述は&strって事になっててString型とまた違うんだよな。そしてラムダ式(|x| ...)で受けたxは数値となる。Rustは「強い型付け言語」なんで、if ... elseが返す型は全部一致してないとならない。結果、どうしても「面倒くさい」型変換をして全部の型を同一にしないとどうにもならなくって、ハマったりすんの。実際ハマってたし(笑)。
ちょっとその辺がね。Lispと言うよりOCamlに近くって、動的型付けに慣れてると「アレ?」って言うのが頻出するのがRustと言う言語です。