Function: cl-type-of

cl-type-of is a function defined in data.c.

Signature

(cl-type-of OBJECT)

Documentation

Return a symbol representing the type of OBJECT.

The returned symbol names the most specific possible type of the object. for example, (cl-type-of nil) returns null. The specific type returned may change depending on Emacs versions, so we recommend you use cl-typep, cl-typecase, or other predicates rather than compare the return value of this function against a fixed set of types.

View in manual

Probably introduced at or before Emacs version 30.1.

Source Code

// Defined in /usr/src/emacs/src/data.c
{
  switch (XTYPE (object))
    {
    case Lisp_Int0:
    case Lisp_Int1:
      return Qfixnum;

    case Lisp_Symbol:
      return NILP (object) ? Qnull
             : EQ (object, Qt) ? Qboolean
             : Qsymbol;

    case Lisp_String:
      return Qstring;

    case Lisp_Cons:
      return Qcons;

    case Lisp_Vectorlike:
      /* WARNING!!  Keep 'cl--type-hierarchy' in sync with this code!!  */
      switch (PSEUDOVECTOR_TYPE (XVECTOR (object)))
        {
        case PVEC_NORMAL_VECTOR: return Qvector;
	case PVEC_BIGNUM: return Qbignum;
	case PVEC_MARKER: return Qmarker;
	case PVEC_SYMBOL_WITH_POS: return Qsymbol_with_pos;
	case PVEC_OVERLAY: return Qoverlay;
	case PVEC_FINALIZER: return Qfinalizer;
	case PVEC_USER_PTR: return Quser_ptr;
        case PVEC_WINDOW_CONFIGURATION: return Qwindow_configuration;
        case PVEC_PROCESS: return Qprocess;
        case PVEC_WINDOW: return Qwindow;
        case PVEC_SUBR:
          return XSUBR (object)->max_args == UNEVALLED ? Qspecial_form
                 : NATIVE_COMP_FUNCTIONP (object) ? Qnative_comp_function
                 : Qprimitive_function;
        case PVEC_CLOSURE:
          return CONSP (AREF (object, CLOSURE_CODE))
                 ? Qinterpreted_function : Qbyte_code_function;
        case PVEC_BUFFER: return Qbuffer;
        case PVEC_CHAR_TABLE: return Qchar_table;
        case PVEC_BOOL_VECTOR: return Qbool_vector;
        case PVEC_FRAME: return Qframe;
        case PVEC_HASH_TABLE: return Qhash_table;
        case PVEC_OBARRAY: return Qobarray;
        case PVEC_FONT:
          if (FONT_SPEC_P (object))
	    return Qfont_spec;
          if (FONT_ENTITY_P (object))
	    return Qfont_entity;
          if (FONT_OBJECT_P (object))
	    return Qfont_object;
          else
            emacs_abort (); /* return Qfont?  */
        case PVEC_THREAD: return Qthread;
        case PVEC_MUTEX: return Qmutex;
        case PVEC_CONDVAR: return Qcondition_variable;
        case PVEC_TERMINAL: return Qterminal;
        case PVEC_RECORD:
          {
            Lisp_Object t = AREF (object, 0);
            if (RECORDP (t) && 1 < PVSIZE (t))
              /* Return the type name field of the class!  */
              return AREF (t, 1);
            else
              return t;
          }
        case PVEC_MODULE_FUNCTION:
          return Qmodule_function;
	case PVEC_NATIVE_COMP_UNIT:
          return Qnative_comp_unit;
        case PVEC_XWIDGET:
          return Qxwidget;
        case PVEC_XWIDGET_VIEW:
          return Qxwidget_view;
	case PVEC_TS_PARSER:
	  return Qtreesit_parser;
	case PVEC_TS_NODE:
	  return Qtreesit_node;
	case PVEC_TS_COMPILED_QUERY:
	  return Qtreesit_compiled_query;
        case PVEC_SQLITE:
          return Qsqlite;
        case PVEC_SUB_CHAR_TABLE:
          return Qsub_char_table;
        /* "Impossible" cases.  */
	case PVEC_MISC_PTR:
        case PVEC_OTHER:
        case PVEC_FREE: ;
        }
      emacs_abort ();

    case Lisp_Float:
      return Qfloat;

    default:
      emacs_abort ();
    }
}