[plt-scheme] eval and phases (v4.0.1.2)
On Wed, Jun 25, 2008 at 2:55 PM, Matthew Flatt <mflatt at cs.utah.edu> wrote:
> As of version 4.0.1.2 (now in SVN):
>
>  1. Each namespace has a "base phase" that is used by `eval',
>    `dynamic-require', etc., instead of always starting in phase 0.
>
>  2. While compile-time expressions are evaluated (such as the body of a
>    macro transformer or the right-hand side of `define-for-syntax'),
>    the current namespace is set to one whose base phase matches the
>    evaluation phase.
I have a couple issues with this.  First, the following seems like a
bug.  If you put this module in the Module language, and hit run:
#lang scheme/base
(require (for-syntax scheme/base)
         (for-template scheme/base))
(define-namespace-anchor anch)
;; local-expand and then typecheck an expression
(define-syntax (tc-expr/expand stx)
  (syntax-case stx ()
    [(_ e)
     #`(parameterize ([current-namespace (namespace-anchor->namespace anch)])
         (let ([ex (expand 'e)])
           (syntax->datum ex)))]))
and then enter this at the REPL:
(tc-expr/expand (+ 3 3))
you get the result:
(#%app + '3 '3)
as expected.
If you put the call in the definitions window instead, you get this error:
compile: bad syntax; function application is not allowed, because no
#%app syntax transformer is bound in: (+ 3 3)
This discrepancy seems problematic.
Second, in the new regime, how can I accomplish what this macro is
trying to do, since the current version no longer works?
Thanks,
-- 
sam th
samth at ccs.neu.edu