生成函数的宏
Macros for generating functions
我正在尝试为整数的约束编程编写一些宏,特别是我正在尝试扩展
(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))
递归使用syntax-rules时,我可以在开始时创建嵌套的let,但我想我失去了在最后调用参数列表的可能性。有什么办法吗?
即使只是坚持syntax-rules
,这个宏也很容易通过使用省略号来编写。这是您描述的行为的实现:
(define-syntax int-constr
(syntax-rules ()
((_ (x ...) constr ...)
(let ((x (in-between 0 1)) ...)
(assert (and constr ...))
(list x ...)))))
由于省略号可用于重复包含模式变量的形式,而不仅仅是重复自身的普通模式变量,因此该宏非常具有声明性,并且易于读写。
我正在尝试为整数的约束编程编写一些宏,特别是我正在尝试扩展
(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))
递归使用syntax-rules时,我可以在开始时创建嵌套的let,但我想我失去了在最后调用参数列表的可能性。有什么办法吗?
即使只是坚持syntax-rules
,这个宏也很容易通过使用省略号来编写。这是您描述的行为的实现:
(define-syntax int-constr
(syntax-rules ()
((_ (x ...) constr ...)
(let ((x (in-between 0 1)) ...)
(assert (and constr ...))
(list x ...)))))
由于省略号可用于重复包含模式变量的形式,而不仅仅是重复自身的普通模式变量,因此该宏非常具有声明性,并且易于读写。