unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it?
@ 2024-08-13  9:22 arthur miller
  2024-08-13 11:08 ` Stephen Berman
  0 siblings, 1 reply; 7+ messages in thread
From: arthur miller @ 2024-08-13  9:22 UTC (permalink / raw)
  To: emacs-devel@gnu.org

[-- Attachment #1: Type: text/plain, Size: 497 bytes --]

(subrp 'car) => nil
(subrp #'car) => nil
(subrp '+) => nil

(subrp (symbol-function 'car)) => t

According to the doc, subrp should tell me if "OBJECT" is a built-in
function or not. I would expect "car" to be that, since car is implemented
in the C source (in data.c).

I also get the same behavior for compiled-function-p.

Is it not valid to pass a symbol and function objects to those two functions? Can we
 in that case clarify in the doc string expected value(s) for OBJECT?


[-- Attachment #2: Type: text/html, Size: 2603 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it?
  2024-08-13  9:22 Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it? arthur miller
@ 2024-08-13 11:08 ` Stephen Berman
  2024-08-13 18:00   ` Sv: " arthur miller
  0 siblings, 1 reply; 7+ messages in thread
From: Stephen Berman @ 2024-08-13 11:08 UTC (permalink / raw)
  To: arthur miller; +Cc: emacs-devel@gnu.org

On Tue, 13 Aug 2024 09:22:01 +0000 arthur miller <arthur.miller@live.com> wrote:

> (subrp 'car) => nil
> (subrp #'car) => nil
> (subrp '+) => nil
>
> (subrp (symbol-function 'car)) => t
>
> According to the doc, subrp should tell me if "OBJECT" is a built-in
> function or not. I would expect "car" to be that, since car is implemented
> in the C source (in data.c).
>
> I also get the same behavior for compiled-function-p.
>
> Is it not valid to pass a symbol and function objects to those two
> functions? Can we in that case clarify in the doc string expected
> value(s) for OBJECT?

At least it's documented in the Elisp manual (info "(elisp) What Is a
Function"):

  Unlike ‘functionp’, the next functions do _not_ treat a symbol as its
  function definition.
  
   -- Function: subrp object
       This function returns ‘t’ if OBJECT is a built-in function (i.e., a
       Lisp primitive).
  
            (subrp 'message)            ; ‘message’ is a symbol,
                 ⇒ nil                 ;   not a subr object.
            (subrp (symbol-function 'message))
                 ⇒ t

Steve Berman



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Sv: Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it?
  2024-08-13 11:08 ` Stephen Berman
@ 2024-08-13 18:00   ` arthur miller
  2024-08-14 10:08     ` Stephen Berman
  0 siblings, 1 reply; 7+ messages in thread
From: arthur miller @ 2024-08-13 18:00 UTC (permalink / raw)
  To: Stephen Berman; +Cc: emacs-devel@gnu.org

