В вашем примере
(match-letrec (((x y) (list 1 (lambda () (list a x))))
((a b) (list 2 (lambda () (list x a)))))
(append (y) (b))
=> (2 1 1 2)
отсутствует закрывающая скобка.
После исправления вот что происходит:
> (match-letrec (((x y) (list 1 (lambda () (list a x))))
((a b) (list 2 (lambda () (list x a)))))
(append (y) (b)))
. match: syntax error in pattern in: ((x y) (a b))
Даже match-let не работает
> (match-let (((x y) (list 1 2)))
x)
. match: syntax error in pattern in: (x y)
вот как это исправить:
(define-syntax match-let
(syntax-rules (list)
((_ ((pat expr)) . body)
(match expr (pat . body)))
((_ ((pat expr) ...) . body)
(match (list expr ...) ((pat ...) . body)))
((_ loop . rest)
(match-named-let loop () . rest))
))
теперь вы можете сделать это:
> (match-let (((list x y) (list 1 2)))
(list x y))
'(1 2)
letrec все еще не работает
> (match-letrec (((list x y) (list 1 (lambda () (list a x))))
((list a b) (list 2 (lambda () (list x a)))))
(append (y) (b)))
. match: syntax error in pattern in: ((list x y) (list a b))
но это должно сделать вас на шаг ближе, не стесняйтесь задавать новый вопрос с примером рабочего кода, как только вы поймете эти изменения.