前回の記事に対して、shiroさんからの以下のコメントを頂きました:

(car argv) に渡ってくるのはコマンドラインに渡されたものですよ (ただし先頭の ‘~’ はシェルによって展開済み)。したがって

gosh ../foo.scm

などと起動されれば “../foo.scm” が来ます。

要は、スクリプトファイルの位置は、それが絶対パスであればそののも、それが相対パスであればカレントディレクトリからの相対パスになってるというだけなので、単純にスクリプトファイル名を絶対パス化してからdirnameを取ってやればいいんじゃないでしょうか。

なるほど!!というわけで、以下の関数を作成してみました。

;;; 引数としてスクリプトファイル名(つまり(car *argv*)です)
;;; を受け取り、スクリプトファイルが存在するディレクトリを
;;; 返す関数
(define (script-directory script-name)
(receive (path . rest)
(decompose-path script-name)
(if (absolute-path? path)
path
(string-append (current-directory)
"/"
path))))

これで上手く動いているようです。

Shiroさん、ありがとうございました。