(pmatch tail
;; (define NAME VAL)
((,name ,val) (guard (symbol? name) (ghil-env-toplevel? e))
- (make-ghil-define e l (ghil-lookup e name) (trans:x val)))
+ (make-ghil-define e l (ghil-define (ghil-env-parent e) name)
+ (trans:x val)))
;; (define (NAME FORMALS...) BODY...)
(((,name . ,formals) . ,body) (guard (symbol? name))
((<ghil-define> env loc var val)
(comp-push val)
- (push-code! (make-glil-var 'set env var))
+ (push-code! (make-glil-var 'define env var))
(return-void!))
((<ghil-if> env loc test then else)
<ghil-env> make-ghil-env ghil-env?
ghil-env-mod ghil-env-parent ghil-env-table ghil-env-variables
- ghil-primitive-macro? ghil-env-add! ghil-lookup
+ ghil-primitive-macro? ghil-env-add! ghil-lookup ghil-define
ghil-env-toplevel?
call-with-ghil-environment call-with-ghil-bindings))
(record-case e
((<ghil-mod> module table imports)
(or (assq-ref table sym)
- (let ((var (make-ghil-var #f sym 'module)))
- (apush! sym var (ghil-mod-table e))
- var)))
+ ;; a free variable that we have not resolved
+ (make-ghil-var #f sym 'module)))
((<ghil-env> mod parent table variables)
(let ((found (assq-ref table sym)))
(if found
(begin (set! (ghil-var-kind found) 'external) found)
(loop parent))))))))
+(define (ghil-define mod sym)
+ (or (assq-ref (ghil-mod-table mod) sym)
+ (let ((var (make-ghil-var mod sym 'module)))
+ (apush! sym var (ghil-mod-table mod))
+ var)))
+
(define (call-with-ghil-environment e syms func)
(let* ((e (make-ghil-env e))
(vars (map (lambda (s)
(define-record (<venv> parent nexts closure?))
(define-record (<vmod> id))
(define-record (<vlink> module name))
+(define-record (<vdefine> module name))
(define-record (<bytespec> vars bytes meta objs closure?))
\f
(push-code! `(external-set ,(+ n index)))))))
((<glil-module> op module name)
- (push-object! (make-vlink :module #f :name name))
- (if (eq? op 'ref)
- (push-code! '(variable-ref))
- (push-code! '(variable-set))))
+ (case op
+ ((ref)
+ (push-object! (make-vlink :module module :name name))
+ (push-code! '(variable-ref)))
+ ((set)
+ (push-object! (make-vlink :module module :name name))
+ (push-code! '(variable-set)))
+ ((define)
+ (push-object! (make-vdefine :module module :name name))
+ (push-code! '(variable-set)))))
((<glil-label> label)
(set! label-alist (assq-set! label-alist label (current-address))))
((<vlink> module name)
;; FIXME: dump module
(push-code! `(link ,(symbol->string name))))
+ ((<vdefine> module name)
+ ;; FIXME: dump module
+ (push-code! `(define ,(symbol->string name))))
((<vmod> id)
(push-code! `(load-module ,id)))
(else
sym = scm_from_locale_symboln ((char *)ip, len);
ip += len;
-#if 0
- *sp = scm_c_env_vcell (*sp, sym, 1);
-#endif
- {
- /* Temporary hack that supports the current module system */
- SCM mod = scm_current_module ();
- SCM var = scm_eval_closure_lookup (scm_standard_eval_closure (mod),
- sym, SCM_BOOL_F);
- if (SCM_FALSEP (var))
- /* Create a new variable if not defined yet */
- var = scm_eval_closure_lookup (scm_standard_eval_closure (mod),
- sym, SCM_BOOL_T);
- PUSH (var);
- /* Was: SCM_VARVCELL (var)); */
- NEXT;
- }
+ PUSH (scm_lookup (sym));
+ NEXT;
+}
+
+VM_DEFINE_LOADER (define, "define")
+{
+ SCM sym;
+ size_t len;
+
+ FETCH_LENGTH (len);
+ sym = scm_from_locale_symboln ((char *)ip, len);
+ ip += len;
+
+ PUSH (scm_sym2var (sym, scm_current_module_lookup_closure (), SCM_BOOL_T));
+ NEXT;
}
/*