Filtering...

defattach-bang

books/misc/defattach-bang
other
(in-package "ACL2")
defattach!-defunfunction
(defun defattach!-defun
  (name ctx wrld)
  (declare (xargs :guard (and (symbolp name) (plist-worldp wrld))
      :mode :program))
  (let ((cl (getprop name 'symbol-class nil 'current-acl2-world wrld)))
    (case cl
      (:ideal (let ((formals (formals name wrld)))
          (list 'defun
            (intern-in-package-of-symbol (concatenate 'string (symbol-name name) "$GUARD-VERIFIED")
              name)
            formals
            '(declare (xargs :guard t :verify-guards t))
            (list 'ec-call (cons name formals)))))
      (:common-lisp-compliant nil)
      (t (er hard ctx "Not a logic-mode function symbol: ~x0" name)))))
defattach!-eventfunction
(defun defattach!-event
  (args wrld defs new-args)
  (declare (xargs :mode :program))
  (cond ((or (endp args) (keywordp (car args))) (and defs
        (cons 'progn
          (append defs
            (list (cons 'defattach (revappend new-args args)))))))
    (t (let* ((arg (car args)) (f (car arg))
          (g (cadr arg))
          (ctx 'defattach!)
          (def (defattach!-defun g ctx wrld))
          (new-args (if def
              (cons (list* f (cadr def) (cddr arg)) new-args)
              (cons arg new-args))))
        (cond (def (defattach!-event (cdr args) wrld (cons def defs) new-args))
          (t (defattach!-event (cdr args) wrld defs new-args)))))))
defattach!-fnfunction
(defun defattach!-fn
  (args)
  `(make-event (let ((event (defattach!-event ',ARGS (w state) nil nil)))
      (or event (cons 'defattach ',ARGS)))))
defattach!macro
(defmacro defattach!
  (&rest args)
  (cond ((and (eql (length args) 2) (symbolp (car args))) (defattach!-fn (list args)))
    (t (defattach!-fn args))))