blog/content/post/2008/08/30/2008-08-30-00001014.md

120 lines
6.1 KiB
Markdown
Raw Normal View History

2019-03-31 11:00:21 +00:00
---
title: Lispの引数についてid:SaitoAtsushiさんにコメントいただいた
author: kazu634
date: 2008-08-29
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:4243;}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/SaitoAtsushi/" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/SaitoAtsushi/', 'id:SaitoAtsushi');">id:SaitoAtsushi</a>さんのおかげで、とりあえずこの部分については理解できた(ありがとうございました><a href="http://d.hatena.ne.jp/SaitoAtsushi/" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/SaitoAtsushi/', 'id:SaitoAtsushi');">id:SaitoAtsushi</a>)。
</p>
<blockquote title="武蔵の日記" cite="http://d.hatena.ne.jp/sirocco634/comment?date=20080828#c">
<p>
仮引数を括弧で囲んで並べた場合、その仮引数の個数分の引数を受けとることになります。 もちろん仮引数の個数を越えて値を渡そうとすればエラーになります。
</p>
<p>
<span class="footnote"><a href="/sirocco634/#f1" name="fn1" title="lambda (a) (write a">*1</a></span> 1)
</p>
<p>
ですが、括弧で囲んでいない場合には受け取った引数がリストになってひとつの変数に入ります。
</p>
<p>
<span class="footnote"><a href="/sirocco634/#f2" name="fn2" title="lambda a (write a">*2</a></span> 1 2 3)
</p>
<p>
リストになってひとつの変数に収まるので引数の数は不定です。 いくつ渡してもいいわけです。
</p>
<p>
<span class="footnote"><a href="/sirocco634/#f3" name="fn3" title="lambda a (write a">*3</a></span> 1 2 3)
</p>
<p>
<span class="footnote"><a href="/sirocco634/#f4" name="fn4" title="lambda a (write a">*4</a></span> 1 2 3 4)
</p>
<p>
<span class="footnote"><a href="/sirocco634/#f5" name="fn5" title="lambda a (write a">*5</a></span> 1 2 3 4 5)
</p>
<p>
<cite><a href="http://d.hatena.ne.jp/sirocco634/comment?date=20080828#c" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/sirocco634/comment?date=20080828#c', '武蔵の日記');" target="_blank">武蔵の日記</a></cite>
</p>
</blockquote>
<p>
次なる問題は
</p>
<pre class="syntax-highlight">
<span class="synComment">;; これはオリジナル</span>
<span class="synSpecial">(</span>define <span class="synSpecial">(</span>make_logger_1 func<span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">lambda</span> args
<span class="synSpecial">(</span><span class="synStatement">print</span> <span class="synConstant">&#34;args=&#34;</span> args<span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">apply</span> func args<span class="synSpecial">)))</span>
<span class="synComment">;; これもオリジナル</span>
<span class="synSpecial">(</span>define my_append_log <span class="synSpecial">(</span>make_logger_1 <span class="synStatement">append</span><span class="synSpecial">))</span>
<span class="synComment">;; 検証用</span>
<span class="synSpecial">(</span>define make_logger_2
<span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>func<span class="synStatement"> . </span>args<span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">print</span> <span class="synConstant">&#34;args=&#34;</span> args<span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">apply</span> func args<span class="synSpecial">)))</span>
<span class="synComment">;; これだと引数が足りないと怒られる</span>
<span class="synSpecial">(</span>define my_append_log2
<span class="synSpecial">(</span>make_logger_2 <span class="synStatement">apply</span><span class="synSpecial">))</span>
<span class="synComment">;; 自分なりにmy_append_logをlambdaで書いてみた。</span>
<span class="synComment">;; でも引数は一つと怒られる</span>
<span class="synSpecial">(</span>define my_append_log_2
<span class="synSpecial">(</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>func<span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">lambda</span> args
<span class="synSpecial">(</span><span class="synStatement">print</span> <span class="synConstant">&#34;args=&#34;</span> args<span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">apply</span> func args<span class="synSpecial">))))</span>
</pre>
<p>
ここでやっぱり疑問が。
</p>
<ul>
<li>
make_logger_1とmake_logger_2は何が違うのかmake_logger_1は手続きを使う側からすると、引数は一つだけになる。make_logger_2は手続きを使う側からすると、「手続きと引数リスト引数の数は不定」を引数として受け取る。
</li>
</ul>
<p>
なんとなく、外側からの見え方の違いとmy_append_logの定義をするときのように、「定義するときは第一引数だけを指定したいんだけど、定義する手続き自身(my_append_log)は不定個の引数を受け取らせたい」ときの書き方なのかなでも、それだとmy_append_log2でなんでだめなのかしら
</p>
</div>
<div class="footnote">
<p class="footnote">
<a href="/sirocco634/#fn1" name="f1">*1</a>lambda (a) (write a
</p>
<p class="footnote">
<a href="/sirocco634/#fn2" name="f2">*2</a>lambda a (write a
</p>
<p class="footnote">
<a href="/sirocco634/#fn3" name="f3">*3</a>lambda a (write a
</p>
<p class="footnote">
<a href="/sirocco634/#fn4" name="f4">*4</a>lambda a (write a
</p>
<p class="footnote">
<a href="/sirocco634/#fn5" name="f5">*5</a>lambda a (write a
</p>
</div>