Re: [RFC] alist-let: let-like alist destructuring syntax
siiky 30 Jun 2022 15:54 UTC
Hi again,
Sorry for the long silence.
I now have a better idea of a syntax that I think would be good:
(alist-let ALIST ((VAR KEY [DEFAULT [EQUAL?]]) ...)
BODY ...)
I spent some time trying to write an implementation and this is what I
have working:
(define (alist-values alist . keys)
(chain keys
(map (cute alist-ref <> alist equal?) _)
(apply values _)))
(define-syntax alist-let
(syntax-rules ()
((alist-let alist ((var key) ...)
body ...)
(receive (var ...) (alist-values alist key ...)
body ...))))
(Not impressive, I know... It's the most basic functionality, with no
way to provide a default value or equality test. Still, Marc's
suggestion take advantage of receive with an alist-values greatly
simplifies things!)
Most of the time I spent was actually trying to implement an
alist-values that supports an optional default value but with no luck...
I hit the limit of my macrology, apparently. (Sending that failed
attempt attached in case anyway wants to give it a go)
The problem with it is that symbols 'sym match (key default) as
(quote sym) in the following clause:
(_ "add-defaults" (tmp-list ...) alist ((key default) keys ...))
And so I have to no way to tell appart ('foo "some default") from 'foo.
siiky