92 lines
5.4 KiB
Markdown
92 lines
5.4 KiB
Markdown
---
|
|
title: ソフト開発の過去問で出てきた再帰をGaucheで書く
|
|
author: kazu634
|
|
date: 2008-09-06
|
|
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:4259;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}'
|
|
categories:
|
|
- つれづれ
|
|
|
|
---
|
|
<div class="section">
|
|
<p>
|
|
ソフトウェア開発者試験ででてきた再帰を使った関数をGaucheで書いてみた。元の関数をCで書くとこんな感じになる:
|
|
</p>
|
|
|
|
<pre class="syntax-highlight">
|
|
<span class="synComment">/* ======================= */</span>
|
|
<span class="synComment">/* === Include library === */</span>
|
|
<span class="synComment">/* ======================= */</span>
|
|
<span class="synPreProc">#include </span><span class="synConstant"><stdio.h></span>
|
|
<span class="synComment">/* ==================== */</span>
|
|
<span class="synComment">/* === Main Routine === */</span>
|
|
<span class="synComment">/* ==================== */</span>
|
|
<span class="synType">void</span> prnt_digit(<span class="synType">int</span> n)
|
|
{
|
|
<span class="synStatement">if</span> (<span class="synConstant"></span> == n){
|
|
<span class="synStatement">return</span>;
|
|
}
|
|
printf(<span class="synConstant">"</span><span class="synSpecial">%d</span><span class="synConstant">"</span>, n);
|
|
prnt_digit(n - <span class="synConstant">1</span>);
|
|
printf(<span class="synConstant">"</span><span class="synSpecial">%d</span><span class="synConstant">"</span>, n);
|
|
}
|
|
<span class="synType">int</span> main(<span class="synType">int</span> argc, <span class="synType">char</span> *argv[])
|
|
{
|
|
prnt_digit(<span class="synConstant">5</span>);
|
|
printf(<span class="synConstant">"</span><span class="synSpecial">\n</span><span class="synConstant">"</span>);
|
|
<span class="synStatement">return</span> <span class="synConstant"></span>;
|
|
}
|
|
</pre>
|
|
|
|
<p>
|
|
これをgaucheで書いてみる:
|
|
</p>
|
|
|
|
<pre class="syntax-highlight">
|
|
<span class="synComment">;; lambdaを使わないバージョン</span>
|
|
<span class="synSpecial">(</span>define <span class="synSpecial">(</span>proc n<span class="synSpecial">)</span>
|
|
<span class="synSpecial">(</span>define <span class="synSpecial">(</span>tmp_proc temp<span class="synSpecial">)</span>
|
|
<span class="synSpecial">(</span><span class="synStatement">print</span> n<span class="synSpecial">)</span>
|
|
<span class="synSpecial">(</span>proc <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">))</span>
|
|
<span class="synSpecial">(</span><span class="synStatement">print</span> n<span class="synSpecial">))</span>
|
|
<span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">=</span> n <span class="synConstant"></span><span class="synSpecial">)</span>
|
|
n
|
|
<span class="synSpecial">(</span>tmp_proc <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">))))</span>
|
|
<span class="synComment">;; がんばってlambda使ってみたバージョン</span>
|
|
<span class="synSpecial">(</span>define <span class="synSpecial">(</span>proc_1 n<span class="synSpecial">)</span>
|
|
<span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">=</span> n <span class="synConstant"></span><span class="synSpecial">)</span>
|
|
n
|
|
<span class="synSpecial">((</span><span class="synStatement">lambda</span> <span class="synSpecial">(</span>temp<span class="synSpecial">)</span>
|
|
<span class="synSpecial">(</span><span class="synStatement">print</span> n<span class="synSpecial">)</span>
|
|
<span class="synSpecial">(</span>proc_1 <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">))</span>
|
|
<span class="synSpecial">(</span><span class="synStatement">print</span> n<span class="synSpecial">))</span>
|
|
<span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">))))</span>
|
|
</pre>
|
|
|
|
<p>
|
|
lambdaは手続きを返すんだから「(」を二重に重ねないと引数をlambdaの無名関数に渡すことができないわけですね。なるほど。
|
|
</p>
|
|
|
|
<p>
|
|
追記:
|
|
</p>
|
|
|
|
<p>
|
|
condは暗黙でbeginが省略されていると解釈される。ifはそうじゃない。だから今回の場合は
|
|
</p>
|
|
|
|
<pre class="syntax-highlight">
|
|
<span class="synSpecial">(</span>define <span class="synSpecial">(</span>proc_2 n<span class="synSpecial">)</span>
|
|
<span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">=</span> n <span class="synConstant"></span><span class="synSpecial">)</span>
|
|
n
|
|
<span class="synSpecial">(</span>begin
|
|
<span class="synSpecial">(</span><span class="synStatement">print</span> n<span class="synSpecial">)</span>
|
|
<span class="synSpecial">(</span>proc_1 <span class="synSpecial">(</span><span class="synStatement">-</span> n <span class="synConstant">1</span><span class="synSpecial">))</span>
|
|
<span class="synSpecial">(</span><span class="synStatement">print</span> n<span class="synSpecial">))))</span>
|
|
</pre>
|
|
|
|
<p>
|
|
こうでもいいわけか。
|
|
</p>
|
|
</div>
|