Я сбит с толку, пытаясь создать эквивалент этого тривиального (в Common Lisp) макроса в схеме MIT:
(defmacro funcify (exp)
`(lambda (x) ,exp))
Это простой персональный проект, решатель числовых уравнений, основанный нафункции встроены во второй лекции SICP.Мне все равно, что этот макрос не является "безопасным" или "гигиеническим" или будет захватывать переменную, если exp ссылается на любые символы, кроме 'x.Я хотел бы иметь возможность написать
(solv '(* 60 x) '(* 90 (- x 1)))
, где solv:
(define (solv lh-exp rh-exp)
(solve (funcify lh-exp) (funcify rh-exp)))
вместо необходимости набирать
(solve (lambda (x) (* 60 x)) (lambda (x) (* 90 (- x 1))))
Но не могу понятькак это сделать, используя синтаксические правила MIT Scheme.
Я пробовал это, но это не работает:
(define-syntax funcify
(syntax-rules ()
((funcify y) (lambda (x) y))))
;Value: funcify
(funcify x)
;Value 17: #[compound-procedure 17]
((funcify x) 10)
;Unbound variable: x
Я пробовал другие вещи, которые, вероятно, не стоит упоминатьeval
но безрезультатно.
Кроме того, ссылки на хорошие учебные пособия (не ссылки) по макросистеме Схемы, которые начинаются с небольших простых примеров и строятся с достаточным количеством комментариев и, в частности, показывают, как преобразовать обратную цитатуМакросы LISP в стиле запятой (которые для меня очень интуитивно понятны) для макросовой системы синтаксиса Схемы были бы великолепны.