lazy export

This commit is contained in:
Yuichi Nishiwaki 2015-06-09 22:36:04 +09:00
parent 98857c0726
commit cf411fd62a
2 changed files with 25 additions and 23 deletions

View File

@ -73,7 +73,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports)
struct pic_lib *lib; struct pic_lib *lib;
struct pic_dict *table; struct pic_dict *table;
pic_value val, tmp, prefix, it; pic_value val, tmp, prefix, it;
pic_sym *sym, *id, *tag; pic_sym *sym, *id, *tag, *nick;
xh_entry *iter; xh_entry *iter;
table = pic_make_dict(pic); table = pic_make_dict(pic);
@ -122,8 +122,15 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports)
if (! lib) { if (! lib) {
pic_errorf(pic, "library not found: ~a", spec); pic_errorf(pic, "library not found: ~a", spec);
} }
pic_dict_for_each (sym, lib->exports, iter) { pic_dict_for_each (nick, lib->exports, iter) {
pic_dict_set(pic, imports, sym, pic_dict_ref(pic, lib->exports, sym)); pic_sym *realname, *rename;
realname = pic_sym_ptr(pic_dict_ref(pic, lib->exports, nick));
if ((rename = pic_find_rename(pic, lib->env, realname)) == NULL) {
pic_errorf(pic, "attempted to export undefined variable '~s'", pic_obj_value(realname));
}
pic_dict_set(pic, imports, nick, pic_obj_value(rename));
} }
} }
@ -148,7 +155,6 @@ export(pic_state *pic, pic_value spec)
{ {
pic_sym *sRENAME = pic_intern_cstr(pic, "rename"); pic_sym *sRENAME = pic_intern_cstr(pic, "rename");
pic_value a, b; pic_value a, b;
pic_sym *rename;
if (pic_sym_p(spec)) { /* (export a) */ if (pic_sym_p(spec)) { /* (export a) */
a = b = spec; a = b = spec;
@ -165,15 +171,11 @@ export(pic_state *pic, pic_value spec)
goto fail; goto fail;
} }
if ((rename = pic_find_rename(pic, pic->lib->env, pic_sym_ptr(a))) == NULL) {
pic_errorf(pic, "export: symbol not defined %s", pic_symbol_name(pic, pic_sym_ptr(a)));
}
#if DEBUG #if DEBUG
printf("* exporting %s as %s\n", pic_symbol_name(pic, pic_sym_ptr(b)), pic_symbol_name(pic, rename)); printf("* exporting %s as %s\n", pic_symbol_name(pic, pic_sym_ptr(b)), pic_symbol_name(pic, rename));
#endif #endif
pic_dict_set(pic, pic->lib->exports, pic_sym_ptr(b), pic_obj_value(rename)); pic_dict_set(pic, pic->lib->exports, pic_sym_ptr(b), a);
return; return;

View File

@ -1,6 +1,19 @@
(define-library (picrin macro) (define-library (picrin macro)
(import (picrin base)) (import (picrin base))
(export identifier?
identifier=?
make-identifier
make-syntactic-closure
close-syntax
capture-syntactic-environment
sc-macro-transformer
rsc-macro-transformer
er-macro-transformer
ir-macro-transformer
;; strip-syntax
define-macro)
;; assumes no derived expressions are provided yet ;; assumes no derived expressions are provided yet
(define (walk proc expr) (define (walk proc expr)
@ -125,17 +138,4 @@
(list (r 'define-macro) (car formal) (list (r 'define-macro) (car formal)
(cons (r 'lambda) (cons (r 'lambda)
(cons (cdr formal) (cons (cdr formal)
body))))))) body))))))))
(export identifier?
identifier=?
make-identifier
make-syntactic-closure
close-syntax
capture-syntactic-environment
sc-macro-transformer
rsc-macro-transformer
er-macro-transformer
ir-macro-transformer
;; strip-syntax
define-macro))