Subject: Re: bug#51695: 29.0.50; lexical scope closure, interactive spec byte compiler warnings/usage issue

From: Eli Zaretskii <[email-masked]>
Date: Tue, 09 Nov 2021 14:29:58 +0200

> Cc: Stefan Monnier <[email-masked]>
> Date: Tue, 09 Nov 2021 00:40:33 +0100
> From:  Emanuel Berg via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <[email-masked]>
> 
> ;;; -*- 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

How can the interactive spec use lexically-bound variables outside its
scope, when the interactive spec runs not at function definition time,
but at function invocation time, when those variables will be long
gone?  What is expected from the above code, and why?