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 :)

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top