The difficulty is using the newly defined "if" in the definition of
low-level macros, or otherwise at compile-time.  This seems to be due to
Racket's phase separation.  Is there a way to turn that off?

#lang racket

(require syntax/parse/define)
(define-simple-macro (if (~seq test result) ... final)
  (cond [test result] ... [else final]))

(if (even? 7) "seven" (odd? 8) "eight" "neither")

(require mzlib/defmacro)

(defmacro meh (x)
  (if (> x 5)
      1
      (> x 2)
      2
      3))

Running this in DrRacket produces:

if: bad syntax;
 has 5 parts after keyword in: (if (> x 5) 1 (> x 2) 2 3)

The same happens if you put (begin-for-syntax (if #f 1 #f 2 3)) or
(define-for-syntax n (if #f 1 #f 2 #f 3)) after your supplied definition.
(For those not familiar, the "-for-syntax" forms in Racket execute things
at compile-time, or I believe "phase 1" rather than "phase 0".)  However,
it works to use "if" with three arguments there: it is using the built-in
definition of "if", which appears to be present at all of Racket's
compilation phases by default.

What I want is the intermixing of runtime and compilation time that the
phase separation seems determined to prevent (e.g. define a macro, use that
macro in the definition--not expansion--of another macro, use that macro in
the definition of another macro, and so on).  I tried this a long time ago
and became convinced it was impossible without insane workarounds.
--John Boyle
*Science is what we understand well enough to explain to a computer. Art is
everything else we do.* --Knuth



On Thu, Oct 11, 2012 at 6:54 PM, Sam Tobin-Hochstadt <[email protected]>wrote:

> On Thu, Oct 11, 2012 at 9:29 PM, John Boyle <[email protected]>
> wrote:
> > While all Schemes I've tested that support define-syntax do allow
> > redefinition of "if"... on Racket, it does not play well with low-level
> > macros (using datum->syntax, or the "mzlib/defmacro" library) due to
> their
> > phase-separation.
>
> This is somewhat off-topic for the formal comment, but it's quite easy
> to do this in Racket:
>
> #lang racket ;; https://gist.github.com/3876906
>
> (require syntax/parse/define)
> (define-simple-macro (if (~seq test result) ... final)
>   (cond [test result] ... [else final]))
>
> (if (even? 7) "seven" (odd? 8) "eight" "neither")
>
> I'm not sure what difficulty you ran into, but it shouldn't be
> necessary to use `datum->syntax`, `defmacro`, or any other low-level
> features.
> --
> sam th
> [email protected]
>
_______________________________________________
Scheme-reports mailing list
[email protected]
http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports

Reply via email to