Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-11-16

car/cdrの別表記を考えてみた

| 21:05 | car/cdrの別表記を考えてみた - わだばLisperになる を含むブックマーク はてなブックマーク - car/cdrの別表記を考えてみた - わだばLisperになる

何万回目の再発明なのかは分かりませんが、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>)