[racket] Lesson from the macro exercise

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Tue Oct 12 08:17:45 EDT 2010

syntax/parse!  :)


On Tue, Oct 12, 2010 at 3:46 AM, Jens Axel Søgaard
<jensaxel at soegaard.net> wrote:
> There have now been several solutions to the macro exercise.
> Is there a systematic approach of deriving a solution?
> Here are some steps that could be included in a macro writing recipe.
> 1.  Write some examples with their expected results.
>     Remember corner cases
>     (Get to know the semantics. Are all cases made explicit?)
> 2.  Write some examples of errorneous usage of the macro.
>     (Get to know the syntax. Write down a BNF if it is missing.)
>     Write down the corresponding error messages. Word them
>     in terms of the macro construct.
> 3.  Manually write your examples in code without using
>     the construct you are about to define. If a construct
>     with a similar behavior already exists, use it.
> 4.  Look for a pattern to determine how the macro expands.
>     (It helps to name the various subexpressions.)
> 5.  Implement the macro
>     5a. Use syntax-case and with-syntax to give names to
>          parts of your input.
>     5b. Use generate-temporaries to generate new names.
>     5c. Use define-syntax-parameter and syntax-parameterize if your
>          macro uses a new keyword.
>     5d. Use raise-syntax-error to signal syntax errors.
>          Use the 3rd argument of raise-syntax-error to make the error
> location precise.
>     5e. Use define-for-syntax to define helper functions.
> 6. Test your macro.
>    Use all examples from 1.
>    Test the case where your macro is used in the output of another macro.
> Note: syntax-rules macros are not the best choice for informative
> error messages.
> --
> Jens Axel Søgaard
> _________________________________________________
>  For list-related administrative tasks:
>  http://lists.racket-lang.org/listinfo/users

Posted on the users mailing list.