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 <[email protected]> wrote: > On Sun, Sep 11, 2011 at 1:44 PM, Jeremy Kun <[email protected]> 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. >
_________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users

