unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Are nested defun's byte-compiled?
@ 2005-05-15 22:47 Drew Adams
  2005-05-24 17:46 ` Drew Adams
  0 siblings, 1 reply; 7+ messages in thread
From: Drew Adams @ 2005-05-15 22:47 UTC (permalink / raw)


Is the code defining a nested defun byte-compiled when its enclosing defun
is compiled? Example source file foo.el:

(defcustom define-bar-flag t "Define `bar' if non-nil.")
(defun foo ()
  "Do foo stuff. Define `bar' if `define-bar-flag' is non-nil."
  (when define-bar-flag (defun bar () (bar-stuff)))
  (rest-of-foo-stuff))

Suppose foo.el is byte-compiled, and then foo.elc is loaded.

Is `define-bar-flag' eval'd when compiling foo? I assume not. I assume that
`bar' is not defined if `define-bar-flag' was set to nil before foo.elc is
loaded. I assume that `bar' is not defined until `(foo)' is executed, and
then only if `define-bar-flag' is non-nil.

When foo.el was byte-compiled, is bar's potential definition (the defun
itself) also byte-compiled or not? That is, if `(foo)' is executed after
loading foo.elc, which version of `bar' is defined, byte-compiled or not?

If the answer is that the non-compiled version of `bar' is defined, how can
the code be changed to make the compiled version be defined instead? Is this
a good way to do that?

(defun foo ()
  (when define-bar-flag (byte-compile (defun bar () (bar-stuff))))
  (rest-of-foo-stuff))

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

* Re: Are nested defun's byte-compiled?
       [not found] <mailman.52.1116355611.25862.help-gnu-emacs@gnu.org>
@ 2005-05-20 14:59 ` Stefan Monnier
  0 siblings, 0 replies; 7+ messages in thread
From: Stefan Monnier @ 2005-05-20 14:59 UTC (permalink / raw)


> (defun foo ()
>   "Do foo stuff. Define `bar' if `define-bar-flag' is non-nil."
>   (when define-bar-flag (defun bar () (bar-stuff)))

Using `defun' inside the body of a function is very poor style.
I.e. don't do it.

As for your question: the byte-compiler compiles all the code.


        Stefan

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

* RE: Are nested defun's byte-compiled?
  2005-05-15 22:47 Drew Adams
@ 2005-05-24 17:46 ` Drew Adams
  0 siblings, 0 replies; 7+ messages in thread
From: Drew Adams @ 2005-05-24 17:46 UTC (permalink / raw)


Trying this again, as I received no response. Thanks, Drew.

    Sent: Sunday, May 15, 2005 3:48 PM

    Is the code defining a nested defun byte-compiled when its
    enclosing defun
    is compiled? Example source file foo.el:

    (defcustom define-bar-flag t "Define `bar' if non-nil.")
    (defun foo ()
      "Do foo stuff. Define `bar' if `define-bar-flag' is non-nil."
      (when define-bar-flag (defun bar () (bar-stuff)))
      (rest-of-foo-stuff))

    Suppose foo.el is byte-compiled, and then foo.elc is loaded.

    Is `define-bar-flag' eval'd when compiling foo? I assume not. I
    assume that
    `bar' is not defined if `define-bar-flag' was set to nil before
    foo.elc is
    loaded. I assume that `bar' is not defined until `(foo)' is
    executed, and
    then only if `define-bar-flag' is non-nil.

    When foo.el was byte-compiled, is bar's potential definition (the defun
    itself) also byte-compiled or not? That is, if `(foo)' is executed after
    loading foo.elc, which version of `bar' is defined,
    byte-compiled or not?

    If the answer is that the non-compiled version of `bar' is
    defined, how can
    the code be changed to make the compiled version be defined
    instead? Is this
    a good way to do that?

    (defun foo ()
      (when define-bar-flag (byte-compile (defun bar () (bar-stuff))))
      (rest-of-foo-stuff))

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

* Re: Are nested defun's byte-compiled?
       [not found] <mailman.1588.1116958704.25862.help-gnu-emacs@gnu.org>
