docs: def p_functioncall(self, tree):
          # Where all the real interpreter action is
          # Note that things that should only be done at the top level
          # are performed in the interpret function defined below.
          ''' V ::= function_call ( V LPAREN V RPAREN )'''
          if type(tree[2].value) != type([]):
              args = [tree[2].value]
          else:
              args = tree[2].value
          fname = tree[0].value
          if fname not in syfunctions:
              print("Error: unknown function:", fname)
              self.error(fname)
          else:
              if fname == 'unit':
                  # constant spectrum
                  tree.value = spectrum.FlatSpectrum(args[0],fluxunits=args[1])
              elif fname == 'bb':
                  # black body
                  tree.value = spectrum.BlackBody(args[0])
              elif fname == 'pl':
                  # power law
                  if args[2] not in synforms:
                      print("Error: unrecognized units:", args[2])
                  # code to create powerlaw spectrum object
                  tree.value = spectrum.Powerlaw(args[0],args[1],fluxunits=args[2])
              elif fname == 'box':
                  # box throughput
                  tree.value = spectrum.Box(args[0],args[1])
              elif fname == 'spec':
                  # spectrum from reference file (for now....)
                  name = args[0]
                  tree.value = spectrum.TabularSourceSpectrum(_handleIRAFName(name))
              elif fname == 'band':
                  # passband
                  args=tree[2].svalue
                  tree.value = ObsBandpass(args)
              elif fname == 'em':
                  # emission line
                  tree.value = spectrum.GaussianSource(args[2],args[0],args[1],fluxunits=args[3])
              elif fname == 'icat':
                  # catalog interpolation
                  tree.value = catalog.Icat(*args)
              elif fname == 'rn':
                  # renormalize
                  sp = args[0]
                  if not isinstance(sp,spectrum.SourceSpectrum):
                      name=_handleIRAFName(args[0])
                      sp = spectrum.TabularSourceSpectrum(name)
                  #
                  # Always force the renormalization to occur: prevent exceptions
                  #in case of partial overlap. Less robust but duplicates synphot.
                  # Force the renormalization in the case of partial overlap (OverlapError),
                  # but raise an exception if the spectrum and bandpass are entirely
                  # disjoint (DisjointError)
                  try:
                      tree.value = sp.renorm(args[2],args[3],args[1])
                  except DisjointError:
                      raise
                  except OverlapError:
                      tree.value = sp.renorm(args[2],args[3],args[1],force=True)
                      tree.value.warnings['force_renorm'] = 'Warning: Renormalization of the spectrum, to the specified value, in the specified units, exceeds the limit of the specified passband.'
  
              elif fname == 'z':
                  # redshift
                  if args[0] != 'null': # the ETC generates junk sometimes....
                      try:
                          tree.value = args[0].redshift(args[1])
                      except AttributeError:
                          try:
                              #name = getName(args[0])
                              sp = spectrum.TabularSourceSpectrum( \
                                   _handleIRAFName(args[0]))
                              tree.value = sp.redshift(args[1])
                          except AttributeError:
                              tree.value = spectrum.FlatSpectrum(1.0)
                  else:
                      tree.value = spectrum.FlatSpectrum(1.0)
              elif fname == 'ebmvx':
                  # extinction
                  tree.value = reddening.Extinction(args[0],args[1])
  
              else:
                  tree.value = "would call %s with the following args: %s" % (fname, repr(args))