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

Re: [Scheme-reports] Formal Response #382: Allow "if" to accept arbitrarily many if-then pairs

Earlier today, John Boyle wrote:
> [...]
> As you show, it is possible to define "if" to be used at
> compile-time, but this is not satisfactory because the macros I
> proceed to define, using if, will not be usable at compile-time to
> define a third set of macros.  I could (for-syntax <define the
> second set of macros>), which would make them available at
> compile-time, but that would not succeed because "if" does not have
> the right definition at phase 2 (used when defining macros for
> compile-time).  This could be fixed by (for-syntax (for-syntax
> <define if the way I want>)).  However, if I wanted to define more
> macros that depended on the third set, I would need to (for-syntax
> (for-syntax <define second set of macros>)), and (for-syntax
> (for-syntax (for-syntax <define if>))).  And so on.  I considered
> some schemes like defining a "define-macro" procedure that would
> write all previous definitions to a file and require it
> (for-syntax), but decided this was getting ridiculous--these are the
> insane workarounds I mentioned.

There's no need for that -- you can just use one definition and put it
in a file:

  #lang racket/base
  (provide (except-out (all-from-out racket/base) if)
           (rename-out [my-if if]))
  (define-syntax my-if ...)

And then you just `require' that one file into any level that you
need.  This is just like using `racket/base' which doesn't give you
any real language at the macro level so you explicitly prefix the code
with a (require (for-syntax racket/base)) -- you'll get the same
thing, only using your own language like that.

Earlier today, John Boyle wrote:
> [...] (There are still two namespaces, but that can be dealt
> with--at worst, using binding and assignment constructs that affect
> both namespaces.)

That's a very dangerous path.  You'll need to redefine huge parts of
the language.  For example, if you add some `define' macro that does
both `defun' and `defvar', you still get weird behavior when you use

          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
                    http://barzilay.org/                   Maze is Life!

Scheme-reports mailing list