Jeffrey Meunier tiene una macro Curry implícita here, que usa defmacro. Me preguntaba si alguien ha escrito esto con reglas de sintaxis.Currying implícito en Scheme with syntax-rules?
Respuesta
Hay una serie de implementaciones de curry para Scheme: ninguna puede ser tan elegante como Haskell, ya que sus funciones son siempre unarias, por lo que todo se puede curry. (Pero esto puede por supuesto implementarse en un Esquema suficientemente poderoso como Racket.)
En cuanto a la macro que ha desenterrado, es bastante mala: no solo utiliza una macro antihigiénica, sino que también llamando al eval
explícitamente, y se basa en una implementación de entornos, etc. Pero es fácil hacerlo con una simple macro syntax-rules
. AFAICT, esto es lo que implementa:
(define-syntax-rule (clambda (x ... . r) b ...)
(let ([len (length '(x ...))] [real (lambda (x ... . r) b ...)])
(let loop ([argss '()] [n 0])
(lambda args
(let ([n (+ n (length args))] [argss (cons args argss)])
(if (>= n len)
(apply real (apply append (reverse argss)))
(loop argss n)))))))
Pero hay una nota importante aquí. La página a la que hace referencia dice que un problema de la versión de la función es que es explícita, pero también tiene una ventaja importante: con la implementación de la macro debe definir una función usando clambda
, mientras que la versión funcional se puede usar con cualquier función. En muchas implementaciones de Scheme hay instalaciones para inspeccionar el valor de una función, y al usar esto es posible implementar una versión de la función currying que sabe cuándo llamar a la función original.
- 1. decorador en Python currying
- 2. javascript currying
- 3. operadores matemáticos Currying en Scala
- 4. F # currying efficiency?
- 5. Tubería, Composición y Currying
- 6. entendimiento implícito en Scala
- 7. parámetro implícito en Scalaz
- 8. ¿Operador implícito?
- 9. RAII en Scheme?
- 10. Loop en PLT Scheme
- 11. Usando Let in Scheme
- 12. ¿Hay alguna forma de currying en C?
- 13. Scala, currying y la sobrecarga
- 14. Haskell - ¿Currying? Necesita más explicación
- 15. explícito e implícito C#
- 16. Implícito DataTemplate no funciona
- 17. implícito constructor de copia
- 18. ¿Cómo funciona `let` en Scheme?
- 19. ¿Cómo hago exponentes en Scheme?
- 20. Parcial Application with Infix Functions
- 21. Guile Scheme and CGI?
- 22. PLT-Scheme learning reference
- 23. iOS URL Scheme Length
- 24. MIT Scheme REPL history
- 25. Scheme Project Ideas
- 26. ¿Cuáles son las ventajas prácticas del currying?
- 27. Currying out of order in Haskell
- 28. android custom url scheme ..?
- 29. Scheme define/lambda taquigrafía
- 30. ¿Currying es lo mismo que sobrecargar?