嵌套表达式
问题描述:
计划宏可以宏被写入方案(与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??]))
答
(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)
。
答
要显示的答案是如何工作的:
(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完成。
答
要应用于参数的函数本身应该是宏的参数。除此之外,我的解决方案是一样的。
#!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 ...))))
我很好奇。这只是一个理论上的兴趣问题,还是你有一个有趣的用例?一般来说,这种包装将通过foldLeft来实现。 – namin 2008-12-04 20:34:39
嗯,好点。我主要问这个,因为我没有想到你的方式= P。我没有意识到这正是foldl所做的。 – Claudiu 2008-12-10 20:32:20