Scheme pattern matching -
i have written following syntax rule:
(define-syntax match-rewriter (syntax-rules () ((_ (patt body) ...) (λ (x) (match x (patt body) ... (_ x))))))
which match-lambda
except returns argument if no match found rather throwing exception.
now want write function, let_as_lambda
, take strings of source code input , rewrite let
statements new let_as_lambda
function. have:
(define let_as_lambda (match-rewriter (`(let((,<var> ,<val>)) ... ,<expressions>) `((lambda (,<var> ...) ,<expressions>) ,<val> ...))))
it wrong as:
(let_as_lambda '(let((x 3)) (+ x 2)))
returns:
'((λ ((x) ...) (+ x 2)) (3) ...)
still showing ellipses , "3" in parentheses. believe problem don't understand proper usage of symbols `
, .
, , ,
in pattern matching.
if show me correct way appreciated.
thanks.
you're confused because use 2 different pattern matching tools. first syntax-rules
, second match
. seem close enough there important differences -- , in case, main problem unlike syntax-rules
, cannot use ...
in quasi-quoted results of match
. deal lists of matched values need use unquote-splicing
(or ,@
) , other functions map
etc. example, compare results of these 2 expressions:
(match '(1 2 3) [`(,x ...) `(foo ,x ...)]) (match '(1 2 3) [`(,x ...) `(foo ,@x)])
as side note, nice if usual quasi-quote
want, complete solution needs possible simple functions -- , complicates whole thing (uses of ...
need translate apply
).
Comments
Post a Comment