文字列と数値が混在していてつねに数値としてあつかいたいのに〜、と苛々することがよくあったので下記のような関数をでっちあげた。数値としてあつかいたいとき、無条件に使うわけである。
(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が基本構造なので、むちゃくちゃ相性がいいからなんだ。