宏可以用Scheme编写(例如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 :(得分: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)
。
答案 1 :(得分: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 ...))))
答案 2 :(得分:0)
要说明答案是如何解决的:
(op 1 2 3 4)
这是一个包含4个语句的操作,因此第二个案例选择a = 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个语句的bop,所以a =(bop(bop 1 2)3),b = 4,并且完成了。