code: def curl(vect, doit=True):
      """
      Returns the curl of a vector field computed wrt the base scalars
      of the given coordinate system.
  
      Parameters
      ==========
  
      vect : Vector
          The vector operand
  
      doit : bool
          If True, the result is returned after calling .doit() on
          each component. Else, the returned expression contains
          Derivative instances
  
      Examples
      ========
  
      >>> from sympy.vector import CoordSys3D, curl
      >>> R = CoordSys3D('R')
      >>> v1 = R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k
      >>> curl(v1)
      0
      >>> v2 = R.x*R.y*R.z*R.i
      >>> curl(v2)
      R.x*R.y*R.j + (-R.x*R.z)*R.k
  
      """
  
      coord_sys = _get_coord_systems(vect)
  
      if len(coord_sys) == 0:
          return Vector.zero
      elif len(coord_sys) == 1:
          coord_sys = next(iter(coord_sys))
          i, j, k = coord_sys.base_vectors()
          x, y, z = coord_sys.base_scalars()
          h1, h2, h3 = coord_sys.lame_coefficients()
          vectx = vect.dot(i)
          vecty = vect.dot(j)
          vectz = vect.dot(k)
          outvec = Vector.zero
          outvec += (
              (Derivative(vectz * h3, y) - Derivative(vecty * h2, z))
              * i
              / (h2 * h3)
          )
          outvec += (
              (Derivative(vectx * h1, z) - Derivative(vectz * h3, x))
              * j
              / (h1 * h3)
          )
          outvec += (
              (Derivative(vecty * h2, x) - Derivative(vectx * h1, y))
              * k
              / (h2 * h1)
          )
  
          if doit:
              return outvec.doit()
          return outvec
      else:
          if isinstance(vect, (Add, VectorAdd)):
              from sympy.vector import express
  
              try:
                  cs = next(iter(coord_sys))
                  args = [
                      express(i, cs, variables=True) for i in vect.args
                  ]
              except ValueError:
                  args = vect.args
              return VectorAdd.fromiter(
                  curl(i, doit=doit) for i in args
              )
          elif isinstance(vect, (Mul, VectorMul)):
              vector = [
                  i
                  for i in vect.args
                  if isinstance(i, (Vector, Cross, Gradient))
              ][0]
              scalar = Mul.fromiter(
                  i
                  for i in vect.args
                  if not isinstance(i, (Vector, Cross, Gradient))
              )
              res = Cross(
                  gradient(scalar), vector
              ).doit() + scalar * curl(vector, doit=doit)
              if doit:
                  return res.doit()
              return res
          elif isinstance(vect, (Cross, Curl, Gradient)):
              return Curl(vect)
          else:
              raise Curl(vect)
  
imports: import collections
  from sympy.core.expr import Expr
  from sympy.core import sympify, S, preorder_traversal
  from sympy.vector.coordsysrect import CoordSys3D
  from sympy.vector.vector import Vector, VectorMul, VectorAdd, Cross, Dot
  from sympy.core.function import Derivative
  from sympy.core.add import Add
  from sympy.core.mul import Mul
label_desc: Use image node_id 3 for calling a global function with example usage: curl(vect, doit) and returns: Vector, outvec, outvec, VectorAdd, res, res, Curl