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

69 lines
4.9 KiB
Markdown
Raw Normal View History

2019-03-31 11:00:21 +00:00
---
title: applyの挙動
author: kazu634
date: 2008-10-01
url: /2008/10/01/_1119/
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:4317;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}'
categories:
- gauche
- Lisp
---
<div class="section">
<p>
<a href="http://d.hatena.ne.jp/SaitoAtushi/" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/SaitoAtushi/', 'id:SaitoAtushi');">id:SaitoAtushi</a>様から教えていただいたapplyについてのコメントを参考にしてやってみた:
</p>
<pre class="syntax-highlight">
gosh&#62; <span class="synSpecial">(</span>define <span class="synSpecial">(</span>hoge<span class="synStatement"> . </span>args<span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">write</span> args<span class="synSpecial">))</span>
hoge
gosh&#62; <span class="synSpecial">(</span><span class="synStatement">apply</span> hoge <span class="synSpecial">'(</span>1 2 3 4<span class="synSpecial">))</span>
<span class="synSpecial">(</span><span class="synConstant">1</span> <span class="synConstant">2</span> <span class="synConstant">3</span> <span class="synConstant">4</span><span class="synSpecial">)</span>#&#60;undef&#62;
gosh&#62; <span class="synSpecial">(</span>hoge <span class="synSpecial">'(</span>1 2 3 4<span class="synSpecial">))</span>
<span class="synSpecial">((</span><span class="synConstant">1</span> <span class="synConstant">2</span> <span class="synConstant">3</span> <span class="synConstant">4</span><span class="synSpecial">))</span>#&#60;undef&#62;
gosh&#62; <span class="synSpecial">(</span>define <span class="synSpecial">(</span>hoge<span class="synStatement"> . </span>args<span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">print</span> args<span class="synSpecial">))</span>
hoge
gosh&#62; <span class="synSpecial">(</span>hoge <span class="synSpecial">'(</span>1 2 3 4<span class="synSpecial">))</span>
<span class="synSpecial">((</span><span class="synConstant">1</span> <span class="synConstant">2</span> <span class="synConstant">3</span> <span class="synConstant">4</span><span class="synSpecial">))</span>
#&#60;undef&#62;
gosh&#62; <span class="synSpecial">(</span><span class="synStatement">apply</span> hoge <span class="synSpecial">'(</span>1 2 3 4<span class="synSpecial">))</span>
<span class="synSpecial">(</span><span class="synConstant">1</span> <span class="synConstant">2</span> <span class="synConstant">3</span> <span class="synConstant">4</span><span class="synSpecial">)</span>
#&#60;undef&#62;
</pre>
<p>
applyを使うときと使わないときとではこんな挙動の違いがあったのですが。。。こいつは知らなかったです。。。applyを使うとどんな挙動をしているんだろうapplyはリストの要素一つ一つを手続きに渡す…はずだけど、今回のhogeはリストを返している。ちょっと実験をしてみる。
</p>
<pre class="syntax-highlight">
gosh&#62; <span class="synSpecial">(</span><span class="synStatement">+</span> <span class="synSpecial">'(</span>1 2 3 4<span class="synSpecial">))</span>
<span class="synStatement">***</span> ERROR: <span class="synStatement">number</span> required, but got <span class="synSpecial">(</span><span class="synConstant">1</span> <span class="synConstant">2</span> <span class="synConstant">3</span> <span class="synConstant">4</span><span class="synSpecial">)</span>
Stack Trace:
_______________________________________
gosh&#62; <span class="synSpecial">(</span><span class="synStatement">apply</span> <span class="synStatement">+</span> <span class="synSpecial">'(</span>1 2 3 4<span class="synSpecial">))</span>
<span class="synConstant">10</span>
</pre>
<p>
これから判断するに、内部的にはapplyは
</p>
<pre class="syntax-highlight">
<span class="synSpecial">(</span><span class="synStatement">+</span> <span class="synSpecial">(</span><span class="synStatement">+</span> <span class="synSpecial">(</span><span class="synStatement">+</span> <span class="synSpecial">(</span><span class="synStatement">+</span> <span class="synConstant">4</span><span class="synSpecial">)</span> <span class="synConstant">3</span><span class="synSpecial">)</span> <span class="synConstant">2</span><span class="synSpecial">)</span> <span class="synConstant">1</span><span class="synSpecial">)</span>
</pre>
<p>
というような挙動をしているはず。でも、
</p>
<pre class="syntax-highlight">
<span class="synSpecial">(</span><span class="synStatement">apply</span> hoge <span class="synSpecial">'(</span>1 2 3 4<span class="synSpecial">)</span>
</pre>
<p>
はリストを返す。なんかこんがらがってきたぞ。。。
</p>
</div>