unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* closure within closure, incorrect (?) byte-compiler warnings
@ 2021-11-01  7:06 Emanuel Berg via Users list for the GNU Emacs text editor
  2021-11-01  7:31 ` Emanuel Berg via Users list for the GNU Emacs text editor
  2021-11-01 12:31 ` Stefan Monnier via Users list for the GNU Emacs text editor
  0 siblings, 2 replies; 9+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-11-01  7:06 UTC (permalink / raw)
  To: help-gnu-emacs; +Cc: emacs-w3m

See the code, it is a closure (actually two) with the
intention of keeping inside a closure with the intention
of sharing ...

Keep and share! Good intensions that also seem to work, only
the byte-compiler reports incorrect/unhelpful warnings what
I can see.

Also note the inconsistent byte-compiler formating, both
`next' and ‘next’ ...

;;; -*- lexical-binding: t -*-
;;;
;;; this file:
;;;   https://dataswamp.org/~incal/emacs-init/w3m/w3m-survivor.el

(require 'w3m-search)
(require 'cl-lib)

(declare-function australian-survivor nil)
(declare-function us-survivor         nil)

(let ((opts   "torrent 1080p")
      (show   "Survivor")
      (prompt "episode ") )
  (let ((next 1))
    (defun australian-survivor (ep)
      (interactive (list (read-number prompt next)))
      (w3m-search
       w3m-search-default-engine
       (format "s08e%02d Australian %s %s" ep show opts) )
      (setq next (1+ ep)) ))
  (defalias 'aus #'australian-survivor)

  (let ((next 1))
    (defun us-survivor (ep)
      (interactive (list (read-number prompt next)))
      (w3m-search
       w3m-search-default-engine
       (format "s41%02d %s %s" ep show opts) )
      (setq next (1+ ep)) ))
  (defalias 'us #'us-survivor) )

;; In toplevel form:
;; w3m/w3m-survivor.el:12:1: Warning: Unused lexical variable `prompt'
;; w3m/w3m-survivor.el:12:1: Warning: Unused lexical variable `next'
;; w3m/w3m-survivor.el:26:39: Warning: reference to free variable ‘prompt’
;; w3m/w3m-survivor.el:26:46: Warning: reference to free variable ‘next’
;; w3m/w3m-survivor.el:22:14: Warning: Unused lexical variable `next'

-- 
underground experts united
https://dataswamp.org/~incal




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

* Re: closure within closure, incorrect (?) byte-compiler warnings
  2021-11-01  7:06 closure within closure, incorrect (?) byte-compiler warnings Emanuel Berg via Users list for the GNU Emacs text editor
@ 2021-11-01  7:31 ` Emanuel Berg via Users list for the GNU Emacs text editor
  2021-11-01 12:31 ` Stefan Monnier via Users list for the GNU Emacs text editor
  1 sibling, 0 replies; 9+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-11-01  7:31 UTC (permalink / raw)
  To: help-gnu-emacs; +Cc: emacs-w3m

> (prompt "episode ")

OK, so the suffix whitespace doesn't help or do anything
without a/the colon, it should be

  (prompt "episode: ")

Olé, olé, olé ...

https://www.youtube.com/watch?v=uppVNkPsozU

-- 
underground experts united
https://dataswamp.org/~incal




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

* Re: closure within closure, incorrect (?) byte-compiler warnings
  2021-11-01  7:06 closure within closure, incorrect (?) byte-compiler warnings Emanuel Berg via Users list for the GNU Emacs text editor
  2021-11-01  7:31 ` Emanuel Berg via Users list for the GNU Emacs text editor
@ 2021-11-01 12:31 ` Stefan Monnier via Users list for the GNU Emacs text editor
  2021-11-03  3:05   ` Emanuel Berg via Users list for the GNU Emacs text editor
  2021-11-08 23:09   ` Emanuel Berg via Users list for the GNU Emacs text editor
  1 sibling, 2 replies; 9+ messages in thread
From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-11-01 12:31 UTC (permalink / raw)
  To: help-gnu-emacs

