Я сбит с толку, пытаясь создать эквивалент этого тривиального (в 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.
Я пробовал это, но это не работает:
(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
, но безрезультатно.
Кроме того, ссылки на хорошие учебные пособия (не ссылки) по макросистеме Scheme, которые начинаются с небольших простых примеров и наращиваются с обильными комментариями и, в частности, показывают, как преобразовать макросы LISP в стиле обратной кавычки-запятой (которые для меня очень интуитивно понятны) в Система макросов синтаксиса Scheme была бы замечательной.