docs: def free_symbols(self):
          """Set of free SymPy symbols contained within the expression."""
          if self._free_symbols is None:
              res = set.union(
                  set([]), # dummy arg (union fails without arguments)
                  *[_free_symbols(val) for val in self.kwargs.values()])
              res.update(
                  set([]), # dummy arg (update fails without arguments)
                  *[_free_symbols(arg) for arg in self.args])
              self._free_symbols = res
          return self._free_symbols