2013年2月18日月曜日

Scheme で car, cdr の組み合わせ

1. c ではじまり r で終わる関数

cons 関数によりペアが作られる。ペアの第1要素を得る関数は car 。第2要素を得る関数は cdr 。

連続して car, cdr をペアに適用するため関数が用意されている。関数名は `c’ ではじまり `r’ で終わる。

SnapCrab_NoName_2013-2-18_3-0-13_No-00

cr の間に入れる文字は `a’ または `d’ 。それぞれ car, cdr に対応している。

Structure and Interpretation of Computer Programs によると、

9 Since nested applications of car and cdr are cumbersome to write, Lisp dialects provide abbreviations for them -- for instance,

The names of all such procedures start with c and end with r. Each a between them stands for a car operation and each d for a cdr operation, to be applied in the same order in which they appear in the name. The names car and cdr persist because simple combinations like cadr are pronounceable.

11.9 Pairs and lists

(caar pair)‌‌procedure

(cadr pair)‌‌procedure

[r6rs-Z-G-D-1.gif]

(cdddar pair)‌‌procedure

(cddddr pair)‌‌procedure

These procedures are compositions of car and cdr, where for example caddr could be defined by

(define caddr (lambda (x) (car (cdr (cdr x))))).

CAR and CDR - Wikipedia > Continued acceptance

car and cdr have the advantage that short compositions of the functions can be given short and more or less pronounceable names of the same form.

 

2. c と r の間にある a, d は適用する順を表す

例えば、

(define xs '(1 (20 21 22) 3 4 5))
(display (caadr xs))    ; 20

c と r の間にある文字列 `aad’ を見て、順に cdr, car, car を適用する。

SnapCrab_NoName_2013-2-18_3-24-32_No-00

c と r の間にある文字列が `dad’ の場合は、cdr, car, cdr と適用する。

(display (cdadr xs))    ; (21 22)

 

3. Racket に用意されている関数

Racket には car, cdr を 4つまで合成した関数が用意されている。

3.9 Pairs and Lists > 3.9.6 Pair Accessor Shorthands によると、

2つの組み合わせ。

3つの組み合わせ。

4つの組み合わせ。