add library operators

This commit is contained in:
Yuichi Nishiwaki 2015-06-16 22:51:05 +09:00
parent a88b5e193f
commit eef74604d0
3 changed files with 65 additions and 0 deletions

View File

@ -16,6 +16,7 @@ struct pic_lib {
struct pic_dict *exports;
};
#define pic_lib_p(o) (pic_type(o) == PIC_TT_LIB)
#define pic_lib_ptr(o) ((struct pic_lib *)pic_ptr(o))
#if defined(__cplusplus)

View File

@ -312,6 +312,60 @@ pic_lib_define_library(pic_state *pic)
return pic_undef_value();
}
static pic_value
pic_lib_make_library(pic_state *pic)
{
pic_value name;
pic_get_args(pic, "o", &name);
return pic_obj_value(pic_make_library(pic, name));
}
static pic_value
pic_lib_find_library(pic_state *pic)
{
pic_value name;
struct pic_lib *lib;
pic_get_args(pic, "o", &name);
if ((lib = pic_find_library(pic, name)) == NULL) {
return pic_false_value();
}
return pic_obj_value(lib);
}
static pic_value
pic_lib_library_exports(pic_state *pic)
{
pic_value lib, exports = pic_nil_value();
pic_sym *sym;
xh_entry *it;
pic_get_args(pic, "o", &lib);
pic_assert_type(pic, lib, lib);
pic_dict_for_each (sym, pic_lib_ptr(lib)->exports, it) {
pic_push(pic, pic_obj_value(sym), exports);
}
return exports;
}
static pic_value
pic_lib_library_environment(pic_state *pic)
{
pic_value lib;
pic_get_args(pic, "o", &lib);
pic_assert_type(pic, lib, lib);
return pic_obj_value(pic_lib_ptr(lib)->env);
}
void
pic_init_lib(pic_state *pic)
{
@ -321,4 +375,9 @@ pic_init_lib(pic_state *pic)
pic_defmacro(pic, pic->sIMPORT, pic->uIMPORT, pic_lib_import);
pic_defmacro(pic, pic->sEXPORT, pic->uEXPORT, pic_lib_export);
pic_defmacro(pic, pic->sDEFINE_LIBRARY, pic->uDEFINE_LIBRARY, pic_lib_define_library);
pic_defun(pic, "make-library", pic_lib_make_library);
pic_defun(pic, "find-library", pic_lib_find_library);
pic_defun(pic, "library-exports", pic_lib_library_exports);
pic_defun(pic, "library-environment", pic_lib_library_environment);
}

View File

@ -252,6 +252,11 @@
variable?
variable=?)
(export make-library
find-library
library-exports
library-environment)
(export call-with-current-continuation
call/cc
dynamic-wind