guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: request review & testing: syncase


From: Neil Jerram
Subject: Re: request review & testing: syncase
Date: Mon, 13 Apr 2009 10:05:05 +0100
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.2 (gnu/linux)

Andy Wingo <address@hidden> writes:

> I've rebased the syncase branch on top of current master, and fixed
> everything I know about. Now you can have macros in modules that expand
> to references to identifiers that are local to the module that the macro
> was defined in.

"serialize module information into syncase's output -- getting ready
for hygiene"

Renaming (ice-9 annotate) to (ice-9 expand-support)... is that really
compelling enough for the risk of upsetting someone (if there is
anyone!) who is using (ice-9 annotate) ?

So far, not understanding why we don't generate (@ ...) or (@@
... directly), but perhaps that will become clear.

"add modules to syntax objects (part 1, intermediate step)"

Out of interest, why use a vector here, whereas in the previous commit
you used structs?

"finish bootstrap to syntax-objects with modules"

OK.  I see now why the vector representation didn't matter.  I hadn't
realized before that psyntax.scm required itself to bootstrap.

"thread the module through syntax-case's expansion"

+SCM_DEFINE (scm_procedure_module, "procedure-module", 1, 0, 0,
+ (SCM proc),
+ "Return the module that was current when this procedure was defined.\n"
+ "Free variables in this procedure are resolved relative to the\n"
+ "procedure's module.")

Can you delete the second sentence?  I think the concept of how
variables are resolved belongs elsewhere, and mentioning it here feels
slightly worrying - suggesting (to me, very slightly, and no matter
how strange that would be) that proper resolution might only happen
for procedures for which procedure-module is called.

+#define FUNC_NAME s_scm_procedure_module
+{
+ SCM_VALIDATE_PROC (SCM_ARG1, proc);

Could you use scm_env_module () here to simplify the code?

"eval-closure-module, here hopefully not for long"

OK.

"more work on modules and hygiene, not finished yet, alas."

Hmm, "eval closures are so 1990s": I think I agree, but I believe the
idea of eval closures was to allow other top levels than modules (and
the root).  In case anyone out there is actually using a non-module
eval closure, are we inadvertently removing support for using syncase
with such top levels?

+ ;(debug-disable 'debug 'procnames)
+ ;(read-disable 'positions)

Is that temporary?

-;; The following lines are necessary only if we start making changes
-;; (use-syntax sc-expand)
-;; (load-from-path "ice-9/psyntax")

Am I correct in thinking that we have Makefile rules to automatically
do the needed generation when psyntax.scm changes?

"houston, we have hygiene"

Hooray!

- (build-global-reference (source-annotation (car e)) value mod)
+ (build-global-reference (source-annotation (car e)) value
+ (if (syntax-object? (car e))
+ (syntax-object-module (car e))
+ mod))

Didn't understand this change, and I'm not sure if the changelog
covers it.  Can you explain more?

"hygienic compilation"

OK.  Am I correct in thinking that this is just an optimization -
i.e. that the VM would correctly interpret the @ and @@ macros later
on if they weren't intercepted here?

"@ and @@ as primitive macros"

+ ASSERT_SYNTAX (scm_ilength (expr) == 3, s_bad_expression, expr);
+ ASSERT_SYNTAX (scm_ilength (scm_cadr (expr)) > 0, s_bad_expression, expr);

I think it would be helpful to also assert that the caddr is a
symbol.  (Also in @@)

"fix handling of pre-modules errors in the vm"

OK.

"fix hygiene + modules + local macros"

- #:export (pmatch ppat))
+ #:export (pmatch))
;; FIXME: shouldn't have to export ppat...

Can remove the FIXME too now!

Overall...

Great stuff!

I believe this implementation confirms the point that we're relying on
(define-module ...) to have a lexical effect, and hence (given that
define-module isn't actually syntax) on the fact that Guile reads and
evaluates top-level forms from a file or the REPL sequentially.  I
think we should just make that explicit somewhere, for anyone looking
in future at a different way of reading files.  How does the compiler
handle this, does it look specifically for define-module forms when
reading?

Regards,
        Neil





reply via email to

[Prev in Thread] Current Thread [Next in Thread]