在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中有类似的形式吗?