Macros 生成函数的宏
我正试图为整数上的约束编程编写一些宏,特别是我正在尝试扩展Macros 生成函数的宏,macros,scheme,chez-scheme,Macros,Scheme,Chez Scheme,我正试图为整数上的约束编程编写一些宏,特别是我正在尝试扩展 (int-constr (x y z) (< 10 (+ (* x 4) (* y 5) (* z 6))) (> 10 (+ (* x 1) (* y 2) (* z 3)))) (内部构造(x y z) (< 10 (+ (*x4) (*y 5) (*z 6)))
(int-constr (x y z)
(< 10
(+
(* x 4)
(* y 5)
(* z 6)))
(> 10
(+
(* x 1)
(* y 2)
(* z 3))))
(内部构造(x y z)
(< 10
(+
(*x4)
(*y 5)
(*z 6)))
(> 10
(+
(*x1)
(*y 2)
(*z3)))
进入
(let((x(介于0和1之间))
(y(介于0和1之间))
(z(介于0和1之间)))
(断言
(和(<10
(+
(*x4)
(*y 5)
(*z 6)))
(> 10
(+
(*x1)
(*y 2)
(*z 3(())))
(列表x y z))
当递归地使用语法规则时,我可以在开始时创建嵌套let,但我认为我失去了在结尾调用参数列表的可能性。有什么办法吗?即使只是坚持语法规则,这个宏也很容易用省略号编写。以下是您描述的行为的实现:
(define-syntax int-constr
(syntax-rules ()
((_ (x ...) constr ...)
(let ((x (in-between 0 1)) ...)
(assert (and constr ...))
(list x ...)))))
因为省略号可以用来重复包含模式变量的表单,而不仅仅是重复简单的模式变量,所以这个宏是非常声明性的,并且读写都很简单
(define-syntax int-constr
(syntax-rules ()
((_ (x ...) constr ...)
(let ((x (in-between 0 1)) ...)
(assert (and constr ...))
(list x ...)))))