@ 2005-05-24 22:15 ` Thierry Emery
  2005-05-24 22:25   ` Drew Adams
  2005-05-25 15:53 ` Stefan Monnier
  1 sibling, 1 reply; 7+ messages in thread
From: Thierry Emery @ 2005-05-24 22:15 UTC (permalink / raw)


"Drew Adams" <drew.adams@oracle.com> writes:

> Trying this again, as I received no response. Thanks, Drew.
>
>     Sent: Sunday, May 15, 2005 3:48 PM
>
>     Is the code defining a nested defun byte-compiled when its enclosing
>     defun is compiled? Example source file foo.el:
>
>     (defcustom define-bar-flag t "Define `bar' if non-nil.")
>     (defun foo ()
>       "Do foo stuff. Define `bar' if `define-bar-flag' is non-nil."
>       (when define-bar-flag (defun bar () (bar-stuff)))
>       (rest-of-foo-stuff))
>
>     Suppose foo.el is byte-compiled, and then foo.elc

[random speculations snipped]

If you open foo.elc with Emacs, you can see that the compiled definition
for `foo' contains a compiled definition for `bar'.

If you still have a doubt, you can:
M-x load-file
foo.elc
ESC ESC :
(foo)
;; this defines `bar' and signals an error because `rest-of-foo-stuff'
;; is not defined...
M-x debug-on-entry
bar
ESC ESC :
(bar)
d
;; and you see:
Debugger entered--beginning evaluation of function call form:
* (byte-code "À �" [bar-stuff] 1)
* bar()
  eval((bar))
  eval-expression((bar) nil)
  call-interactively(eval-expression)


HTH,

Thierry
-- 
thierry |point| emery |chez| free |point| fr

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

* RE: Are nested defun's byte-compiled?
  2005-05-24 22:15 ` Thierry Emery
@ 2005-05-24 22:25   ` Drew Adams
  0 siblings, 0 replies; 7+ messages in thread
From: Drew Adams @ 2005-05-24 22:25 UTC (permalink / raw)


    >     Is the code defining a nested defun byte-compiled when 
    >     its enclosing defun is compiled?

  [Answer: yes. Plus clear explanation of how to determine this.]

Thanks.

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

* Re: Are nested defun's byte-compiled?
       [not found] <mailman.1588.1116958704.25862.help-gnu-emacs@gnu.org>
  2005-05-24 22:15 ` Thierry Emery
@ 2005-05-25 15:53 ` Stefan Monnier
  2005-05-25 16:23   ` Drew Adams
  1 sibling, 1 reply; 7+ messages in thread
From: Stefan Monnier @ 2005-05-25 15:53 UTC (permalink / raw)


> Trying this again, as I received no response. Thanks, Drew.

Don't I count?

   http://groups.google.com/groups?hl=fr&lr=&frame=right&th=b1e56f162e4b2044&seekm=mailman.52.1116355611.25862.help-gnu-emacs%40gnu.org#link2


-- Stefan

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

* RE: Are nested defun's byte-compiled?
  2005-05-25 15:53 ` Stefan Monnier
@ 2005-05-25 16:23   ` Drew Adams
  0 siblings, 0 replies; 7+ messages in thread
From: Drew Adams @ 2005-05-25 16:23 UTC (permalink / raw)


    > Trying this again, as I received no response. Thanks, Drew.

    Don't I count?


http://groups.google.com/groups?hl=fr&lr=&frame=right&th=b1e56f162e4b2044&se
ekm=mailman.52.1116355611.25862.help-gnu-emacs%40gnu.org#link2

Yes, of course you count. Sorry, I've had email problems recently; I didn't
get your reply, for some reason. Thanks.

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

end of thread, other threads:[~2005-05-25 16:23 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <mailman.52.1116355611.25862.help-gnu-emacs@gnu.org>
2005-05-20 14:59 ` Are nested defun's byte-compiled? Stefan Monnier
     [not found] <mailman.1588.1116958704.25862.help-gnu-emacs@gnu.org>
2005-05-24 22:15 ` Thierry Emery
2005-05-24 22:25   ` Drew Adams
2005-05-25 15:53 ` Stefan Monnier
2005-05-25 16:23   ` Drew Adams
2005-05-15 22:47 Drew Adams
2005-05-24 17:46 ` Drew Adams

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).