用于生成函数的宏

时间:2018-09-01 15:52:00

标签: macros scheme chez-scheme

我正在尝试编写一些用于整数约束编程的宏,具体地说,我正在尝试扩展

(int-constr (x y z) 
        (< 10  
       (+
        (* x 4)
        (* y 5)
        (* z 6)))
    (> 10
       (+
        (* x 1)
        (* y 2)
        (* z 3))))

进入

(let ((x (in-between 0 1))
      (y (in-between 0 1))
      (z (in-between 0 1)))
  (assert  
   (and (< 10  
           (+
            (* x 4)
            (* y 5)
            (* z 6)))
        (> 10
           (+
            (* x 1)
            (* y 2)
            (* z 3)))))
  (list x y z))

当递归使用语法规则时,我可以在开始时创建嵌套的let,但是我认为我无法在末尾调用参数列表。有什么办法吗?

1 个答案:

答案 0 :(得分:1)

即使仅坚持使用syntax-rules,也可以使用省略号轻松编写此宏。这是您描述的行为的一种实现方式:

(define-syntax int-constr
  (syntax-rules ()
    ((_ (x ...) constr ...)
     (let ((x (in-between 0 1)) ...)
       (assert (and constr ...))
       (list x ...)))))

由于省略号可以用来重复包含模式变量的表单,而不仅仅是它们自己重复简单的模式变量,因此此宏具有很好的声明性,并且易于读取和编写。