前田です。

MacRubyのスレッドを見ていて思い出したのですが、前からEmacsLisp
みたいにexpand_pathでデフォルトディレクトリを指定できたらいいな
と思っていたのですが、如何でしょう。
あと、できればfile-name-as-directoryもあるとうれしいです。

--
前田修吾
--- eval.c.orig	Mon May 18 03:28:09 1998
+++ eval.c	Mon May 18 03:27:57 1998
@@ -4043,7 +4043,7 @@
 
     Check_SafeStr(fname);
     if (RSTRING(fname)->ptr[0] == '~') {
-	fname = file_s_expand_path(0, fname);
+	fname = file_s_expand_path(1, &fname);
     }
     file = find_file(RSTRING(fname)->ptr);
     if (!file) LoadError("No such file to load -- %s", RSTRING(fname)->ptr);
--- file.c.orig	Mon May 18 03:18:50 1998
+++ file.c	Mon May 18 03:35:24 1998
@@ -1177,12 +1177,16 @@
 }
 
 VALUE
-file_s_expand_path(obj, fname)
-    VALUE obj, fname;
+file_s_expand_path(argc, argv)
+    int argc;
+    VALUE *argv;
 {
+    VALUE fname, dname;
     char *s, *p;
     char buf[MAXPATHLEN+2];
 
+    rb_scan_args(argc, argv, "11", &fname, &dname);
+
     Check_Type(fname, T_STRING);
     s = RSTRING(fname)->ptr;
 
@@ -1225,12 +1229,18 @@
 	}
     }
     else if (s[0] != '/') {
+	if (argc == 2) {
+	    Check_Type(dname, T_STRING);
+	    strcpy(buf, RSTRING(dname)->ptr);
+	} else {
 #ifdef HAVE_GETCWD
-	getcwd(buf, MAXPATHLEN);
+	    getcwd(buf, MAXPATHLEN);
 #else
-	getwd(buf);
+	    getwd(buf);
 #endif
+	}
 	p = &buf[strlen(buf)];
+	while (p > buf && *(p - 1) == '/') p--;
     }
     *p = '/';
 
@@ -1695,7 +1705,7 @@
     rb_define_singleton_method(cFile, "rename", file_s_rename, 2);
     rb_define_singleton_method(cFile, "umask", file_s_umask, -1);
     rb_define_singleton_method(cFile, "truncate", file_s_truncate, 2);
-    rb_define_singleton_method(cFile, "expand_path", file_s_expand_path, 1);
+    rb_define_singleton_method(cFile, "expand_path", file_s_expand_path, -1);
     rb_define_singleton_method(cFile, "basename", file_s_basename, -1);
     rb_define_singleton_method(cFile, "dirname", file_s_dirname, 1);
 
--- intern.h.orig	Mon May 18 03:25:14 1998
+++ intern.h	Mon May 18 03:24:52 1998
@@ -139,7 +139,7 @@
 /* file.c */
 VALUE file_open _((char *, char *));
 int eaccess _((char *, int));
-VALUE file_s_expand_path _((VALUE, VALUE));
+VALUE file_s_expand_path _((int, VALUE *));
 /* gc.c */
 void rb_global_variable _((VALUE *));
 void gc_mark_locations _((VALUE *, VALUE *));