blog/content/post/2008-10-01-00001042.md

4.9 KiB
Raw Blame History

title author date url wordtwit_post_info categories
applyの挙動 kazu634 2008-10-01 /2008/10/01/_1119/
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:4317;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}
gauche
Lisp

id:SaitoAtushi様から教えていただいたapplyについてのコメントを参考にしてやってみた:

gosh> (define (hoge . args)
(write args))
hoge
gosh> (apply hoge '(1 2 3 4))
(1 2 3 4)#<undef>
gosh> (hoge '(1 2 3 4))
((1 2 3 4))#<undef>
gosh> (define (hoge . args)
(print args))
hoge
gosh> (hoge '(1 2 3 4))
((1 2 3 4))
#<undef>
gosh> (apply hoge '(1 2 3 4))
(1 2 3 4)
#<undef>

applyを使うときと使わないときとではこんな挙動の違いがあったのですが。。。こいつは知らなかったです。。。applyを使うとどんな挙動をしているんだろうapplyはリストの要素一つ一つを手続きに渡す…はずだけど、今回のhogeはリストを返している。ちょっと実験をしてみる。

gosh> (+ '(1 2 3 4))
*** ERROR: number required, but got (1 2 3 4)
Stack Trace:
_______________________________________
gosh> (apply + '(1 2 3 4))
10

これから判断するに、内部的にはapplyは

(+ (+ (+ (+ 4) 3) 2) 1)

というような挙動をしているはず。でも、

(apply hoge '(1 2 3 4)

はリストを返す。なんかこんがらがってきたぞ。。。