nth
- ref:神様なんて信じない僕らのために - 僕も生暖かく見守っているのですが
- ref:ときどきの雑記帖 リターンズ - 生暖かく見守っているのですが
- ref:MSN相談箱 LISPのプログラミングについて
実はこういう問題は仕様をどこまで詰められるか、という試験として使えるかもしれない、と思った。
例えば、単に(zero-origin で)リスト l の n 番目の要素を返す関数と、言われても以下の場合の挙動が曖昧だ。
- n < 0 の場合
- n >= length(l) の場合
もしくは、l がリストじゃない場合も考えないといけないかもしれない。
ちなみに Emacs Lisp の nth は
- n < 0 の場合 (car l) を返す
- n >= length(l) の場合 nil を返す
で、Common Lisp の nth は
- n < 0 の場合エラー
- n >= length(l) の場合 nil を返す
と挙動が違うようだ。
さて、以下、Common Lisp と Scheme での自分の回答例。上記のどちらの定義とも異なる。
(defun my-nth (n l) (if (consp l) (cond ((< n 0) nil) ((zerop n) (car l)) (t (my-nth (1- n) (cdr l)))) nil))
(define (my-nth n l) (if (pair? l) (cond ((zero? n) (car l)) ((negative? n) ()) (#t (my-nth (- n 1) (cdr l)))) ()))
しかし、Scheme て関数名が Common Lisp と結構違ってて戸惑うなぁ。