Macros 在宏转换器中,是否可以将定义提升到顶层?
在ACL2宏转换器中,是否可以将函数定义提升到顶层 我正在尝试设计一个宏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
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中没有函数或宏定义。因此,要模拟类似于标签的表单,我想知道是否可以从宏转换器内部将函数定义提升到顶层。