Cómo hacer parte de una macro de higiene
Pregunta
Me gustaría tener una versión de lambda
, llamado lambda-r
, dentro de la cual se puede return
.Un ejemplo:
(+ ((lambda-r ()
(return 1)
2)) 5)
Esto daría el valor 6
.Aunque podría esperarse que el valor de 7, 6 porque se devuelve 1 de la lambda-expresión antes de las 2 es alcanzado.
He aquí un ejemplo de la clase de transformación que estoy buscando.Digamos que uno se utilizar lambda-r
de la siguiente manera:
(lambda-r (a b)
(return a)
(+ a b))
Quiero que sea transformado como este:
(call/cc (lambda (k)
(define return (lambda (v)
(k (lambda (a b)
v))))
(lambda (a b)
(return a)
(+ a b))))
Que también podría ser expresada con una expresión en lugar de un interno de definir, pero estoy usando el de definir en aras de la claridad.
Tenga en cuenta que el código de arriba en realidad funcionan como se esperaba. El problema es que estoy teniendo problemas para expresar lambda-r
como macro.La razón es que quiero k
y v
ser higiénicos, pero no quiero return
ser higiénicos.
Mi macro en el momento es este:
(define-syntax lambda-r
(syntax-rules (return)
[(_ (var ...) body ...)
(call/cc (lambda (k)
(define return (lambda (v)
(k (lambda (var ...)
v))))
(lambda (var ...)
body ...)))
]))
Que no funciona porque return
se trata higiénicamente, y como resultado no es directamente visible cuando se utiliza lambda-r
.Así (lambda-r () (return 1))
da un error que dice que return
no es un identificador válido.
Editar:Gracias a Nathan Sanders respuesta, estoy más cerca de la comprensión de lo que tengo que hacer aquí.Sin embargo, yo no comprender plenamente los procedimientos siguientes, y como resultado no ha sido capaz de conseguir este trabajo todavía.Agradecería si pudieras explicar o me dirija a los recursos que explicar lo siguiente:
- el
syntax
procedimiento - el
datum->syntax
/syntax->datum
procedimientos
Editar:No importa - lo tengo ahora :)
Solución
Lo que quiero es que syntax-case
en lugar de syntax-rules
.
El R6RS definición da algunos ejemplos, en particular una sección en la sintaxis-objeto y los datos de conversiones, que es lo que quieres.Usted debe ser capaz de adaptar el loop
w/ break
ejemplo para su return
.