WIP: module integration

This commit is contained in:
Jan Nieuwenhuizen 2019-11-16 13:41:17 +01:00 committed by Jan (janneke) Nieuwenhuizen
parent 8d06a90396
commit 447a258b48
No known key found for this signature in database
GPG Key ID: F3C1A0D9C1D65273
16 changed files with 256 additions and 130 deletions

View File

@ -175,8 +175,8 @@ struct scm *variable_ref (struct scm *var);
struct scm *flat_variable_ref (struct scm *var);
struct scm *variable_set_x (struct scm *var, struct scm *value);
struct scm *variable_bound_p (struct scm *var);
struct scm *lookup_variable (struct scm *name, struct scm *define_p);
struct scm *lookup_ref (struct scm *name);
struct scm *lookup_handle (struct scm *name, struct scm* define_p);
struct scm *lookup_ref (struct scm *name, struct scm* bound_p);
/* src/vector.c */
struct scm *make_vector (struct scm *x);
struct scm *vector_length (struct scm *x);

View File

@ -73,6 +73,12 @@
// CONSTANT FRAME_PROCEDURE 4
#define FRAME_PROCEDURE 4
// CONSTANT MODULE_DEFINES = 3
#define MODULE_DEFINES 3
// CONSTANT MODULE_USES = 4
#define MODULE_USES 4
// CONSTANT STDIN 0
// CONSTANT STDOUT 1
// CONSTANT STDERR 2

View File

@ -121,13 +121,16 @@ struct scm *apply_builtin1 (struct scm *fn, struct scm *x);
struct scm *apply_builtin2 (struct scm *fn, struct scm *x, struct scm *y);
struct scm *apply_builtin3 (struct scm *fn, struct scm *x, struct scm *y, struct scm *z);
struct scm *builtin_name (struct scm *builtin);
struct scm *cell_ref (struct scm *cell, long index);
struct scm *cstring_to_list (char const *s);
struct scm *cstring_to_symbol (char const *s);
struct scm *cell_ref (struct scm *cell, long index);
struct scm *current_module ();
struct scm *fdisplay_ (struct scm *, int, int);
struct scm *handle_set_x (struct scm *name, struct scm *value);
struct scm *init_symbols ();
struct scm *init_time (struct scm *a);
struct scm *lookup_variable_ (char const* name);
struct scm *lookup_handle (struct scm *name, struct scm *define_p);
struct scm *lookup_ref_ (char const *name);
struct scm *make_builtin_type ();
struct scm *make_bytes (char const *s, size_t length);
struct scm *make_cell (long type, struct scm *car, struct scm *cdr);
@ -146,6 +149,9 @@ struct scm *make_string0 (char const *s);
struct scm *make_string_port (struct scm *x);
struct scm *make_vector_ (long k, struct scm *e);
struct scm *mes_builtins (struct scm *a);
struct scm *module_defines (struct scm *module);
struct scm *module_handle (struct scm *module, struct scm *name);
struct scm *module_variable (struct scm *module, struct scm *name);
struct scm *push_cc (struct scm *p1, struct scm *p2, struct scm *a, struct scm *c);
struct scm *set_x (struct scm *x, struct scm *e);
struct scm *struct_ref_ (struct scm *x, long i);

View File

