aboutsummaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/eval.c b/src/eval.c
index 724f0018a58..8ad06dded80 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2638,6 +2638,37 @@ DEFUN ("functionp", Ffunctionp, Sfunctionp, 1, 1, 0,
2638 return Qnil; 2638 return Qnil;
2639} 2639}
2640 2640
2641bool
2642FUNCTIONP (Lisp_Object object)
2643{
2644 if (SYMBOLP (object) && !NILP (Ffboundp (object)))
2645 {
2646 object = Findirect_function (object, Qt);
2647
2648 if (CONSP (object) && EQ (XCAR (object), Qautoload))
2649 {
2650 /* Autoloaded symbols are functions, except if they load
2651 macros or keymaps. */
2652 for (int i = 0; i < 4 && CONSP (object); i++)
2653 object = XCDR (object);
2654
2655 return ! (CONSP (object) && !NILP (XCAR (object)));
2656 }
2657 }
2658
2659 if (SUBRP (object))
2660 return XSUBR (object)->max_args != UNEVALLED;
2661 else if (COMPILEDP (object))
2662 return true;
2663 else if (CONSP (object))
2664 {
2665 Lisp_Object car = XCAR (object);
2666 return EQ (car, Qlambda) || EQ (car, Qclosure);
2667 }
2668 else
2669 return false;
2670}
2671
2641DEFUN ("funcall", Ffuncall, Sfuncall, 1, MANY, 0, 2672DEFUN ("funcall", Ffuncall, Sfuncall, 1, MANY, 0,
2642 doc: /* Call first argument as a function, passing remaining arguments to it. 2673 doc: /* Call first argument as a function, passing remaining arguments to it.
2643Return the value that function returns. 2674Return the value that function returns.