shとLisp

/bin/sh スクリプトをちょくちょく書いていてふと気づいた、shのすごいところ。というか、Lispとの共通点。

  • 式と記号を区別しない
  • ラムダが使える(!!)

つまり、Lispの対話環境で

> (define boo '(+ 1 1))
boo
> boo
(+ 1 1)
> (eval boo)
2
> (+ 1 (eval boo))
3
> (define foo (lambda (s1 s2) (+ 1 s1 s2)))
foo
> (foo 1 2)
4

とするのは、shで

% boo='expr 1 + 1'
% echo $boo
expr 1 + 1
% $boo
2
% expr 1 + `$boo`
3
% foo='expr 1 + $1 + $2'
% sh -c "$foo" -r 1 2
4

とできるんですわ。

shはある意味、最強のメタプログラミング言語(環境)かもしれんなぁ。