diff --git a/grudge/symbolic/operators.py b/grudge/symbolic/operators.py
index 49cc8fa18b4366b845903016c9aafbfa3d409940..fbfdb0f605fa24998e3bba7474aa073b926867bc 100644
--- a/grudge/symbolic/operators.py
+++ b/grudge/symbolic/operators.py
@@ -485,24 +485,33 @@ def norm(p, arg, dd=None):
     """
     :arg arg: is assumed to be a vector, i.e. have shape ``(n,)``.
     """
-    import grudge.symbolic as sym
+    sym = _sym()
 
     if dd is None:
         dd = _sym().DD_VOLUME
 
     if p == 2:
-        comp_norm_squared = sym.NodalSum(dd_in=dd)(
+        norm_squared = sym.NodalSum(dd_in=dd)(
                 sym.CFunction("fabs")(
                     arg * sym.MassOperator()(arg)))
-        return sym.CFunction("sqrt")(sum(comp_norm_squared))
+
+        if isinstance(norm_squared, np.ndarray):
+            norm_squared = norm_squared.sum()
+
+        return sym.CFunction("sqrt")(norm_squared)
 
     elif p == np.Inf:
-        comp_norm = sym.NodalMax()(sym.CFunction("fabs")(arg))
+        result = sym.NodalMax()(sym.CFunction("fabs")(arg))
         from pymbolic.primitives import Max
-        return reduce(Max, comp_norm)
+
+        if isinstance(norm_squared, np.ndarray):
+            from functools import reduce
+            result = reduce(Max, result)
+
+        return result
 
     else:
-        return sum(sym.NodalSum(dd_in=dd)(sym.CFunction("fabs")(arg)**p))**(1/p)
+        raise ValueError("unsupported value of p")
 
 # }}}