Scheme Macro para expresiones de anidamiento
macros nested (3)
¿Puede una macro estar escrita en Scheme (con define-syntax
, por ejemplo) que tomará expresiones como esta:
(op a b c d e f g h i j)
¿Y ceder expresiones como esta como salida?
(op (op (op (op (op (op (op (op (op a b) c) d) e) f) g) h) i) j)
Por supuesto, para longitudes arbitrarias. No puedo pensar en una manera de hacerlo, dado una plantilla como esta:
(define-syntax op
(syntax-rules ()
[(_) ''base-case]
[(v1 v2 ...) ''nested-case??]))
Para mostrar cómo funciona la respuesta:
(op 1 2 3 4)
Esta es una operación con 4 instrucciones, por lo que el segundo caso se selecciona con a = 1, b = 2, c = 3, ... = 4:
(op (bop 1 2) 3 4)
Esta es una operación con 3 declaraciones, por lo que el segundo caso nuevamente. a = (bop 1 2), b = 3, c = 4:
(op (bop (bop 1 2) 3) 4)
Ahora bien, este es un bop con 2 afirmaciones, entonces a = (bop (bop 1 2) 3), b = 4, y listo.
(define bop list)
(define-syntax op
(syntax-rules ()
((op a b) (bop a b))
((op a b c ...) (op (bop a b) c ...))))
Por ejemplo, (op 1 2 3 4)
expande a (bop (bop (bop 1 2) 3) 4)
y se evalúa como (((1 2) 3) 4)
.
La función que desea aplicar a los argumentos debería ser un argumento para la macro. Salvo eso, mi solución fue la misma.
#!r6rs
(import (rnrs base))
(define-syntax claudiu
(syntax-rules ()
((claudiu fun first second)
(fun first second))
((claudiu fun first second rest ...)
(claudiu fun (claudiu fun first second) rest ...))))