car/cdrの別表記を考えてみた — #:g1

Posted 2010-11-16 12:05:00 GMT

何万回目の再発明なのかは分かりませんが、carとcdrの別表記がふと浮びました。
carやcdrというより、どちらかというと、firstや、secondに由来する考えだと思いますが、carを、

(i '(1 2 3 4 5))
;=> 1
と書いたら楽なんじゃないかと。
それで、cdrは、
(ii> '(1 2 3 4))
;=> (2 3 4)
という風、
(caaar (cddr '(1 2 ((3 4) 5))))
;=> 3
のようなものも、元の関数名が短かいので
(i (i (i (iii> '(1 2 ((3 4) 5))))))
;=> 3
そんなに膨れません。
(i@i@i@iii> '(1 2 ((3 4) 5)))
;=> 3
みたいに合体して書けても良いかなと思います。
まあ、これは、パターンマッチとか
(destructuring-bind (a b ((c d) e))
                    '(1 2 ((3 4) 5))
  c)
;=> 3
みたいに書くと思いますが…

自分は、carやcdrの組み合わせは、精々caddr、cddr位までしか使わない感じです。
最初の3つ位までが楽に書ければ、それで良いのかなあとも思います。

(letS* ((i (Erange 1 10))
        (name (intern (format nil "~@R" i))))
  (Rlist (eval `(defun ,name (list) (nth ,(1- i) list)))))
;≡ (loop :for i :from 1 :to 10
;         :for name := (intern (format nil "~@R" i))
;         :collect (eval `(defun ,name (list) (nth ,(1- i) list))))

;=> (I II III IV V VI VII VIII IX X)

(letS* ((i (Erange 2 11)) (name (intern (format nil "~@R>" i)))) (Rlist (eval `(defun ,name (list) (nthcdr ,(1- i) list))))) ;=> (II> III> IV> V> VI> VII> VIII> IX> X> XI>)


comments powered by Disqus