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

Macros 在宏转换器中,是否可以将定义提升到顶层?,macros,lisp,acl2,Macros,Lisp,Acl2,在ACL2宏转换器中,是否可以将函数定义提升到顶层 我正在尝试设计一个宏let map,当给定double函数时,它可以定义如下函数map double 如果我只关心顶层,我可以使用definemap宏来实现这一点。但是,我希望该宏能够在嵌套在另一个表达式中的上下文中调用。例如: (defunc double (x) :input-contract (rationalp x) :output-contract (rationalp (double x)) (* 2 x)) (let

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

我正在尝试设计一个宏
let map
,当给定
double
函数时,它可以定义如下函数
map double

如果我只关心顶层,我可以使用
definemap
宏来实现这一点。但是,我希望该宏能够在嵌套在另一个表达式中的上下文中调用。例如:

(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(列表1 2 3))
。我尝试用
flet
来定义它,但是我的
map double
函数是递归的,所以
flet
不起作用

(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))
我会使用
标签
,但ACL2不支持它

因此,为了允许递归,我想将
map-f
(在我使用这个宏时是
map double
)的定义提升到顶层。这在ACL2宏系统中可能吗


在像racket这样的系统中,我会使用这样的函数来实现这一点。那么ACL2中有类似的形式吗?

我对ACL2了解得不够,但是扩展成
defun
work是否有效?@coredump你是什么意思?我不能直接扩展到
defun
,因为我希望
let map
在嵌套表达式上下文中工作。因此,我想做的是从宏转换器中将
defun
提升到顶层。您不能使用
labels
而不是
flet
,那么?@Svante我没有听说过
labels
,我在ACL2文档中找不到它。显然,它存在于lisp中,但不存在于ACL2中。当我尝试使用它时,错误消息说它在主lisp包中,但它在ACL2中没有函数或宏定义。因此,要模拟类似于
标签的表单,我想知道是否可以从宏转换器内部将函数定义提升到顶层。