Matteo Landi - 2024-07-23

How dangerous it is, to muffle this warning, when trying to find all the free variables of a form? The library seems to be outputting the right list of free variables anyways, but still got me thinking.

Here is what I am playing with:

(defvar *muffle-warnings?* t)

(defmacro w/muffled-warnings (expected &body body)
  `(handler-bind ((warning (lambda (w)
                             (bnd1 actual (apply #'format
                                                 nil
                                                 (simple-condition-format-control w)
                                                 (simple-condition-format-arguments w))
                               (when (and *muffle-warnings?* (string-starts-with-p ,expected actual))
                                 (muffle-warning))))))
     ,@body))

(eval-when (:compile-toplevel :load-toplevel :execute)
  (defun free-vars (form)
    (bnd1 ast (clast:parse form)
      (remove-duplicates (w/muffled-warnings "CLAST: lambda list walking not yet implemented"
                           (clast:free-variables ast))))))

(examples free-vars
  (is (equal (free-vars '(pr var1))
             '(var1)))
  ;; duplicates
  (is (equal (free-vars '(progn (pr var1) (pr var1)))
             '(var1)))
  ;; order
  (is (equal (free-vars '(progn (pr var1) (pr var2)))
             '(var1 var2)))
  ;; lambda
  (is (equal (free-vars '(lambda () (pr "Hello " name)))
             '(name)))
  ;; lambda-list w/ muffled warnings
  (is (null (free-vars '(lambda (name) (pr "Hello " name)))))
  ;; lambda-list w/o muffled warnings
  (signals warning (bnd1 *muffle-warnings?* nil
                     (free-vars '(lambda (name) (pr "Hello " name)))))
  )