On this page:
4.1 Honu syntax
4.2 Low Level Racket Interface
define-honu-syntax

4 Macros

4.1 Honu syntax

A good concrete syntax for honu macros is still under development.

4.2 Low Level Racket Interface

A Honu macro can be defined in Racket using define-honu-syntax.

syntax

(define-honu-syntax name function)

Defines name to be a honu macro that uses function as the syntax transformer. function should accept two parameters, the first is the syntax tree that follows the macro name in the current input and the second related to the current context but for now is not used.

function should return 3 values using values.
  • a new syntax object that corresponds to the computation performed by the macro

  • the rest of the input syntax that is to be parsed

  • a boolean, #t or #f, that tells the parser whether or not to immediately return the current expression or to continue parsing.

Macro’s should use syntax-parse to pattern match on their input although this is not strictly necessary. Honu provides the syntax class honu-expression from honu/core/parse2 that will re-invoke the honu parser and return a single expression. The result of using honu-expression can be accessed with the result attribute.

The definition of the for form for Honu.
(define-honu-syntax honu-for
  (lambda (code context)
    (syntax-parse code #:literal-sets (cruft)
#:literals (honu-= honu-in)
      [(_ iterator:id honu-= start:honu-expression
          honu-to end:honu-expression
          honu-do body:honu-expression .
          rest)
       (values
       #'(for ([iterator
                (in-range
                 start.result
                 end.result)])
        body.result)
        #'rest
        #t)]
      [(_ iterator:id honu-in
          stuff:honu-expression
          honu-do
          body:honu-expression
          .
          rest)
        (values
       #'(for ([iterator stuff.result])
           body.result)
       #'rest
       #t)])))