名前の周縁

なるほど,Haskell の foldl, foldr は,Common Lisp だと reduce で統一されていて,その代わり右からと左からの選択は optional arguments で行うのか.

畳み込み関数はLispの方が好きかな。

オプショナル引数で動作と初期値を指定できる。

CL-USER > (reduce #'-
                  (loop for x from 1 to 5 collect x)
                  :initial-value 0)
-15

CL-USER > (reduce #'-
                  '(1 2 3 4 5)
                  :from-end t)
3

わかりやすい例は

CL-USER > (reduce #'list '(1 2 3)
                  :initial-value 0)
(((0 1) 2) 3)

CL-USER > (reduce #'list '(1 2 3)
                  :initial-value 0
                  :from-end t)
(1 (2 (3 0)))

んで,上の部分を読んでいてやっと気がついた.つまりあれだ.CUI コマンドのパラメータ (というかオプション)って optional arguments とか名前付き引数とかその辺だ.まったくもって気付くの遅すぎ.

PowerShell と名前付き引数

見直してみると『PowerShell で LINQ - NyaRuRuの日記』で自分でも似たようなことをやっていた.以下の xrepeat, xselect, xtakewhile は LINQ 風の自作コマンド.

# xrepeat はデフォルトでパイプライン完了時に Dispose を呼ぶ
xrepeat {New-Object IO.StreamReader("z:\test.txt")} |
xselect { $_.ReadLine() } |
xtakewhile { $_ -ne $null }
# xrepeat に -suppressdispose を付けると Dispose 呼び出しを抑制する
xrepeat {New-Object IO.StreamReader("z:\test.txt")} -suppressdispose |
xselect { $_.ReadLine() } |
xtakewhile { $_ -ne $null }

Random thoughts

  • 例えば,cut という単一のコマンドは,「何かをカットする」という概念をシェアしつつ,オプションによって振る舞いを変えている.
  • test というファイル名は危険
  • ルール clean が定義されていれば,いつでもどこでも make clean.
  • 困ったら --help を付けてみれば使い方ぐらい何か分かる
  • configure という名前なら多分 configure.多態的 configure.
    • そのオプション補完ぐらいやってみせるのが zsh
  • 拡張子は緩い型.
  • wget のオプションの数を数えてみたら少なくとも 40 個以上あった
  • キーワード
    • いわゆるプログラミング言語の世界
      • 可変長引数
      • デフォルト引数
      • オプショナル引数
      • 名前付き引数
      • 関数オーバーロード
      • 型推論
      • () 演算子のオーバーロード
      • 予約名
      • 典型的な名前
      • 名前空間
      • 名前の解決
      • argv/argc
      • JavaScript の arguments オブジェクト
      • シェルスクリプトの shift コマンドとか $* とか
      • 名前の補完
      • Polymorphism
    • CUI な世界
      • コマンドオプション
      • 位置による引数の意味の変化
      • パス解決
      • エイリアス
      • 予約名
      • 典型的な名前
      • 名前の補完

適当に並べてみたが,これらのいくつかを組み合わせるだけで話のネタにはなりそうだ.まったくシンタックスは幅が広いね.奥が深いかどうかはどうだろね.