scheme macros nested define-syntax

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