[racket] Define-type language form, and macros
So it looks like there are a lot more complicated things going on in
define-type and type-case than I naively tried to implement myself. It's
probably safer to just do the nice (require (only-in)) thing and not
reinvent a worse version of the wheel. Although I did get my particular
define-syntax to work as I wanted it to, I'm guessing it could be used in
more interesting ways than I anticipated, and cause things to break horribly
in ways I don't want.
Thanks for the tips!
Jeremy
On Sun, Sep 11, 2011 at 1:06 PM, Danny Yoo <dyoo at cs.wpi.edu> wrote:
> On Sun, Sep 11, 2011 at 1:44 PM, Jeremy Kun <kun.jeremy at gmail.com> wrote:
> > Is there an existing Racket analogue for the "define-type" language form
> > from the PLAI text?
>
> You can pull out specific things from a language or module by using:
>
> (require (only-in some-module
> language-feature-1 language-feature-2 ...))
>
>
> In particular, it looks like you want to pull some of the features of
> the PLAI language
>
> http://docs.racket-lang.org/plai/plai-scheme.html
>
> into vanilla racket. Yup, that should work!
>
>
> For example:
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> #lang racket
>
> (require (only-in plai
> define-type
> type-case))
>
> (define-type expr
> [num (val integer?)]
> [sum (lhs expr?)
> (rhs expr?)])
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>
>
>
> > Or
> > perhaps, is there a way for me to look at the original syntax definitions
> so
> > I can puzzle ovdrer how it's done?
>
> The PLAI language is written in Racket itself, so you're always
> welcome to look at how it's implemented. I think it starts around
> here:
>
> https://github.com/plt/racket/tree/master/collects/plai
>
> You'll see in
> https://github.com/plt/racket/blob/master/collects/plai/main.rkt
> that the implementation is made of two modules, one that implements
> the datatype stuff, and the other the testing harness. The datatype
> library itself (
> https://github.com/plt/racket/blob/master/collects/plai/datatype.rkt)
> looks... well.. substantial... :) Might take a while to understand
> how it all fits together. We can talk about it more if you'd like.
>
>
>
> [cutting your macro code]
>
> > I get an interesting error along the lines of
> >
> > define-values: illegal use (not at top-level) in: (define-values...
> >
> > I'm guessing it has something to do with the rule that a define-syntax
> isn't
> > allowed to change the surrounding lexical scope
>
> Yeah; there are certain syntactic contexts
>
> [see:
> http://docs.racket-lang.org/reference/syntax-model.html#(part._expand-context-model)
> for gory details]
>
> where you're not allowed to have a define-syntax. Expression position
> is one of them. The arguments to values are in expression context.
> You probably want to use 'begin' here instead, unless I'm
> misunderstanding your code?
>
>
>
>
> > On another note, is there a nice way for me to print out the literal
> > expansion performed by define-syntax?
>
> Have you tried the macro debugger tool in DrRacket yet? The macro
> debugger at the DrRacket toolbar lets you step through macro
> expansion.
>
> There are also tools in:
>
> http://docs.racket-lang.org/macro-debugger/index.html
>
> that may help.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20110911/cb4a8539/attachment.html>