В макротрансформаторе возможно ли поднять определение до верхнего уровня?

В макропреобразователе 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?

0 ответов

Другие вопросы по тегам