Next: iklib syntaxes infix, Previous: iklib syntaxes try, Up: iklib syntaxes [Index]
When the use of a splice-first-expand
syntax appears as first
subform of an enclosing form, ?form must have the format:
(?rator ?rand ...)
and it is spliced in the enclosing form, then the result is expanded:
((splice-first-expand (?rator ?rand ...) ?arg ...) → (?rator ?rand ... ?arg ...)
When the use of a splice-first-expand
syntax appears as second or
subsequent subform: it expands into ?form itself, which is then
expanded:
(splice-first-expand ?form) → ?form
This syntax must be used with care.
Usage examples:
(import (vicare)) (splice-first-expand 123) ⇒ 123 (splice-first-expand (+ 1 2)) ⇒ 3 ((splice-first-expand (+)) 1 2) ⇒ 3 ((splice-first-expand (+) 1 2) 3 4) → (+ 1 2 3 4) (let-syntax ((doit (syntax-rules () ((_ ?arg ...) (+ (square ?arg) ...))))) ((splice-first-expand (doit 1 2)) 3 4)) → (+ (square 1) (square 2) (square 3) (square 4)) (let-syntax ((arg1 (identifier-syntax 1)) (arg2 (identifier-syntax 2)) (doit (syntax-rules () ((_ ?arg ...) (+ (square ?arg) ...))))) ((splice-first-expand (doit arg1 arg2)) 3 4)) → (+ (square 1) (square 2) (square 3) (square 4)) (let*-syntax ((arg1 (identifier-syntax 1)) (arg2 (identifier-syntax 2)) (doit (syntax-rules () ((_ ?arg ...) (+ (square ?arg) ...)))) (flop (syntax-rules () ((_ ?arg ...) (splice-first-expand (doit arg1 ?arg ...)))))) ((flop arg2) 3 4)) → (+ (square 1) (square 2) (square 3) (square 4)) (let*-syntax ((arg1 (identifier-syntax 1)) (arg2 (identifier-syntax 2)) (doit (syntax-rules () ((_ ?arg ...) (+ (square ?arg) ...)))) (flop (syntax-rules () ((_ ?arg ...) (splice-first-expand (doit arg1 ?arg ...))))) (flip (syntax-rules () ((_ ?arg ...) (flop ?arg ...))))) ((flip arg2) 3 4)) → (+ (square 1) (square 2) (square 3) (square 4))