[-- Attachment #1: Type: text/plain, Size: 3545 bytes --]

> > (subrp 'car) => nil
> > (subrp #'car) => nil
> > (subrp '+) => nil
> >
> > (subrp (symbol-function 'car)) => t
> >
> > According to the doc, subrp should tell me if "OBJECT" is a built-in
> > function or not. I would expect "car" to be that, since car is implemented
> > in the C source (in data.c).
> >
> > I also get the same behavior for compiled-function-p.
> >
> > Is it not valid to pass a symbol and function objects to those two
> > functions? Can we in that case clarify in the doc string expected
> > value(s) for OBJECT?
>
> At least it's documented in the Elisp manual (info "(elisp) What Is a
> Function"):

Yes. I see it now. I was just looking at function docs previously. Thanks.

>   Unlike ‘functionp’, the next functions do _not_ treat a symbol as its
>   function definition.
>
>    -- Function: subrp object
>        This function returns ‘t’ if OBJECT is a built-in function (i.e., a
>        Lisp primitive).
>
>             (subrp 'message)            ; ‘message’ is a symbol,
>                  ⇒ nil                 ;   not a subr object.
>             (subrp (symbol-function 'message))
>                  ⇒ t

Ok, they are explicit it does not look at function slot of a symbol itself
(2.4.15). However, I find the documentation a bit vague or perhaps outdated. In
particular regarding the "built-in" type. Perhaps this function
historically meant something else than how it works today (I think it did). I
guess built-in used to mean "implemented in C core", but since the native
compiler come in, it seems to rapport any machine-code compiled function as
"subr":

(defun test-fn () (message "hi"))
(native-compile 'test-fn)
(subrp (symbol-function 'test-fn)) => t

In other words, perhaps manual should be updated to say something along the line
that subrp tells if function is a function compiled to machine code. I see now
also that compiled-function-p repports if a function is both byte-code compiled
and machine-code compiled as "compiled" so those are not equal.
________________________________
Från: Stephen Berman <stephen.berman@gmx.net>
Skickat: den 13 augusti 2024 13:08
Till: arthur miller <arthur.miller@live.com>
Kopia: emacs-devel@gnu.org <emacs-devel@gnu.org>
Ämne: Re: Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it?

On Tue, 13 Aug 2024 09:22:01 +0000 arthur miller <arthur.miller@live.com> wrote:

> (subrp 'car) => nil
> (subrp #'car) => nil
> (subrp '+) => nil
>
> (subrp (symbol-function 'car)) => t
>
> According to the doc, subrp should tell me if "OBJECT" is a built-in
> function or not. I would expect "car" to be that, since car is implemented
> in the C source (in data.c).
>
> I also get the same behavior for compiled-function-p.
>
> Is it not valid to pass a symbol and function objects to those two
> functions? Can we in that case clarify in the doc string expected
> value(s) for OBJECT?

At least it's documented in the Elisp manual (info "(elisp) What Is a
Function"):

  Unlike ‘functionp’, the next functions do _not_ treat a symbol as its
  function definition.

   -- Function: subrp object
       This function returns ‘t’ if OBJECT is a built-in function (i.e., a
       Lisp primitive).

            (subrp 'message)            ; ‘message’ is a symbol,
                 ⇒ nil                 ;   not a subr object.
            (subrp (symbol-function 'message))
                 ⇒ t

Steve Berman

[-- Attachment #2: Type: text/html, Size: 10774 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Sv: Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it?
  2024-08-13 18:00   ` Sv: " arthur miller
@ 2024-08-14 10:08     ` Stephen Berman
  2024-08-15  9:01       ` Andrea Corallo
  2024-08-15 18:58       ` arthur miller
  0 siblings, 2 replies; 7+ messages in thread
From: Stephen Berman @ 2024-08-14 10:08 UTC (permalink / raw)
  To: arthur miller; +Cc: emacs-devel@gnu.org

On Tue, 13 Aug 2024 18:00:12 +0000 arthur miller <arthur.miller@live.com> wrote:

>> > (subrp 'car) => nil
>> > (subrp #'car) => nil
>> > (subrp '+) => nil
>> >
>> > (subrp (symbol-function 'car)) => t
>> >
>> > According to the doc, subrp should tell me if "OBJECT" is a built-in
>> > function or not. I would expect "car" to be that, since car is implemented
>> > in the C source (in data.c).
>> >
>> > I also get the same behavior for compiled-function-p.
>> >
>> > Is it not valid to pass a symbol and function objects to those two
>> > functions? Can we in that case clarify in the doc string expected
>> > value(s) for OBJECT?
>>
>> At least it's documented in the Elisp manual (info "(elisp) What Is a
>> Function"):
>
> Yes. I see it now. I was just looking at function docs previously. Thanks.
>
>>   Unlike ‘functionp’, the next functions do _not_ treat a symbol as its
>>   function definition.
>>  
>>    -- Function: subrp object
>>        This function returns ‘t’ if OBJECT is a built-in function (i.e., a
>>        Lisp primitive).
>>  
>>             (subrp 'message)            ; ‘message’ is a symbol,
>>                  ⇒ nil                 ;   not a subr object.
>>             (subrp (symbol-function 'message))
>>                  ⇒ t
>
> Ok, they are explicit it does not look at function slot of a symbol itself
> (2.4.15). However, I find the documentation a bit vague or perhaps outdated. In
> particular regarding the "built-in" type. Perhaps this function
> historically meant something else than how it works today (I think it did). I
> guess built-in used to mean "implemented in C core", but since the native
> compiler come in, it seems to rapport any machine-code compiled function as
> "subr":
>
> (defun test-fn () (message "hi"))
> (native-compile 'test-fn)
> (subrp (symbol-function 'test-fn)) => t
>
> In other words, perhaps manual should be updated to say something along the line
> that subrp tells if function is a function compiled to machine code. I see now
> also that compiled-function-p repports if a function is both byte-code compiled
> and machine-code compiled as "compiled" so those are not equal.

Yes, it does seem that the semantics of `subr' have changed (at least
conceptually, if not formally, though perhaps that too) since the
introduction of native compilation.  Note also:

(subr-arity (symbol-function 'test-fn)) => (0 . 0)

In contrast:

(primitive-function-p (symbol-function 'test-fn)) => nil
(primitive-function-p (symbol-function 'car)) => t

Steve Berman



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Sv: Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it?
  2024-08-14 10:08     ` Stephen Berman
@ 2024-08-15  9:01       ` Andrea Corallo
  2024-08-15 16:37         ` Sv: " arthur miller
  2024-08-15 18:58       ` arthur miller
  1 sibling, 1 reply; 7+ messages in thread
From: Andrea Corallo @ 2024-08-15  9:01 UTC (permalink / raw)
  To: Stephen Berman; +Cc: arthur miller, emacs-devel@gnu.org

Stephen Berman <stephen.berman@gmx.net> writes:

> On Tue, 13 Aug 2024 18:00:12 +0000 arthur miller <arthur.miller@live.com> wrote:
>
>>> > (subrp 'car) => nil
>>> > (subrp #'car) => nil
>>> > (subrp '+) => nil
>>> >
>>> > (subrp (symbol-function 'car)) => t
>>> >
>>> > According to the doc, subrp should tell me if "OBJECT" is a built-in
>>> > function or not. I would expect "car" to be that, since car is implemented
>>> > in the C source (in data.c).
>>> >
>>> > I also get the same behavior for compiled-function-p.
>>> >
>>> > Is it not valid to pass a symbol and function objects to those two
>>> > functions? Can we in that case clarify in the doc string expected
>>> > value(s) for OBJECT?
>>>
>>> At least it's documented in the Elisp manual (info "(elisp) What Is a
>>> Function"):
>>
>> Yes. I see it now. I was just looking at function docs previously. Thanks.
>>
>>>   Unlike ‘functionp’, the next functions do _not_ treat a symbol as its
>>>   function definition.
>>>  
>>>    -- Function: subrp object
>>>        This function returns ‘t’ if OBJECT is a built-in function (i.e., a
>>>        Lisp primitive).
>>>  
>>>             (subrp 'message)            ; ‘message’ is a symbol,
>>>                  ⇒ nil                 ;   not a subr object.
>>>             (subrp (symbol-function 'message))
>>>                  ⇒ t
>>
>> Ok, they are explicit it does not look at function slot of a symbol itself
>> (2.4.15). However, I find the documentation a bit vague or perhaps outdated. In
>> particular regarding the "built-in" type. Perhaps this function
>> historically meant something else than how it works today (I think it did). I
>> guess built-in used to mean "implemented in C core", but since the native
>> compiler come in, it seems to rapport any machine-code compiled function as
>> "subr":
>>
>> (defun test-fn () (message "hi"))
>> (native-compile 'test-fn)
>> (subrp (symbol-function 'test-fn)) => t
>>
>> In other words, perhaps manual should be updated to say something along the line
>> that subrp tells if function is a function compiled to machine code. I see now
>> also that compiled-function-p repports if a function is both byte-code compiled
>> and machine-code compiled as "compiled" so those are not equal.
>
> Yes, it does seem that the semantics of `subr' have changed (at least
> conceptually, if not formally, though perhaps that too) since the
> introduction of native compilation.  Note also:
>
> (subr-arity (symbol-function 'test-fn)) => (0 . 0)
>
> In contrast:
>
> (primitive-function-p (symbol-function 'test-fn)) => nil
> (primitive-function-p (symbol-function 'car)) => t

Hi Steve,

The semantic of 'subrp' (and 'subr-arity') is not changed, what has
changed is that built-in functions are not anymore the only exinsting
subr because native compile Lisp functions are subr as well.

I've updated the docstring of 'subrp'.

  Andrea



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Sv: Sv: Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it?
  2024-08-15  9:01       ` Andrea Corallo
@ 2024-08-15 16:37         ` arthur miller
  0 siblings, 0 replies; 7+ messages in thread
From: arthur miller @ 2024-08-15 16:37 UTC (permalink / raw)
  To: Andrea Corallo, Stephen Berman; +Cc: emacs-devel@gnu.org

[-- Attachment #1: Type: text/plain, Size: 9633 bytes --]

>> On Tue, 13 Aug 2024 18:00:12 +0000 arthur miller <arthur.miller@live.com>
>> wrote:
>>
>>>> > (subrp 'car) => nil
>>>> > (subrp #'car) => nil
>>>> > (subrp '+) => nil
>>>> >
>>>> > (subrp (symbol-function 'car)) => t
>>>> >
>>>> > According to the doc, subrp should tell me if "OBJECT" is a built-in
>>>> > function or not. I would expect "car" to be that, since car is implemented
>>>> > in the C source (in data.c).
>>>> >
>>>> > I also get the same behavior for compiled-function-p.
>>>> >
>>>> > Is it not valid to pass a symbol and function objects to those two
>>>> > functions? Can we in that case clarify in the doc string expected
>>>> > value(s) for OBJECT?
>>>>
>>>> At least it's documented in the Elisp manual (info "(elisp) What Is a
>>>> Function"):
>>>
>>> Yes. I see it now. I was just looking at function docs previously. Thanks.
>>>
>>>>   Unlike ‘functionp’, the next functions do _not_ treat a symbol as its
>>>>   function definition.
>>>>
>>>>    -- Function: subrp object
>>>>        This function returns ‘t’ if OBJECT is a built-in function (i.e., a
>>>>        Lisp primitive).
>>>>
>>>>             (subrp 'message)            ; ‘message’ is a symbol,
>>>>                  ⇒ nil                 ;   not a subr object.
>>>>             (subrp (symbol-function 'message))
>>>>                  ⇒ t
>>>
>>> Ok, they are explicit it does not look at function slot of a symbol itself
>>> (2.4.15). However, I find the documentation a bit vague or perhaps outdated.
>>> In
>>> particular regarding the "built-in" type. Perhaps this function
>>> historically meant something else than how it works today (I think it did). I
>>> guess built-in used to mean "implemented in C core", but since the native
>>> compiler come in, it seems to rapport any machine-code compiled function as
>>> "subr":
>>>
>>> (defun test-fn () (message "hi"))
>>> (native-compile 'test-fn)
>>> (subrp (symbol-function 'test-fn)) => t
>>>
>>> In other words, perhaps manual should be updated to say something along the
>>> line
>>> that subrp tells if function is a function compiled to machine code. I see
>>> now
>>> also that compiled-function-p repports if a function is both byte-code
>>> compiled
>>> and machine-code compiled as "compiled" so those are not equal.
>>
>> Yes, it does seem that the semantics of `subr' have changed (at least
>> conceptually, if not formally, though perhaps that too) since the
>> introduction of native compilation.  Note also:
>>
>> (subr-arity (symbol-function 'test-fn)) => (0 . 0)
>>
>> In contrast:
>>
>> (primitive-function-p (symbol-function 'test-fn)) => nil
>> (primitive-function-p (symbol-function 'car)) => t
>
>Hi Steve,
>

I hope I am also allowed to chim-in here:

>The semantic of 'subrp' (and 'subr-arity') is not changed, what has
>changed is that built-in functions are not anymore the only exinsting
>subr because native compile Lisp functions are subr as well.

If you don't mind, what is the semantic of subr? The manual says:

“primitive”
     A function which is callable from Lisp but is actually written in
     C.  Primitives are also called “built-in functions”, or “subrs”.
     Examples include functions like ‘car’ and ‘append’.  In addition,
     all special forms (see below) are also considered primitives.

     Usually, a function is implemented as a primitive because it is a
     fundamental part of Lisp (e.g., ‘car’), or because it provides a
     low-level interface to operating system services, or because it
     needs to run fast.  Unlike functions defined in Lisp, primitives
     can be modified or added only by changing the C sources and
     recompiling Emacs.  See *note Writing Emacs Primitives::.

Can I assume that semantic of subr means a machine code compiled function,
regardles of the origin (C code or compiled Lisp code), but not unevalled
forms and macros? An equivalent to compiled-function-p in Common Lisp?

The manual should probably also be updated, since as Steve pointed out,
primitive-function-p does differ between compiled Lisp and C primitive. So does
also subr-native-elisp-p (which has changed name to native-comp-function-p),
which meaning seems to be the complement of primitive-function-p (regarding
functions).

May I suggest to update the manual to say that subr is a compiled function,
which is also more in the style of classical lisp, (see Lisp 1.5 manual). Maybe
add:

“subr”

     Either a primitive function, or a Lisp function that has been compiled by
     the native compiler.

and remove subr from "primitive"-paragraph:

“primitive”
     A function which is callable from Lisp but is actually written in
     C.  Primitives are also called “built-in functions”.   Examples
     include functions like ‘car’ and ‘append’.  In addition, all
     special forms (see below) are also considered primitives.

     Usually, a function is implemented as a primitive because it is a
     fundamental part of Lisp (e.g., ‘car’), or because it provides a
     low-level interface to operating system services, or because it
     needs to run fast.  Unlike functions defined in Lisp, primitives
     can be modified or added only by changing the C sources and
     recompiling Emacs.  See *note Writing Emacs Primitives::.


Or something in that style?

When we are at it also: what is intended usage of "subr-type" function?

(subr-type (symbol-function 'car)) => nil
(subr-type (symbol-function 'test-fn)) => nil

Passing in symbol results in error. If (subrp (symbol-function 'car)) returns t
I would expect subr-type to understand which kind of subr it is, but it says
nil. I probably misunderstand the intended usage, but is it meant to tell if it
is a primitive from C core, or compiled Lisp, or do you mean something else?

This is not very important per se for using Emacs Lisp, but I would like to
understand those properly.

>I've updated the docstring of 'subrp'.

Have you committed your updated doc string? I don't see any change in the doc
string (I just pulled the sources from Savannah), few minutes before I wrote and
sent this.

best regards
/a
________________________________
Från: Andrea Corallo <acorallo@gnu.org>
Skickat: den 15 augusti 2024 11:01
Till: Stephen Berman <stephen.berman@gmx.net>
Kopia: arthur miller <arthur.miller@live.com>; emacs-devel@gnu.org <emacs-devel@gnu.org>
Ämne: Re: Sv: Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it?

Stephen Berman <stephen.berman@gmx.net> writes:

> On Tue, 13 Aug 2024 18:00:12 +0000 arthur miller <arthur.miller@live.com> wrote:
>
>>> > (subrp 'car) => nil
>>> > (subrp #'car) => nil
>>> > (subrp '+) => nil
>>> >
>>> > (subrp (symbol-function 'car)) => t
>>> >
>>> > According to the doc, subrp should tell me if "OBJECT" is a built-in
>>> > function or not. I would expect "car" to be that, since car is implemented
>>> > in the C source (in data.c).
>>> >
>>> > I also get the same behavior for compiled-function-p.
>>> >
>>> > Is it not valid to pass a symbol and function objects to those two
>>> > functions? Can we in that case clarify in the doc string expected
>>> > value(s) for OBJECT?
>>>
>>> At least it's documented in the Elisp manual (info "(elisp) What Is a
>>> Function"):
>>
>> Yes. I see it now. I was just looking at function docs previously. Thanks.
>>
>>>   Unlike ‘functionp’, the next functions do _not_ treat a symbol as its
>>>   function definition.
>>>
>>>    -- Function: subrp object
>>>        This function returns ‘t’ if OBJECT is a built-in function (i.e., a
>>>        Lisp primitive).
>>>
>>>             (subrp 'message)            ; ‘message’ is a symbol,
>>>                  ⇒ nil                 ;   not a subr object.
>>>             (subrp (symbol-function 'message))
>>>                  ⇒ t
>>
>> Ok, they are explicit it does not look at function slot of a symbol itself
>> (2.4.15). However, I find the documentation a bit vague or perhaps outdated. In
>> particular regarding the "built-in" type. Perhaps this function
>> historically meant something else than how it works today (I think it did). I
>> guess built-in used to mean "implemented in C core", but since the native
>> compiler come in, it seems to rapport any machine-code compiled function as
>> "subr":
>>
>> (defun test-fn () (message "hi"))
>> (native-compile 'test-fn)
>> (subrp (symbol-function 'test-fn)) => t
>>
>> In other words, perhaps manual should be updated to say something along the line
>> that subrp tells if function is a function compiled to machine code. I see now
>> also that compiled-function-p repports if a function is both byte-code compiled
>> and machine-code compiled as "compiled" so those are not equal.
>
> Yes, it does seem that the semantics of `subr' have changed (at least
> conceptually, if not formally, though perhaps that too) since the
> introduction of native compilation.  Note also:
>
> (subr-arity (symbol-function 'test-fn)) => (0 . 0)
>
> In contrast:
>
> (primitive-function-p (symbol-function 'test-fn)) => nil
> (primitive-function-p (symbol-function 'car)) => t

Hi Steve,

The semantic of 'subrp' (and 'subr-arity') is not changed, what has
changed is that built-in functions are not anymore the only exinsting
subr because native compile Lisp functions are subr as well.

I've updated the docstring of 'subrp'.

  Andrea

[-- Attachment #2: Type: text/html, Size: 29812 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Sv: Sv: Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it?
  2024-08-14 10:08     ` Stephen Berman
  2024-08-15  9:01       ` Andrea Corallo
@ 2024-08-15 18:58       ` arthur miller
  1 sibling, 0 replies; 7+ messages in thread
From: arthur miller @ 2024-08-15 18:58 UTC (permalink / raw)
  To: Stephen Berman; +Cc: emacs-devel@gnu.org

[-- Attachment #1: Type: text/plain, Size: 5899 bytes --]

>>> > (subrp 'car) => nil
>>> > (subrp #'car) => nil
>>> > (subrp '+) => nil
>>> >
>>> > (subrp (symbol-function 'car)) => t
>>> >
>>> > According to the doc, subrp should tell me if "OBJECT" is a built-in
>>> > function or not. I would expect "car" to be that, since car is implemented
>>> > in the C source (in data.c).
>>> >
>>> > I also get the same behavior for compiled-function-p.
>>> >
>>> > Is it not valid to pass a symbol and function objects to those two
>>> > functions? Can we in that case clarify in the doc string expected
>>> > value(s) for OBJECT?
>>>
>>> At least it's documented in the Elisp manual (info "(elisp) What Is a
>>> Function"):
>>
>> Yes. I see it now. I was just looking at function docs previously. Thanks.
>>
>>>   Unlike ‘functionp’, the next functions do _not_ treat a symbol as its
>>>   function definition.
>>>
>>>    -- Function: subrp object
>>>        This function returns ‘t’ if OBJECT is a built-in function (i.e., a
>>>        Lisp primitive).
>>>
>>>             (subrp 'message)            ; ‘message’ is a symbol,
>>>                  ⇒ nil                 ;   not a subr object.
>>>             (subrp (symbol-function 'message))
>>>                  ⇒ t
>>
>> Ok, they are explicit it does not look at function slot of a symbol itself
>> (2.4.15). However, I find the documentation a bit vague or perhaps outdated.
>> In
>> particular regarding the "built-in" type. Perhaps this function
>> historically meant something else than how it works today (I think it did). I
>> guess built-in used to mean "implemented in C core", but since the native
>> compiler come in, it seems to rapport any machine-code compiled function as
>> "subr":
>>
>> (defun test-fn () (message "hi"))
>> (native-compile 'test-fn)
>> (subrp (symbol-function 'test-fn)) => t
>>
>> In other words, perhaps manual should be updated to say something along the
>> line
>> that subrp tells if function is a function compiled to machine code. I see now
>> also that compiled-function-p repports if a function is both byte-code
>> compiled
>> and machine-code compiled as "compiled" so those are not equal.
>
>Yes, it does seem that the semantics of `subr' have changed (at least
>conceptually, if not formally, though perhaps that too) since the
>introduction of native compilation.  Note also:
>
>(subr-arity (symbol-function 'test-fn)) => (0 . 0)
>
>In contrast:
>
>(primitive-function-p (symbol-function 'test-fn)) => nil
>(primitive-function-p (symbol-function 'car)) => t

Indeed. Sorry for a bit late answer; was testing things out and looking at the
manual, and than saw the answer from Andrea, so I answered that one.

Seems like subrs are a superset of both primitive functions and compiled lisp
functions, in other words any compiled function (not special form or macro). If
I am interpretting it correctly. Basically what I wrote in the answer to Andrea.
________________________________
Från: Stephen Berman <stephen.berman@gmx.net>
Skickat: den 14 augusti 2024 12:08
Till: arthur miller <arthur.miller@live.com>
Kopia: emacs-devel@gnu.org <emacs-devel@gnu.org>
Ämne: Re: Sv: Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it?

On Tue, 13 Aug 2024 18:00:12 +0000 arthur miller <arthur.miller@live.com> wrote:

>> > (subrp 'car) => nil
>> > (subrp #'car) => nil
>> > (subrp '+) => nil
>> >
>> > (subrp (symbol-function 'car)) => t
>> >
>> > According to the doc, subrp should tell me if "OBJECT" is a built-in
>> > function or not. I would expect "car" to be that, since car is implemented
>> > in the C source (in data.c).
>> >
>> > I also get the same behavior for compiled-function-p.
>> >
>> > Is it not valid to pass a symbol and function objects to those two
>> > functions? Can we in that case clarify in the doc string expected
>> > value(s) for OBJECT?
>>
>> At least it's documented in the Elisp manual (info "(elisp) What Is a
>> Function"):
>
> Yes. I see it now. I was just looking at function docs previously. Thanks.
>
>>   Unlike ‘functionp’, the next functions do _not_ treat a symbol as its
>>   function definition.
>>
>>    -- Function: subrp object
>>        This function returns ‘t’ if OBJECT is a built-in function (i.e., a
>>        Lisp primitive).
>>
>>             (subrp 'message)            ; ‘message’ is a symbol,
>>                  ⇒ nil                 ;   not a subr object.
>>             (subrp (symbol-function 'message))
>>                  ⇒ t
>
> Ok, they are explicit it does not look at function slot of a symbol itself
> (2.4.15). However, I find the documentation a bit vague or perhaps outdated. In
> particular regarding the "built-in" type. Perhaps this function
> historically meant something else than how it works today (I think it did). I
> guess built-in used to mean "implemented in C core", but since the native
> compiler come in, it seems to rapport any machine-code compiled function as
> "subr":
>
> (defun test-fn () (message "hi"))
> (native-compile 'test-fn)
> (subrp (symbol-function 'test-fn)) => t
>
> In other words, perhaps manual should be updated to say something along the line
> that subrp tells if function is a function compiled to machine code. I see now
> also that compiled-function-p repports if a function is both byte-code compiled
> and machine-code compiled as "compiled" so those are not equal.

Yes, it does seem that the semantics of `subr' have changed (at least
conceptually, if not formally, though perhaps that too) since the
introduction of native compilation.  Note also:

(subr-arity (symbol-function 'test-fn)) => (0 . 0)

In contrast:

(primitive-function-p (symbol-function 'test-fn)) => nil
(primitive-function-p (symbol-function 'car)) => t

Steve Berman

[-- Attachment #2: Type: text/html, Size: 15935 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2024-08-15 18:58 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-13  9:22 Subrp returns nil for function objects and symbols? Is this a bug or me misunderstanding it? arthur miller
2024-08-13 11:08 ` Stephen Berman
2024-08-13 18:00   ` Sv: " arthur miller
2024-08-14 10:08     ` Stephen Berman
2024-08-15  9:01       ` Andrea Corallo
2024-08-15 16:37         ` Sv: " arthur miller
2024-08-15 18:58       ` arthur miller

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).