Estoy desconcertado al tratar de crear el equivalente de esta macro trivial (en Common Lisp) en el MIT Esquema:¿Cómo se escribe una macro Scheme MIT para devolver un formulario lambda?
(defmacro funcify (exp)
`(lambda (x) ,exp))
Se trata de un simple proyecto personal, una ecuación numérica solucionador basa en las funciones incorporadas en la segunda conferencia SICP. No me importa que esta macro no sea "segura" o "higiénica" o capturará una variable si el exp hace referencia a cualquier símbolo que no sea 'x'. Me gustaría ser capaz de escribir
(solv '(* 60 x) '(* 90 (- x 1)))
donde solv es:
(define (solv lh-exp rh-exp)
(solve (funcify lh-exp) (funcify rh-exp)))
en lugar de tener que escribir
(solve (lambda (x) (* 60 x)) (lambda (x) (* 90 (- x 1))))
Pero no puede encontrar la manera de hacer esto utilizando Reglas de sintaxis del esquema MIT.
He intentado esto pero no funciona:
(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
He intentado otras cosas probablemente no vale la pena mencionar que implica eval
pero fue en vano.
Además, referencias a buenos tutoriales (no referencias) en el sistema macro de Scheme que comienzan con pequeños ejemplos simples y compilación, con amplios comentarios, y en particular muestran cómo convertir macros LISP estilo comas de comilla inversa (que a mí altamente intuitivo) al sistema de macros de sintaxis de Scheme sería genial.
+1 para la implementación de ER (que es compatible con el Esquema MIT). :-) –
@ ChrisJester-Young Gracias por la corrección de errores. :) –
+1. Gracias un montón. define-sintaxis es completamente desconcertante, pero sospecho que es muy poderoso, me gustaría aprenderlo mejor, ¿alguna referencia para acelerarlo? Estoy aceptando tu respuesta porque da una función que funciona en el Esquema MIT, ojalá pudiera aceptar la respuesta de Chris porque también señala que solv también debe ser una macro de reglas de sintaxis. – Bogatyr