@ -30,7 +30,7 @@
(define mes %version)
(define (defined? x)
(lookup-variable x #f))
(lookup-handle x #f))
(define (cond-expand-expander clauses)
(if (defined? (car (car clauses)))

View File

@ -20,7 +20,7 @@
(define mes %version)
(define (defined? x)
(lookup-variable x #f))
(lookup-handle x #f))
(define (cond-expand-expander clauses)
(if (defined? (car (car clauses)))

View File

@ -20,7 +20,7 @@
(define mes %version)
(define (defined? x)
(lookup-variable x #f))
(lookup-handle x #f))
(define (cond-expand-expander clauses)
(if (defined? (car (car clauses)))

View File

@ -30,7 +30,7 @@
(define mes %version)
(define (defined? x)
(lookup-variable x #f))
(lookup-handle x #f))
(define (cond-expand-expander clauses)
(if (defined? (car (car clauses)))

View File

@ -30,7 +30,7 @@
(define mes %version)
(define (defined? x)
(lookup-variable x #f))
(lookup-handle x #f))
(define (cond-expand-expander clauses)
(if (defined? (car (car clauses)))

View File

@ -149,20 +149,18 @@
(define guile:current-module (make-fluid #f))
(define lookup-global #f)
(define (global-lookup-function name define?)
;; (if define? (module-make-local-var! (guile:current-module) name)
;; (module-variable (guile:current-module) name))
'("boe")
)
(define module-system-booted? #f)
(define *current-module* #f)
(define (set-current-module m)
(display "set-current-module: name=")
(display (module-name m))
(display "\n")
(let ((o (guile:current-module)))
(guile:current-module m)
;; (unless o
;; (set! lookup-global global-lookup-function))
(set! *current-module* m)
(unless o
(set! module-system-booted? #t))
o))
(define (make-hook . n)
@ -1232,7 +1230,14 @@
(if (and variable (variable-bound? variable))
(variable-ref variable)
(if (null? rest)
(error "No variable named" name 'in module)
(begin
(when variable
(display "Variable's value is undefined: " (current-error-port))
(display name (current-error-port))
(display ": " (current-error-port))
(write variable (current-error-port))
(display "\n" (current-error-port)))
(error "No variable named" name 'in module))
(car rest) ; default value
))))
@ -2725,13 +2730,25 @@
(define-module (guile-user) #:use-module (boo))
(display "\nnow in guile-user\n")
(display "ZEE:")
;;(display ((module-ref (guile:current-module) 'ZEE-MODULE)))
;;(display (module-ref (resolve-module '(boo)) 'ZEE-MODULE))
(display "keil-user: ")
(write *current-module*)
(display "\n")
(display "ZEE-MODULE:")
(display ((module-ref (guile:current-module) 'ZEE-MODULE)))
;; (display (module-ref (resolve-module '(boo)) 'ZEE-MODULE))
;; (display "\n")
(ZEE-MODULE)
;; (ZEE-MODULE)
(display "\n")
(display "bah: ")
;;(display (module-ref (guile:current-module) 'bah))
(display bah)
(display (module-ref (guile:current-module) 'bah))
;;(display bah)
(display "\n")
;; (display "===> ZEE\n")
;; (display ZEE-MODULE)
;; (display "\n")
;; (display "===> (ZEE)\n")
;; (display (ZEE-MODULE))
;; (display "\n")

View File

@ -28,7 +28,7 @@
(if (null? lst) (list)
(cons (f (car lst)) (map f (cdr lst)))))
(define (closure x)
(map car (cdr (core:cdr (core:car (core:cdr (cdr (lookup-variable 'x #f))))))))))
(map car (cdr (core:cdr (core:car (core:cdr (cdr (lookup-handle 'x #f))))))))))
(define (x t) #t)
(define (xx x1 x2)

View File

@ -20,7 +20,7 @@
(define mes %version)
(define (defined? x)
(lookup-variable x #f))
(lookup-handle x #f))
(define (cond-expand-expander clauses)
(if (defined? (car (car clauses)))

View File

@ -285,8 +285,8 @@ mes_builtins (struct scm *a) /*:((internal)) */
a = init_builtin (builtin_type, "flat-variable-ref", 1, &flat_variable_ref, a);
a = init_builtin (builtin_type, "variable-set!", 2, &variable_set_x, a);
a = init_builtin (builtin_type, "variable-bound?", 1, &variable_bound_p, a);
a = init_builtin (builtin_type, "lookup-variable", 2, &lookup_variable, a);
a = init_builtin (builtin_type, "lookup-ref", 1, &lookup_ref, a);
a = init_builtin (builtin_type, "lookup-handle", 2, &lookup_handle, a);
a = init_builtin (builtin_type, "lookup-ref", 2, &lookup_ref, a);
/* src/vector.c */
a = init_builtin (builtin_type, "make-vector", -1, &make_vector, a);
a = init_builtin (builtin_type, "vector-length", 1, &vector_length, a);

View File

@ -149,9 +149,9 @@ struct scm *
error (struct scm *key, struct scm *x)
{
#if !__MESC_MES__ && !__M2_PLANET__
struct scm *throw = lookup_variable (cell_symbol_throw, cell_f);
struct scm *throw = lookup_ref (cell_symbol_throw, cell_f);
if (throw != cell_f)
return apply (throw->cdr, cons (key, cons (x, cell_nil)), R0);
return apply (throw, cons (key, cons (x, cell_nil)), R0);
#endif
display_error_ (key);
eputs (": ");

View File

@ -120,8 +120,8 @@ set_x (struct scm *x, struct scm *e) /*:((internal)) */
p = x->variable;
else
{
p = lookup_variable (x, cell_f);
if (p == cell_f || p-> cdr == cell_undefined)
p = lookup_handle (x, cell_f);
if (p == cell_f || p->cdr == cell_undefined)
error (cell_symbol_unbound_variable, x);
}
if (p->type != TPAIR)
@ -264,7 +264,7 @@ expand_variable_ (struct scm *x, struct scm *formals, int top_p) /*:((int
&& a != cell_symbol_primitive_load
&& formal_p (x->car, formals) == 0)
{
v = lookup_variable (a, cell_f);
v = lookup_handle (a, cell_f);
if (v != cell_f)
x->car = make_variable (v);
}
@ -323,7 +323,7 @@ eval_apply ()
struct scm *args;
struct scm *body;
struct scm *cl;
struct scm *entry;
struct scm *handle;
struct scm *expanders;
struct scm *formals;
struct scm *input;
@ -630,15 +630,15 @@ eval:
name = name->car;
if (macro_p != 0)
{
entry = cell_f;
handle = cell_f;
/* FIXME: dead code; no tests
entry = assq (name, g_macros);
if (entry == cell_f)
handle = assq (name, g_macros);
if (handle == cell_f)
*/
macro_set_x (name, entry);
macro_set_x (name, handle);
}
else
entry = lookup_variable (name, cell_t);
lookup_handle (name, cell_t);
}
R2 = R1;
aa = R1->cdr->car;
@ -666,14 +666,24 @@ eval:
name = name->car;
if (macro_p != 0)
{
entry = macro_get_handle (name);
handle = macro_get_handle (name);
R1 = make_macro (name, R1);
set_cdr_x (entry, R1);
set_cdr_x (handle, R1);
}
else if (global_p != 0)
{
entry = lookup_variable (name, cell_f);
set_cdr_x (entry, R1);
handle = lookup_handle (name, cell_f);
if (g_debug > 0)
{
eputs ("global set: ");
write_error_ (name);
eputs ("\n");
}
#if 0
set_cdr_x (handle, R1);
#else
handle_set_x (handle, R1);
#endif
}
else
{
@ -685,11 +695,11 @@ eval:
eputs ("\n");
}
#endif
entry = cons (name, R1);
aa = cons (entry, cell_nil);
handle = cons (name, R1);
aa = cons (handle, cell_nil);
set_cdr_x (aa, cdr (R0));
set_cdr_x (R0, aa);
cl = lookup_variable (cell_closure, cell_f);
cl = lookup_handle (cell_closure, cell_f);
set_cdr_x (cl, aa);
}
R1 = cell_unspecified;
@ -714,7 +724,7 @@ eval:
goto vm_return;
if (R1 == cell_symbol_call_with_current_continuation)
goto vm_return;
R1 = lookup_ref (R1);
R1 = lookup_ref (R1, cell_t);
goto vm_return;
}
else if (t == TVARIABLE)
@ -787,15 +797,15 @@ macro_expand:
macro = macro_get_handle (cell_symbol_portable_macro_expand);
if (macro != cell_f)
{
expanders = lookup_ref (cell_symbol_sc_expander_alist);
if (expanders != cell_f)
expanders = lookup_ref (cell_symbol_sc_expander_alist, cell_f);
if (expanders != cell_undefined)
{
macro = assq (R1->car, expanders);
if (macro != cell_f)
{
sc_expand = lookup_ref (cell_symbol_macro_expand);
sc_expand = lookup_ref (cell_symbol_macro_expand, cell_f);
R2 = R1;
if (sc_expand != cell_undefined && sc_expand != cell_f)
if (sc_expand != cell_undefined && sc_expand != cell_undefined)
{
R1 = cons (sc_expand, cons (R1, cell_nil));
goto apply;

View File

@ -39,72 +39,89 @@ initial_module ()
return M0;
}
// struct scm *
// module_define_x (struct scm *module, struct scm *name, struct scm *value)
// {
// return hashq_set_x (M0, name, value);
// }
// struct scm *
// scm_module_lookup_closure (struct scm *module)
// {
// if (module == cell_f)
// return cell_f;
// else
// return struct_ref (module, MODULE_EVAL_CLOSURE);
// }
// struct scm *
// scm_current_module_lookup_closure ()
// {
// if (scm_module_system_booted_p)
// return scm_module_lookup_closure (scm_current_module ());
// return cell_f;
// }
// struct scm *
// scm_eval_closure_lookup (struct scm *eclo, struct scm *name, struct scm *define_p)
// {
// struct scm *module = eclo;
// if (define_p == cell_f)
// return module_variable (module, name);
// else
// {
// #if 0
// if (struct scm *_EVAL_CLOSURE_INTERFACE_P (eclo))
// return struct cell_f;
// #endif
// return apply (module_make_local_var_x_var, cons (module, cons (name, cell_nil)));
// }
// }
struct scm *
current_module () /*:((internal)) */
{
/* struct scm *booted_p = hashq_get_handle_ (M0, cstring_to_symbol ("module-system-booted?"), cell_f);
if (booted_p->type == TPAIR && booted_p->cdr != cell_f)
{
*/
struct scm *module = hashq_get_handle_ (M0, cstring_to_symbol ("*current-module*"), cell_f);
if (module->type == TPAIR && module->cdr != cell_f)
return module->cdr;
/*
}
*/
return M0;
}
struct scm *
module_variable (struct scm *module, struct scm *name)
module_defines (struct scm *module) /*:((internal)) */
{
/* 1. Check module obarray */
struct scm *a = struct_ref_ (module, MODULE_OBARRAY);
struct scm *b = scm_hashq_ref (a, name, cell_f);
if (b != cell_f)
return b;
if (module != cell_f && module != M0)
return struct_ref_ (module, MODULE_DEFINES);
return M0;
}
// /* 2. Custom binder */
// struct scm *binder = struct_ref (module, MODULE_BINDER);
// if (binder != cell_f)
// {
// b = apply (binder->cdr, (cons (module, cons (name, cons (cell_f, cell_nil)))), cell_f);
// if (b != cell_f)
// return b;
// }
struct scm *
module_define_x (struct scm *module, struct scm *name, struct scm *value)
{
struct scm *table = module_defines (module);
return hashq_set_x (table, name, value);
}
/* 3. Search the use list */
struct scm *uses = struct_ref (module, MODULE_USES);
while (uses->type == TPAIR)
struct scm *
module_handle (struct scm *module, struct scm *name) /*:((internal)) */
{
/* 1. Check module defines. */
struct scm *table = module_defines (module);
if (g_debug > 0)
{
b = module_variable (uses->car, name);
eputs ("module_handle:");
eputs (" name = ");
write_error_ (name);
// eputs (" defines = ");
// write_error_ (table);
eputs ("\n");
}
struct scm *handle = hashq_get_handle_ (table, name, cell_f);
if (handle != cell_f)
return handle;
/* 2. Custom binder. */
/*
struct scm *binder = struct_ref (module, MODULE_BINDER);
if (binder != cell_f)
{
b = apply (binder->cdr, (cons (module, cons (name, cons (cell_f, cell_nil)))), cell_f);
if (b != cell_f)
return b;
}
*/
/* 3. Search the use list. */
struct scm *uses = struct_ref_ (module, MODULE_USES);
while (uses->type == TPAIR)
{
handle = module_handle (uses->car, name);
if (handle != cell_f)
return handle;
uses = uses->cdr;
}
/* 4. Hack for Mes: always look in M0. */
handle = hashq_get_handle_ (M0, name, cell_f);
return handle;
}
/* NOT USED? */
struct scm *
module_variable (struct scm *module, struct scm *name)
{
struct scm *handle = module_handle (module, name);
if (handle != cell_f)
return handle->cdr;
return cell_f;
}

View File

@ -45,9 +45,32 @@ flat_variable_ref (struct scm *var)
struct scm *
variable_set_x (struct scm *var, struct scm *value)
{
#if 0
assert_variable (1, var);
var->variable = value;
return cell_unspecified;
#else
if (g_debug > 0)
{
eputs ("variable-set!");
write_error_ (var);
eputs ("\n");
}
if (var->type == TPAIR)
{
struct scm *x = var->cdr;
if (x->type == TVARIABLE)
x->variable = value;
else
//set_cdr_x (var, value);
var->cdr = value;
}
else if (var->type == TVARIABLE)
var->variable = value;
else
assert_variable (1, var);
return cell_unspecified;
#endif
}
struct scm *
@ -61,30 +84,65 @@ variable_bound_p (struct scm *var)
}
struct scm *
lookup_variable (struct scm *name, struct scm *define_p)
handle_set_x (struct scm *handle, struct scm *value)
{
#if 0
struct scm *x = handle->cdr;
if (x->type == TVARIABLE)
x->variable = value;
else
handle->cdr = value;
return cell_unspecified;
#else
if (g_debug > 0)
{
eputs ("variable-set!");
write_error_ (handle);
eputs ("\n");
}
if (handle->type == TPAIR)
{
struct scm *x = handle->cdr;
if (x->type == TVARIABLE)
x->variable = value;
else
//set_cdr_x (handle, value);
handle->cdr = value;
}
else if (handle->type == TVARIABLE)
handle->variable = value;
else
assert_variable (1, handle);
return cell_unspecified;
#endif
}
/*
GUILE has `proc': scm_current_module -> scm_module_lookup_closure -> standard-eval-closure:
BUT: define-p: module-make-local-var!, !define-p: module-variable
*/
struct scm *
lookup_handle (struct scm *name, struct scm *define_p)
{
struct scm *handle = handle = assq (name, R0);
if (handle == cell_f)
{
struct scm *lookup = hashq_get_handle_ (M0, cstring_to_symbol ("lookup-global"), cell_f);
if (lookup != cell_f && lookup->cdr != cell_f)
struct scm *module = current_module ();
if (define_p == cell_f)
{
eputs ("lookup? ");
display_error_ (lookup);
eputs (" ... \n");
handle = apply (lookup->cdr, cons (name, cons (define_p, cell_nil)), R0);
eputs ("lookup: ");
display_error_ (name);
eputs (" => ");
write_error_ (handle);
if (handle != cell_f)
handle = cons (name, name->variable);
if (module == M0)
handle = hashq_get_handle_ (M0, name, cell_f);
else
handle = module_handle (module, name);
}
else
{
handle = hashq_get_handle_ (M0, name, cell_f);
if (handle == cell_f && define_p == cell_t)
struct scm *table = module_defines (module);
handle = hashq_get_handle_ (table, name, cell_f);
if (handle == cell_f)
{
if (g_debug > 0)
{
@ -92,7 +150,15 @@ lookup_variable (struct scm *name, struct scm *define_p)
write_error_ (name);
eputs ("\n");
}
handle = hashq_set_handle_x (M0, name, cell_f);
handle = hashq_set_handle_x (table, name, cell_f);
}
else if (handle->cdr == cell_undefined)
{
eputs ("lookup + define: ");
write_error_ (name);
eputs (" found: ");
write_error_ (handle);
eputs ("\n");
}
}
}
@ -101,16 +167,20 @@ lookup_variable (struct scm *name, struct scm *define_p)
}
struct scm *
lookup_variable_ (char const* name)
lookup_ref (struct scm *name, struct scm *bound_p)
{
return lookup_variable (cstring_to_symbol (name), cell_f);
struct scm *handle = lookup_handle (name, cell_f);
if (handle == cell_f)
{
if (bound_p == cell_t)
error (cell_symbol_unbound_variable, name);
return cell_undefined;
}
return handle->cdr;
}
struct scm *
lookup_ref (struct scm *name)
lookup_ref_ (char const *name)
{
struct scm *x = lookup_variable (name, cell_f);
if (x == cell_f)
error (cell_symbol_unbound_variable, name);
return x->cdr;
return lookup_ref (cstring_to_symbol (name), cell_f);
}