Next: , Previous: , Up: iklib syntaxes   [Index]


6.8.21 Inspecting expansion results

Syntax: expansion-of ?expr

This syntax is mostly for interactive use. Fully expand the given expression in the current lexical environment and return a symbolic expression representing the resulting invoke code. The expression is not evaluated, only expanded; this means that the expansion side effects are performed.

As a special case if ?expr is recognised as a define or define* syntax use:

(define  . ?stuff)
(define* . ?stuff)

the expansion will be performed as if ?expr is:

(internal-body (define  . ?stuff) (void))
(internal-body (define* . ?stuff) (void))

and the definition extracted from the result and reformatted.

Example session at the REPL:

vicare> (import (vicare expander tags))
vicare> (print-gensym #f)

vicare> (expansion-of (+ 1 2))
$1 = ((primitive +) (quote 1) (quote 2))

vicare> (expansion-of (lambda (a b) (+ a b)))
$1 = (lambda (a b) ((primitive +) a b))

vicare> (internal-body
          (define-syntax (doit stx)
            (syntax-case stx ()
              ((_ ?a ?b)
               #'(vector ?a ?b))))
          (expansion-of (doit 1 2)))
$1 = ((primitive vector) (quote 1) (quote 2))

vicare> (expansion-of (define (fun a) (+ 1 a)))
$1 = (define fun (lambda (a) ((primitive +) (quote 1) a)))
Syntax: visit-code-of ?macro-id

This syntax is mostly for interactive use. Given the identifier of a locally defined macro keyword: expand into a quoted symbolic expression representing the expanded macro transformer.

Example session at the REPL:

vicare> (print-gensym #f)
vicare> (define-syntax syn (lambda (stx) #'(void)))
vicare> (visit-code-of syn)
$1 = (lambda (stx) #<syntax expr=(void))
Syntax: expansion-of* ?expr0 ?expr

Like expansion-of, but wrap the input expression as follows:

(internal-body ?expr0 ?expr … (void))

this allows the expansion of definition forms.


Next: , Previous: , Up: iklib syntaxes   [Index]