Как написать макрос схемы MIT для возврата лямбда-формы?

Я сбит с толку, пытаясь создать эквивалент этого тривиального (в 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 было бы здорово.

8
задан Bogatyr 12 October 2011 в 17:01
поделиться