helper macro construct-from-string for srfi-108
Per Bothner 21 Mar 2013 06:34 UTC
[Sorry for the long quiet - among other issues I just
sold my house, which got a bit crazy at times.]
In the current draft (http://per.bothner.com/tmp/srfi-108/srfi-108.html)
section "Resolving to constructor" I suggest a common use-case would
be to implement
&cname[pre-exp ...]{abc&[infix-exp1]def&[infix-exp2]...xyz}
as
(cname-maker pre-exp ... &{abc&[infix-exp1]def&[infix-exp2]...xyz})
I.e. map &cname to a "constructor function" cname-maker that
takes a string build from the non-initial arguments. I figure this
handles a common use-case in a flexible way, and in a way that
builds on SRFI-109. I've implemented a macro
'constructor-from-string' to make such mapping easier.
The idea is that you could implement $construct$:cname thus:
(define-syntax $construct$:cname
(syntax-rules ()
((_ . args) (construct-from-string cname-maker . args))))
This assumes you also a function cname-maker.
Then:
&cname{abc&(+ 3 4)z} ==> (cname-maker "abc7z")
&cname[id: "n7"]{&(+ 3 4)abc} ==> (cname-maker id: "n7" "7abc")
So my question is:
(1) Is this useful enough to include in the specification?
(I'm obviously leaning towards "yes" here.)
(2) Any suggestions for a better name than construct-from-string?
That name suggests a "constructor function", but it's really
a macro to simplify writing constructor bindings, so it's not
a good name.
(3) Other tweaks to the API beside the name?
FWIW here is the implementation. It assumes initial arguments,
if any, are ended by the symbol $>>$.
(define-syntax construct-from-string
(syntax-rules ()
((_ fun . args) (%construct-from-string-builder fun () . args))))
(define-syntax %construct-from-string-builder
(syntax-rules ($<<$ $>>$)
((%construct-from-string-builder fun (seen ...) $<<$ . rest)
(fun ($string$ seen ... $<<$ . rest)))
((%construct-from-string-builder fun (seen ...) $>>$ . rest)
(fun seen ... ($string$ . rest)))
((%construct-from-string-builder fun (seen ...) x . rest)
(%construct-from-string-builder fun (seen ... x) . rest))
((%construct-from-string-builder fun (seen ...))
(fun seen ...))))
--
--Per Bothner
xxxxxx@bothner.com http://per.bothner.com/