2008-12-04 92 views
5

计划宏可以宏被写入方案(与define-syntax,例如)将采取类似这样的表述:嵌套表达式

(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

嗯,好点。我主要问这个,因为我没有想到你的方式= P。我没有意识到这正是foldl所做的。 – 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,C = 3,... = 4:

(op (bop 1 2) 3 4) 

这是一个有3个语句的操作,所以第二个例子再次。 A =(BOP 1 2),B = 3,C = 4:

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

现在,这是用2条语句,所以A =(BOP(BOP 1 2)3)中,b = 4,和一个BOP完成。

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