blog/content/post/2010-11-13-gaucheでスクリプトのあるデ...

61 lines
2.8 KiB
Markdown

---
title: Gaucheでスクリプトのあるディレクトリを取得する — (2)
author: kazu634
date: 2010-11-13
url: /2010/11/13/_1618/
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:5377;}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/sirocco634/20101103#1288792219" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/sirocco634/20101103#1288792219', '前回');" target="_blank">前回</a>の記事に対して、shiroさんからの以下のコメントを頂きました:
</p>
<blockquote>
<p>
(car argv) に渡ってくるのはコマンドラインに渡されたものですよ (ただし先頭の &#8216;~&#8217; はシェルによって展開済み)。したがって
</p>
<p>
gosh ../foo.scm
</p>
<p>
などと起動されれば &#8220;../foo.scm&#8221; が来ます。
</p>
<p>
要は、スクリプトファイルの位置は、それが絶対パスであればそののも、それが相対パスであればカレントディレクトリからの相対パスになってるというだけなので、単純にスクリプトファイル名を絶対パス化してからdirnameを取ってやればいいんじゃないでしょうか。
</p>
</blockquote>
<p>
なるほど!!というわけで、以下の関数を作成してみました。
</p>
<pre class="syntax-highlight">
<span class="synComment">;;; 引数としてスクリプトファイル名(つまり(car *argv*)です)</span>
<span class="synComment">;;; を受け取り、スクリプトファイルが存在するディレクトリを</span>
<span class="synComment">;;; 返す関数</span>
<span class="synSpecial">(</span>define <span class="synSpecial">(</span>script-directory script-name<span class="synSpecial">)</span>
<span class="synSpecial">(</span>receive <span class="synSpecial">(</span>path<span class="synStatement"> . rest</span><span class="synSpecial">)</span>
<span class="synSpecial">(</span>decompose-path script-name<span class="synSpecial">)</span>
<span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span>absolute-path? path<span class="synSpecial">)</span>
path
<span class="synSpecial">(</span>string-append <span class="synSpecial">(</span>current-directory<span class="synSpecial">)</span>
<span class="synConstant">&#34;/&#34;</span>
path<span class="synSpecial">))))</span>
</pre>
<p>
これで上手く動いているようです。
</p>
<p>
Shiroさん、ありがとうございました。
</p>
</div>