SICP Exercise 1.4

Structure and Interpretation of Computer Programs練習問題1.4のコードを見て、一瞬とまどいました。

(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))

bが0より大きければ加算、それ以外は減算が戻ってきて、それがaとbの計算に用いられます。単に条件分岐の中で関数を選んでいるだけなのですが、CやJavaのような“普通”のプログラミング言語ではあまり見かけない書き方です。

僕が常用している言語はMatlabでは、さすがにこれは書けないかと思いましたが、ちょっとやってみました。

function y = a_plus_abs_b(a, b)
if b > 0
  fhandle = @plus;
else
  fhandle = @minus;
end
y = feval(fhandle, a, b);

なんか違うけど、本質は捉えられて・・・いる? fhandleという変数に関数ハンドルを代入しなくて済めばいいのですが。あとはC言語のような三項演算子(?:)が使えるともうすこしシンプルに書けそう。