Я написал следующее правило синтаксиса:
(define-syntax match-rewriter
(syntax-rules ()
((_ (patt body) ...)
(λ (x) (match x (patt body) ... (_ x))))))
, что, по сути, match-lambda
, за исключением того, что оно возвращает свой аргумент, если совпадение не найдено, а не выдает исключение.
Теперь я хочу написать функцию let_as_lambda
, которая будет принимать строки исходного кода в качестве входных данных и переписывать операторы let
как новую функцию let_as_lambda
. Вот что у меня есть:
(define let_as_lambda
(match-rewriter (`(let((,<var> ,<val>)) ... ,<expressions>)
`((lambda (,<var> ...) ,<expressions>) ,<val> ...))))
Это явно неправильно, как:
(let_as_lambda '(let((x 3)) (+ x 2)))
возвращается:
'((λ ((x) ...) (+ x 2)) (3) ...)
по-прежнему показывает эллипсы и с «3» в скобках. Я считаю, что моя проблема в том, что я не понимаю правильное использование символов `
, .
и ,
в сопоставлении с образцом.
Если бы кто-то мог показать мне правильный способ сделать это, это было бы очень признательно.
Спасибо.