2008-12-04 3 views
5

Может макрос быть написана на схеме (с define-syntax, например), которые будут принимать такие выражения, как это:Схема Macro для гнездования выражений

(op a b c d e f g h i j) 

И выход выражения, как это как выход?

(op (op (op (op (op (op (op (op (op a b) c) d) e) f) g) h) i) j) 

Конечно, для произвольной длины. Я не могу придумать способ сделать это, учитывая некоторый шаблон, как это:

(define-syntax op 
    (syntax-rules() 
    [(_) 'base-case] 
    [(v1 v2 ...) 'nested-case??])) 
+0

Мне любопытно. Это просто вопрос теоретического интереса или у вас есть интересный случай использования? В общем, такая упаковка будет достигнута с помощью foldLeft. – namin 2008-12-04 20:34:39

+0

hmm, хороший пункт. Я в основном спросил об этом, потому что я не думал о вашем пути = P. я не понимал, что это именно то, что делает склад. – Claudiu 2008-12-10 20:32:20

ответ

6
(define bop list) 

(define-syntax op 
    (syntax-rules() 
    ((op a b) (bop a b)) 
    ((op a b c ...) (op (bop a b) c ...)))) 

Например, (op 1 2 3 4) расширяется (bop (bop (bop 1 2) 3) 4) и вычисляет (((1 2) 3) 4).

0

Чтобы показать, как ответ работает:

(op 1 2 3 4) 

Это оп 4 заявления, так что второй случай получает выбран с = 1, B = 2, с = 3, ... = 4:

(op (bop 1 2) 3 4) 

Это операционная система с тремя операторами, поэтому второй случай снова. а = (BOP 1 2), б = 3, с = 4:

(op (bop (bop 1 2) 3) 4) 

Теперь это BOP с 2 заявления, так что а = (BOP (BOP 1 2) 3), B = 4, и готово.

1

Функция, которую вы хотите применить к аргументам, сама должна быть аргументом для макроса. Не имея этого, мое решение было таким же.

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

 Смежные вопросы

  • Нет связанных вопросов^_^