5

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

3 回答 3

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)

于 2008-12-04T11:40:47.687 回答
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 ...))))
于 2008-12-10T20:27:26.263 回答
0

为了显示答案是如何产生的:

(op 1 2 3 4)

这是一个有 4 条语句的操作,所以第二种情况被选择为 a=1, b=2, c=3, ...=4:

(op (bop 1 2) 3 4)

这是一个有 3 条语句的操作,所以又是第 2 种情况。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,就完成了。

于 2008-12-04T18:52:52.137 回答