嵌套表达式的Scheme宏

时间:2008-12-04 10:50:15

标签: scheme macros nested define-syntax

宏可以用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??]))

3 个答案:

答案 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,并且完成了。