В макротрансформаторе возможно ли поднять определение до верхнего уровня?
В макропреобразователе ACL2 возможно ли поднять определение функции до верхнего уровня?
Я пытаюсь создать макрос 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
не работает
(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.
Итак, чтобы разрешить рекурсию, я хочу снять определение map-f
(который map-double
в моем использовании этого макроса) до верхнего уровня. Возможно ли это в макросистеме ACL2?
В такой системе, как ракетка, я бы использовал такую функцию, как syntax-local-lift-expression
сделать это. Так есть ли аналогичная форма в ACL2?