ゴルフ的観点からプログラミング言語を比べて思ったことを並べてみた。
比較対象が偏っているのは仕様です。しょうがないことなのです。
C
PostScript
D
- 私が解くと、つい C を翻訳した感じのコードになってしまう。Ruby や Javascript に慣れている人だとどうなるのだろう。
- C に比べて型を真面目に扱わなければならない。
- 条件分岐演算子 ?: で真の場合と偽の場合の型を合わせなければならないとか。
- 関数定義も長くなってしまう。その結果 anarchy golf - Tak z _FIXED_ のような事が起こる。
- C より、ポインタが使いにくい。int[10]a;int*p; の時 p=a; とできない。p=&*a; などとなる。
- まあ、anarchy golf - ieee754 のように、C の関数という抜け道もありますが。
- 標準入力から読むだけでも import が要るのが不利。
- 配列の演算や文字列の連結が多用されると C に勝つ可能性がある。
- import 無しで printf を使えるバージョンでは、多倍長整数の演算にバグがあるとか、ぬか喜びだ。
Erlang
- module と export のせいで、単純な問題で非常に不利。
- ループはなるべくリスト内包表記で。
- 比較演算子が数値でも配列でも atom でも比較できるというのは結構重要。
- 条件分岐を if でやるか、case でやるか、短絡演算子(andalso, orelse)でやるか、関数のパターンマッチでやるか迷いどころ。
- if は条件部分の制限のせいで使いづらい印象がある。
- ゴルフだとプロセス使わないんだよな……。
- クロージャもなかなか使いどころが見つからない。
- なんでリストの差分演算子 -- が 右結合なの?
- 整数の除算演算子が div(/ で割ると浮動小数点数になる)で剰余演算子が rem。Ocaml や Fortran なら N mod M=0 を N/M*M=N とするテクニックがあるのだけど、Erlang では意味がない。
- 出力する分にはフォーマット出力 io:format はいろいろできる。
- でも、フォーマット入力 io:fread で浮動小数点数を読もうとして、io:fread('',"~f") とすると、整数が来たときにエラーになるのはいかがなものか。
- 今回挙げた中で、まともに多倍長整数が扱えるのはこれだけ。でも冪乗演算子が無い。
Forth
- 空白が多くなるのがつらい。
- ループが C と同じくらい単純なのしかない。
- ポインタを数値として扱えたり、読んだ文字列のバイト列を数値として扱えたりと C 並に低レベルな真似ができる。
- フォーマット入出力がないのがやっぱり困る。
- 配列をバリバリ使う系の問題を解いてないので、その辺りはよくわからない。