>   (let ((next 1))
>     (defun australian-survivor (ep)
>       (interactive (list (read-number prompt next)))

IIRC the current compiler code doesn't support this kind of "interactive
spec nested within a lexical scope".

Your code makes sense, but AFAIK it may not always work correctly :-(

You might want to `M-x report-emacs-bug` (and if so, please put me in
the `X-Debbugs-Cc:`).


        Stefan




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

* Re: closure within closure, incorrect (?) byte-compiler warnings
  2021-11-01 12:31 ` Stefan Monnier via Users list for the GNU Emacs text editor
@ 2021-11-03  3:05   ` Emanuel Berg via Users list for the GNU Emacs text editor
  2021-11-08 23:09   ` Emanuel Berg via Users list for the GNU Emacs text editor
  1 sibling, 0 replies; 9+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-11-03  3:05 UTC (permalink / raw)
  To: help-gnu-emacs

Stefan Monnier via Users list for the GNU Emacs text editor wrote:

>>   (let ((next 1))
>>     (defun australian-survivor (ep)
>>       (interactive (list (read-number prompt next)))
>
> IIRC the current compiler code doesn't support this kind of
> "interactive spec nested within a lexical scope".

I did a little experiment (last) and the byte compiler
complains when there is a closure within a closure, now it
just gives the "reference to free variable" and not the
"Unused lexical variable" warning I got last time [1] -
I don't know why, but it's still not true ... no complains
when there is just a closure with `interactive'.

> Your code makes sense, but AFAIK it may not always work
> correctly :-(

You mean its worse than just the incorrect message?

Will it work when just evaluated, not byte-compiled?

And "not always work", how can that be?

> You might want to `M-x report-emacs-bug` (and if so, please
> put me in the `X-Debbugs-Cc:`).

Sure ... soon.

(declare-function set-num    nil)
(declare-function set-number nil)
(declare-function get-num    nil)

(let ((number 0))
  (defun set-num (num)
    (interactive "nNumber: ")
    (setq number num) )

  (defun set-number (&optional num)
    (interactive (list (read-number "Number: " 0)))
    (set-num num) )

  (defun get-num ()
    (interactive)
    (message "%f" number) ))

(declare-function set-num-x    nil)
(declare-function set-number-x nil)
(declare-function get-num-x    nil)

(let ((caption "Number-X: "))
  (let ((number-x 0))
    (defun set-num-x (num-x)
      (interactive "nNumber-X: ")
      (setq number-x num-x) )

    (defun set-number-x (&optional num-x)
      (interactive (list (read-number caption 0)))
      (set-num-x num-x) )

    (defun get-num-x ()
      (interactive)
      (message "%s%f" caption number-x) )))

;; geh.el:43:39: Warning: reference to free variable ‘caption’

[1] https://dataswamp.org/~incal/emacs-init/w3m/w3m-survivor.el

-- 
underground experts united
https://dataswamp.org/~incal




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

* Re: closure within closure, incorrect (?) byte-compiler warnings
  2021-11-01 12:31 ` Stefan Monnier via Users list for the GNU Emacs text editor
  2021-11-03  3:05   ` Emanuel Berg via Users list for the GNU Emacs text editor
@ 2021-11-08 23:09   ` Emanuel Berg via Users list for the GNU Emacs text editor
  2021-11-08 23:35     ` Emanuel Berg via Users list for the GNU Emacs text editor
  1 sibling, 1 reply; 9+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-11-08 23:09 UTC (permalink / raw)
  To: help-gnu-emacs

Stefan Monnier via Users list for the GNU Emacs text editor wrote:

>>   (let ((next 1))
>>     (defun australian-survivor (ep)
>>       (interactive (list (read-number prompt next)))
>
> IIRC the current compiler code doesn't support this kind of "interactive
> spec nested within a lexical scope".
>
> Your code makes sense, but AFAIK it may not always work correctly :-(

Indeed, it doesn't work after a restart when the byte-compiled
code (.elc) is loaded.

It causes no crash or error message until you use the
function, then it says

  call-interactively: Symbol’s value as variable is void:
  prompt

> You might want to `M-x report-emacs-bug` (and if so, please
> put me in the `X-Debbugs-Cc:`).

OK, I hope to do that soon ...

;;; -*- lexical-binding: t -*-
;;;
;;; this file:
;;;   https://dataswamp.org/~incal/emacs-init/w3m/w3m-survivor.el

(require 'w3m-search)
(require 'cl-lib)

(declare-function australian-survivor nil)
(declare-function us-survivor         nil)

(let ((opts   "torrent 1080p")
      (show   "Survivor")
      (prompt "episode: ") )
  (let ((next 1))
    (defun australian-survivor (ep)
      (interactive (list (read-number prompt next)))
      (w3m-search
       w3m-search-default-engine
       (format "s08e%02d Australian %s %s" ep show opts) )
      (setq next (1+ ep)) ))
  (defalias 'aus #'australian-survivor)

  (let ((next 1))
    (defun us-survivor (ep)
      (interactive (list (read-number prompt next)))
      (w3m-search
       w3m-search-default-engine
       (format "s41%02d %s %s" ep show opts) )
      (setq next (1+ ep)) ))
  (defalias 'us #'us-survivor) )

;; In toplevel form:
;; w3m/w3m-survivor.el:12:1: Warning: Unused lexical variable `prompt'
;; w3m/w3m-survivor.el:12:1: Warning: Unused lexical variable `next'
;; w3m/w3m-survivor.el:26:39: Warning: reference to free variable ‘prompt’
;; w3m/w3m-survivor.el:26:46: Warning: reference to free variable ‘next’
;; w3m/w3m-survivor.el:22:14: Warning: Unused lexical variable `next'

-- 
underground experts united
https://dataswamp.org/~incal




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

* Re: closure within closure, incorrect (?) byte-compiler warnings
  2021-11-08 23:09   ` Emanuel Berg via Users list for the GNU Emacs text editor
@ 2021-11-08 23:35     ` Emanuel Berg via Users list for the GNU Emacs text editor
  2021-11-09  0:04       ` Michael Heerdegen
  0 siblings, 1 reply; 9+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-11-08 23:35 UTC (permalink / raw)
  To: help-gnu-emacs

>> You might want to `M-x report-emacs-bug` (and if so, please
>> put me in the `X-Debbugs-Cc:`).
>
> OK, I hope to do that soon ...

This sums it up ... three bugs?

;;; -*- lexical-binding: t -*-
;;;
;;; this file:
;;;   http://user.it.uu.se/~embe8573/emacs-init/geh.el
;;;   https://dataswamp.org/~incal/emacs-init/geh.el

(let ((data-item 1)
      (more-data 2) )
    (defun echo-data (&optional data)
      (interactive (list (read-number "number: " (or data-item more-data))))
      (message "data: %s" (or data data-item)) ))
;; (echo-data 5)
;; (echo-data)
;; (call-interactively #'echo-data)

;; Emacs bugs:
;;
;; 1. Byte compiler warnings (two cases) relating to the
;;    interactive spec:
;;
;;    geh.el:7:1: Warning: Unused lexical variable `more-data'
;;    geh.el:10:54: Warning: reference to free variable ‘data-item’
;;    geh.el:10:64: Warning: reference to free variable ‘more-data’
;;
;; 2. When the compiled version is used interactively:
;;
;;    Symbol's value as variable is void: data-item

-- 
underground experts united
https://dataswamp.org/~incal




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

* Re: closure within closure, incorrect (?) byte-compiler warnings
  2021-11-08 23:35     ` Emanuel Berg via Users list for the GNU Emacs text editor
@ 2021-11-09  0:04       ` Michael Heerdegen
  2021-11-09  0:10         ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 1 reply; 9+ messages in thread
From: Michael Heerdegen @ 2021-11-09  0:04 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg via Users list for the GNU Emacs text editor
<help-gnu-emacs@gnu.org> writes:

> This sums it up ... three bugs?

> ;; 1. Byte compiler warnings (two cases) relating to the
> ;;    interactive spec:
> ;;
> ;;    geh.el:7:1: Warning: Unused lexical variable `more-data'
> ;;    geh.el:10:54: Warning: reference to free variable ‘data-item’
> ;;    geh.el:10:64: Warning: reference to free variable ‘more-data’
> ;;
> ;; 2. When the compiled version is used interactively:
> ;;
> ;;    Symbol's value as variable is void: data-item

These are all symptoms of one and the same issue: the interactive spec
currently can't refer to outer lexical variables.  The warnings are
actually legitimate, they only warn about this limitation.  So: one bug
(there was no Bug #3 in your list btw).

Michael.




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

* Re: closure within closure, incorrect (?) byte-compiler warnings
  2021-11-09  0:04       ` Michael Heerdegen
@ 2021-11-09  0:10         ` Emanuel Berg via Users list for the GNU Emacs text editor
  2021-11-10  4:16           ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 1 reply; 9+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-11-09  0:10 UTC (permalink / raw)
  To: help-gnu-emacs

Michael Heerdegen wrote:

>> This sums it up ... three bugs?
>
>> ;; 1. Byte compiler warnings (two cases) relating to the
>> ;;    interactive spec:
>> ;;
>> ;;    geh.el:7:1: Warning: Unused lexical variable `more-data'
>> ;;    geh.el:10:54: Warning: reference to free variable ‘data-item’
>> ;;    geh.el:10:64: Warning: reference to free variable ‘more-data’
>> ;;
>> ;; 2. When the compiled version is used interactively:
>> ;;
>> ;;    Symbol's value as variable is void: data-item
>
> These are all symptoms of one and the same issue: the
> interactive spec currently can't refer to outer lexical
> variables. The warnings are actually legitimate, they only
> warn about this limitation. So: one bug (there was no Bug #3
> in your list btw).

OK, I submitted only one bug report so if you (or anyone else)
want to submit the other two feel free to do it.

-- 
underground experts united
https://dataswamp.org/~incal




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

* Re: closure within closure, incorrect (?) byte-compiler warnings
  2021-11-09  0:10         ` Emanuel Berg via Users list for the GNU Emacs text editor
@ 2021-11-10  4:16           ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 0 replies; 9+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-11-10  4:16 UTC (permalink / raw)
  To: help-gnu-emacs

Now it works with a workaround that involves dedicated
functions to handle the interactive cases of the
original functions.

Thanks to people at gmane.emacs.bugs ...

;;; -*- lexical-binding: t -*-
;;;
;;; this file:
;;;   https://dataswamp.org/~incal/emacs-init/w3m/w3m-survivor.el

(require 'w3m-search)
(require 'cl-lib)

(let ((opts   "torrent 1080p")
      (show   "Survivor")
      (prompt "episode: ") )
  (let ((next 1))
    (defun australian-survivor-interactive ()
      (list (read-number prompt next)) )
    (declare-function australian-survivor-interactive nil)
    (defalias 'aus #'australian-survivor-interactive)

    (defun australian-survivor (ep)
      (interactive (australian-survivor-interactive))
      (w3m-search
       w3m-search-default-engine
       (format "s08e%02d Australian %s %s" ep show opts) )
      (setq next (1+ ep)) )
    (declare-function australian-survivor nil) )

  (let ((next 1))
    (defun us-survivor-interactive ()
      (list (read-number prompt next)) )
    (declare-function us-survivor-interactive nil)
    (defalias 'us #'us-survivor-interactive)

    (defun us-survivor (ep)
      (interactive (us-survivor-interactive))
      (w3m-search
       w3m-search-default-engine
       (format "s41%02d %s %s" ep show opts) )
      (setq next (1+ ep)) )
    (declare-function us-survivor nil) ))

-- 
underground experts united
https://dataswamp.org/~incal




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

end of thread, other threads:[~2021-11-10  4:16 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-01  7:06 closure within closure, incorrect (?) byte-compiler warnings Emanuel Berg via Users list for the GNU Emacs text editor
2021-11-01  7:31 ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-11-01 12:31 ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-11-03  3:05   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-11-08 23:09   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-11-08 23:35     ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-11-09  0:04       ` Michael Heerdegen
2021-11-09  0:10         ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-11-10  4:16           ` Emanuel Berg via Users list for the GNU Emacs text editor

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