在宏变换器中,是否可以将定义提升到顶层?

时间:2016-03-24 16:59:04

标签: macros lisp acl2

在ACL2宏变换器中,是否可以将函数定义提升到顶层?

我尝试设计一个宏public class Assigment10 { public static void main(String[] args) { for(int i = 1; i < 7; i++) { System.out.print(i + " "); } for(int i = 2; i < 8; i++) { System.out.print(i + " "); } for(int i = 3; i < 9; i++) { System.out.print(i + " "); } for(int i = 4; i < 10; i++) { System.out.print(i + " "); } for(int i = 5; i < 11; i++) { System.out.print(i + " "); } } } ,可以在给定env GOOS=linux GOARCH=amd64 go build -v github.com/constabulary/gb/cmd/gb 函数时定义下面的let-map等函数。

如果我只关心顶级,我可以使用map-double宏执行此操作。但是,我希望这个宏能够在嵌套在另一个表达式中的上下文中调用。例如:

double

我希望define-map宏定义一个函数(defunc double (x) :input-contract (rationalp x) :output-contract (rationalp (double x)) (* 2 x)) (let-map map-double double (map-double (list 1 2 3))) ;(LIST 2 4 6) ;; I would want nested calls to work as well: (let-map double-all-1d double (let-map double-all-2d double-all-1d (double-all-2d (list (list 1 2 3) (list 4 5) (list 6))))) ;(LIST (LIST 2 4 6) (LIST 8 10) (LIST 12)) ,然后返回正文的结果,在这种情况下调用let-map。我尝试使用map-double来定义此内容,但我的(map-double (list 1 2 3))函数是递归的,因此flet不起作用。

map-double

我会使用flet,但ACL2不支持。

因此,为了允许递归,我想将(defmacro let-map (map-f f body) `(flet ((,map-f (lst) (cond ((endp lst) (list)) (t (cons (,f (first lst)) ; doesn't work because ; `flet` doesn't support recursion (,map-f (rest lst))))))) ,body)) (我使用此宏时labels)的定义提升到顶层。这在ACL2宏系统中是否可行?

在像球拍这样的系统中,我会使用类似syntax-local-lift-expression的功能来执行此操作。 ACL2中有类似的形式吗?

0 个答案:

没有答案