2018年1月20日土曜日

再帰がすごいのか、listがすごいのか

 文字列と数値が混在していてつねに数値としてあつかいたいのに〜、と苛々することがよくあったので下記のような関数をでっちあげた。数値としてあつかいたいとき、無条件に使うわけである。

(defun y-num(x)
  (cond ((null x) 0)
 ((numberp x) x)
 ((stringp x) (string-to-number x))))

(y-num "123")
123

 ずっとそうやって使っていたんだけど、ふとlistも対応しよう、と思って対応してみたところ。

(defun y-num(x)
  (cond ((null x) 0)
 ((numberp x) x)
 ((stringp x) (string-to-number x))
 ((listp x)(mapcar 'y-num x))))

(y-num '("1" "2" "3"))
(1 2 3)

 あっ、と思った。これだけで入れ子のlistでもOKじゃん。

(y-num '("1" ("1" "2" "3") "2" "3"))
(1 (1 2 3) 2 3)

 再帰ってすげー、と思って。
 いやいや、そうか、と思い直した。
 Lispで再帰がよく使われるのはlistが基本構造なので、むちゃくちゃ相性がいいからなんだ。