--- title: applyの使い方がわかったかもしれない! author: kazu634 date: 2008-10-02 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4321;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche - Lisp ---

id:SaitoAtsushiさんとShiroさんに教えていただいて、なんとなくわかった瞬間がきました!とりあえずその全過程をご覧ください。

gosh> (cons 1 2)
(1 . 2)
gosh> (apply cons '(1 2))
(1 . 2)
gosh> (define p '(a b c))
p
gosh> (apply car (list p))
a
gosh> (car p)
a
gosh> (car (list p))
(a b c)
gosh> (apply cdr (list p))
(b c)

ここら辺の段階ではまだよくわかっていない。。。

gosh> (apply list-ref (list p ))
a
gosh> (list-ref p )
a
gosh> (apply list-ref (list p 1))
b
gosh> (list-ref p 1)
b
gosh> (apply list-ref (list p 2))
c
gosh> (list-ref p 2)
c
gosh> (apply length (list p))
3
gosh> (length p)
3
gosh> (apply list-ref '(1))
*** ERROR: wrong number of arguments for #<subr list-ref> (required 2, got 1)
Stack Trace:
_______________________________________
gosh> (list p 2)
((a b c) 2)

ここら辺でもまだ事の重要性に気づいていなかった。。。

gosh> (list-ref p 1)
b
gosh> (list p )
((a b c) )

もしや…applyって「一番外側の()を外して手続きに引数として渡している」んじゃあ…そうじゃないと、

gosh> (apply list-ref (list p 2))
c

とかになる理由が理解できない。これは結局

(list-ref '(a b c) )

となっているはず。そうじゃなければ、こんな挙動になるはずがない。。。

Shiro様、ありがとうございました(__)理解できました。