[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] Implement local-eval, local-compile, and the-environment
From: |
Andy Wingo |
Subject: |
Re: [PATCH] Implement local-eval, local-compile, and the-environment |
Date: |
Sat, 07 Jan 2012 18:55:50 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) |
On Tue 03 Jan 2012 11:52, Mark H Weaver <address@hidden> writes:
> +(define-record-type lexical-environment-type
> + (make-lexical-environment wrapper names boxes others module-name)
> + lexical-environment?
> + (wrapper lexenv-wrapper)
> + (names lexenv-names)
> + (boxes lexenv-boxes)
> + (others lexenv-others)
> + (module-name lexenv-module-name))
Why a module-name and not a module?
> +(define-syntax-rule (box v)
> + (case-lambda
> + (() v)
> + ((x) (set! v x))))
This is nice.
If you want to make a hack, you can get at the variable object here,
using program-free-variables. It is fairly well guaranteed to work.
Dunno if it is needed, though.
> +(define-syntax-rule (box-lambda* (v ...) (other ...) e)
> + (lambda (v ...)
> + (let-syntax
> + ((v (identifier-syntax-from-box v))
> + ...
> + (other (unsupported-binding 'other))
> + ...)
> + (if #t e))))
I would fix the indentation here. What's the purpose of the (if #t e) ?
> +(define-syntax-rule (capture-environment
> + module-name (v ...) (b ...) (other ...))
> + (make-lexical-environment
> + (lambda (expression)
> + #`(box-lambda*
> + #,'(v ...)
Why not just (v ...) ?
> + #,'(other ...)
Likewise. And again, the indentation :)
> +(define-syntax-rule (identifier-syntax-from-box b)
> + (let ((trans (identifier-syntax
> + (id (b))
> + ((set! id x) (b x)))))
> + (set-procedure-property! trans
> + 'identifier-syntax-box
> + (syntax-object-of b))
> + trans))
Ew, identifier-syntax as a value :) But OK.
> +;; XXX The returned syntax object includes an anti-mark
> +;; Is there a good way to avoid this?
> +(define-syntax syntax-object-of
> + (lambda (form)
> + (syntax-case form ()
> + ((_ x) #`(quote #,(datum->syntax #'x #'x))))))
This has a bad smell. Anything that is outside psyntax should not have
to think about marks. Perhaps syntax-local-value could serve your
purpose?
> + (global-extend 'core 'the-environment
This one is really nasty, and I'd like to avoid it if possible. Are
there some short primitives that psyntax could export that would make it
possible to implement `the-environment' in a module?
It seems to me that some primitive to return a list of all syntax
objects visible at a given point of a program, together with a primitive
to retrieve the module that corresponds to a syntax object, could be
sufficient.
WDYT?
> static void
> +test_scm_local_eval ()
Thanks for going all the way with documentation and test cases. This is
great.
Cheers,
Andy
--
http://wingolog.org/
- [PATCH] Implement local-eval, local-compile, and the-environment, Mark H Weaver, 2012/01/03
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, David Kastrup, 2012/01/03
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, Mark H Weaver, 2012/01/03
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, David Kastrup, 2012/01/05
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, Mark H Weaver, 2012/01/05
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, Mark H Weaver, 2012/01/05
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, Mark H Weaver, 2012/01/03
- Re: [PATCH] Implement local-eval, local-compile, and the-environment,
Andy Wingo <=
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, Mark H Weaver, 2012/01/07
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, Andy Wingo, 2012/01/07
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, Mark H Weaver, 2012/01/08
- Variables and the evaluator (Was: [PATCH] Implement local-eval, local-compile, and the-environment), Andy Wingo, 2012/01/14
- Re: Variables and the evaluator, Andy Wingo, 2012/01/14
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, Andy Wingo, 2012/01/14
- Re: [PATCH] Implement local-eval, local-compile, and the-environment, Andy Wingo, 2012/01/14