#それだと、dという変数そのものを評価したい時と区別がつかないのでまずいんですが、「行頭に特殊な文字を入れることでシェルのような行指向モードにする」というのは有りです。Allegro CLではREPLプロンプトにコロンで始めるとそういうモードになります。Scheme処理系でも、コンマで始めることで行指向コマンドになるのがあったはず。
##これのShell Like Commandsのところですね。コードはリンクした先にあります。ここで試した機能のうち、ヒストリに関しては既にHEADに入っています。Shell Like Commandsも試したければ、該当する部分を lib/gauche/interactive.scm に入れてください。
#Scm_ExportSymbols で module->external を引くのには exported_name を使わないといけないんじゃないでしょうか?
#diff --git a/src/module.c b/src/module.c
index 4858458..ae259bb 100644
--- a/src/module.c
+++ b/src/module.c
@@ -575,7 +575,7 @@ ScmObj Scm_ExportSymbols(ScmModule *module, ScmObj specs)
exported_name = SCM_SYMBOL(SCM_CAR(SCM_CDDR(spec)));
}
e = Scm_HashCoreSearch(SCM_HASH_TABLE_CORE(module->external),
- (intptr_t)name, SCM_DICT_GET);
+ (intptr_t)exported_name, SCM_DICT_GET);
/* if we have e, it's already exported. */
if (e == NULL) {
e = Scm_HashCoreSearch(SCM_HASH_TABLE_CORE(module->internal),
diff --git a/test/module.scm b/test/module.scm
index 00cdfdf..42c547b 100644
--- a/test/module.scm
+++ b/test/module.scm
@@ -298,6 +298,19 @@
(list (global-variable-ref m 'mm:ku #f)
(global-variable-ref m 'mm:kokono #f)))))
+(define-module Oe
+ (export (rename a x) (rename x a))
+ (define a 'A)
+ (define x 'X))
+(define-module Oe-1
+ (import Oe))
+
+(test "export-time renaming with swapping" '(X A)
+ (lambda ()
+ (let [(m (find-module 'Oe-1))]
+ (list (global-variable-ref m 'a #f)
+ (global-variable-ref m 'x #f)))))
+
;;------------------------------------------------------------------
;; select-module, and restoration in load().
#ああそうだ。あと、既に(export foo) になってるところに (export (rename bar foo)) した場合の処理とか一応入れとこうかな。
#xreplの件、ありがとうございます。ちょっと読んでみます。ちなみに、わたしはbashプロンプトで (use hoge)とかやってしまうようになりました。
#もしかして、シェルを特定の言語のreplにするというようなhackもあるのでしょうか・・・
#それと、いまgnu-globalをためしているのですけれど、これをgaucheに対応させるというhackはすでにあるんでしょうか?
#ソースがschemeからの自動生成の場合が多いので、大変なのだろうなあと思います。
#んー、make maintainer-cleanすれば自動生成されたソースは消えるので、その状態でglobalをかければ自動生成されたのがヒットすることは避けられるんじゃないかな。Schemeとしてカバーできない定義まで対応させるにはどうしたら良いのか知らないけれども。
#逆にgoshプロンプトでmakeと打って #<generic make(1)> と言われてしまうことは良くある > bash$ (use hoge)
#;; 括弧を補う
(define (paren-less)
(let1 line (string-trim-both (read-line))
($ read-from-string $ format #f "(~a)" line)
) )
(define (reader)
(case (peek-non-ws-char)
[(#\,) (read-char) (read-toplevel-command) ]
[(#\:) (read-char) (paren-less) ]
[else => (^c (if (eof-object? c) c (read)))]))
#こんな感じにしてみました。
#あと、「行頭の文字」に使える文字となると、あとは#と;でしょうか。
##はだめか。
#(define (invoke-info)
(let1 line (string-trim-both (read-line))
($ read-from-string $ format #f "(info '~s)" line )
) )
(define (reader)
(case (peek-non-ws-char)
[(#\,) (read-char) (read-toplevel-command) ]
[(#\:) (read-char) (paren-less) ]
[(#\?) (read-char) (invoke-info) ]
[else => (^c (if (eof-object? c) c (read)))]))