unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#23781: 25.0.95; read-string with HIST lexically bound
@ 2016-06-17  5:19 Tino Calancha
  2016-06-17 15:25 ` Michael Heerdegen
  0 siblings, 1 reply; 18+ messages in thread
From: Tino Calancha @ 2016-06-17  5:19 UTC (permalink / raw)
  To: 23781


Hello,

recently i have noticed that arg HIST in read-from-minibuffer/read-string
needs to be dynamically bound.  If the file has the local variable
lexical-binding non-nil those functions just pick up one element of HIST.

In case this is a feature, it would be worth to mention it on the manual.


Following example reproduce the issue:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

I)

Create two files 'test-dynamic.el', 'test-lexical.el'
as follows:

*) test-dynamic.el:
(defun my-test-dynamic ()
   "Test of dynamic-binding."
   (interactive)
   (let ((values '("a" "b" "c")))
     (read-string "dynamic: " (car values) '(values . 1))))


*) test-lexical.el:
;; -*- lexical-binding: t; -*-

(defvar my-test-var nil)

(defun my-test-lexical-defvar ()
   "Test of lexical-binding with defvar."
   (interactive)
     (let ((values '("a" "b" "c")))
       (setq my-test-var values))
     (read-string "lexical-defvar: " (car my-test-var) '(my-test-var . 1)))

(defun my-test-lexical ()
   "Test of lexical-binding."
   (interactive)
   (let ((values '("a" "b" "c")))
     (read-string "lexical: " (car values) '(values . 1))))

II)
emacs -Q -l test-dynamic.el -l test-lexical.el

II.1)

M-x my-test-dynamic RET
;; minibuffer shows: dynamic: a
M-p
;; minibuffer shows: dynamic: b
M-p
;; minibuffer shows: dynamic: c

II.2) (Similar than II.1)

M-x my-test-lexical-defvar RET
;; minibuffer shows: lexical-defvar: a
M-p
;; minibuffer shows: lexical-defvar: b
M-p
;; minibuffer shows: lexical-defvar: c

II.3) (Different)
M-x my-test-lexical RET
;; minibuffer shows: lexical: a
M-p
;; user-error: Beginning of history; no preceding item


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

In GNU Emacs 25.0.95.1 (x86_64-pc-linux-gnu, GTK+ Version 3.20.6)
  of 2016-06-15 built on calancha-pc
Repository revision: d7084f2260943287cdfb5e3021ac33aab6a14c6d
Windowing system distributor 'The X.Org Foundation', version 11.0.11803000
System Description:    Debian GNU/Linux testing (stretch)

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GCONF GSETTINGS
NOTIFY ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11

Important settings:
   value of $LANG: en_US.UTF-8
   locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
   tooltip-mode: t
   global-eldoc-mode: t
   electric-indent-mode: t
   mouse-wheel-mode: t
   tool-bar-mode: t
   menu-bar-mode: t
   file-name-shadow-mode: t
   global-font-lock-mode: t
   font-lock-mode: t
   blink-cursor-mode: t
   auto-composition-mode: t
   auto-encryption-mode: t
   auto-compression-mode: t
   line-number-mode: t
   transient-mark-mode: t

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
Quit [2 times]
user-error: Beginning of history; no preceding item [2 times]
Quit

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message dired format-spec rfc822 mml
mml-sec password-cache epg epg-config gnus-util mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail
rfc2047 rfc2045 ietf-drums mm-util help-fns help-mode easymenu
cl-loaddefs pcase cl-lib mail-prsvr mail-utils time-date mule-util
tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type
mwheel x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt
fringe tabulated-list newcomment elisp-mode lisp-mode prog-mode register
page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock
font-lock syntax facemenu font-core frame cl-generic cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese charscript case-table epa-hook
jka-cmpr-hook help simple abbrev minibuffer cl-preloaded nadvice
loaddefs button faces cus-face macroexp files text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote dbusbind inotify dynamic-setting
system-font-setting font-render-setting move-toolbar gtk x-toolkit x
multi-tty make-network-process emacs)

Memory information:
((conses 16 86343 6478)
  (symbols 48 19751 0)
  (miscs 40 38 121)
  (strings 32 14375 4876)
  (string-bytes 1 409631)
  (vectors 16 11718)
  (vector-slots 8 428578 4129)
  (floats 8 164 84)
  (intervals 56 193 0)
  (buffers 976 11)
  (heap 1024 28246 991))






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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-17  5:19 bug#23781: 25.0.95; read-string with HIST lexically bound Tino Calancha
@ 2016-06-17 15:25 ` Michael Heerdegen
  2016-06-23 23:01   ` Noam Postavsky
  0 siblings, 1 reply; 18+ messages in thread
From: Michael Heerdegen @ 2016-06-17 15:25 UTC (permalink / raw)
  To: Tino Calancha; +Cc: 23781

Tino Calancha <f92capac@gmail.com> writes:

> (defun my-test-lexical ()
>   "Test of lexical-binding."
>   (interactive)
>   (let ((values '("a" "b" "c")))
>     (read-string "lexical: " (car values) '(values . 1))))
>
> [...]
> II.3) (Different)
> M-x my-test-lexical RET
> ;; minibuffer shows: lexical: a
> M-p
> ;; user-error: Beginning of history; no preceding item

AFAICT this is expected and not specific to `read-string': A quoted
symbol can never refer to a lexical binding - and `symbol-value' or
`eval' always return the dynamic binding.

Some time ago, Stefan gave a good explanation about this topic (in
emacs-dev, I think).


Michael.





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-17 15:25 ` Michael Heerdegen
@ 2016-06-23 23:01   ` Noam Postavsky
  2016-06-23 23:18     ` Drew Adams
  2016-06-24  2:24     ` Tino Calancha
  0 siblings, 2 replies; 18+ messages in thread
From: Noam Postavsky @ 2016-06-23 23:01 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: Tino Calancha, 23781

On Fri, Jun 17, 2016 at 11:25 AM, Michael Heerdegen
<michael_heerdegen@web.de> wrote:
>
> AFAICT this is expected and not specific to `read-string': A quoted
> symbol can never refer to a lexical binding - and `symbol-value' or
> `eval' always return the dynamic binding.

Right, it's sort of hinted at in the elisp manual (11.9.3 Lexical Binding):

    Note that functions like ‘symbol-value’, ‘boundp’, and ‘set’ only
    retrieve or modify a variable’s dynamic binding (i.e., the
    contents of its symbol’s value cell).

I think we should be a little more specific, not
just give examples, something like:

    Note that functions which take a symbol argument (like
    ‘symbol-value’, ‘boundp’, and ‘set’) can only retrieve or modify a
    variable’s dynamic binding (i.e., the contents of its symbol’s
    value cell).

Sort of releated: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=21185





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-23 23:01   ` Noam Postavsky
@ 2016-06-23 23:18     ` Drew Adams
  2016-06-25  0:26       ` Noam Postavsky
  2016-06-24  2:24     ` Tino Calancha
  1 sibling, 1 reply; 18+ messages in thread
From: Drew Adams @ 2016-06-23 23:18 UTC (permalink / raw)
  To: Noam Postavsky, Michael Heerdegen; +Cc: Tino Calancha, 23781

> > AFAICT this is expected and not specific to `read-string': A quoted
> > symbol can never refer to a lexical binding - and `symbol-value' or
> > `eval' always return the dynamic binding.
> 
> Right, it's sort of hinted at in the elisp manual (11.9.3 Lexical Binding):
> 
>     Note that functions like ‘symbol-value’, ‘boundp’, and ‘set’ only
>     retrieve or modify a variable’s dynamic binding (i.e., the
>     contents of its symbol’s value cell).
> 
> I think we should be a little more specific, not
> just give examples, something like:
> 
>     Note that functions which take a symbol argument (like
>     ‘symbol-value’, ‘boundp’, and ‘set’) can only retrieve or modify a
>     variable’s dynamic binding (i.e., the contents of its symbol’s
>     value cell).
> 
> Sort of releated: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=21185

Be even more specific: A Lisp symbol is a dynamic thing.
It is an object.  Lexical binding has nothing to do with symbols.
A given _name_ in code can sometimes be lexically bound.





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-23 23:01   ` Noam Postavsky
  2016-06-23 23:18     ` Drew Adams
@ 2016-06-24  2:24     ` Tino Calancha
  1 sibling, 0 replies; 18+ messages in thread
From: Tino Calancha @ 2016-06-24  2:24 UTC (permalink / raw)
  To: Noam Postavsky; +Cc: Michael Heerdegen, Tino Calancha, 23781

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



On Thu, 23 Jun 2016, Noam Postavsky wrote:

> I think we should be a little more specific, not
> just give examples, something like:
>
>    Note that functions which take a symbol argument (like
>    ‘symbol-value’, ‘boundp’, and ‘set’) can only retrieve or modify a
>    variable’s dynamic binding (i.e., the contents of its symbol’s
>    value cell).
>
> Sort of releated: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=21185
+1
I read that part of the manual before opening this bug and i was still 
confuse.


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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-23 23:18     ` Drew Adams
@ 2016-06-25  0:26       ` Noam Postavsky
  2016-06-25 10:12         ` Stephen Berman
  0 siblings, 1 reply; 18+ messages in thread
From: Noam Postavsky @ 2016-06-25  0:26 UTC (permalink / raw)
  To: Drew Adams; +Cc: Michael Heerdegen, Tino Calancha, 23781

On Thu, Jun 23, 2016 at 7:18 PM, Drew Adams <drew.adams@oracle.com> wrote:
>> I think we should be a little more specific, not
>> just give examples, something like:
>>
>>     Note that functions which take a symbol argument (like
>>     ‘symbol-value’, ‘boundp’, and ‘set’) can only retrieve or modify a
>>     variable’s dynamic binding (i.e., the contents of its symbol’s
>>     value cell).
>
> Be even more specific: A Lisp symbol is a dynamic thing.
> It is an object.  Lexical binding has nothing to do with symbols.
> A given _name_ in code can sometimes be lexically bound.

Hmm, this threatens to get a little philosophical, but that seems to
contradict earlier text in the same node:

       Here is how lexical binding works.  Each binding construct
    defines a “lexical environment”, specifying the symbols that are
    bound within the construct and their local values.  When the Lisp
    evaluator wants the current value of a variable, it looks first in
    the lexical environment; if the variable is not specified in
    there, it looks in the symbol’s value cell, where the dynamic
    value is stored.





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-25  0:26       ` Noam Postavsky
@ 2016-06-25 10:12         ` Stephen Berman
  2016-06-25 16:53           ` Noam Postavsky
  0 siblings, 1 reply; 18+ messages in thread
From: Stephen Berman @ 2016-06-25 10:12 UTC (permalink / raw)
  To: Noam Postavsky; +Cc: Michael Heerdegen, Tino Calancha, 23781

On Fri, 24 Jun 2016 20:26:45 -0400 Noam Postavsky <npostavs@users.sourceforge.net> wrote:

> On Thu, Jun 23, 2016 at 7:18 PM, Drew Adams <drew.adams@oracle.com> wrote:
>>> I think we should be a little more specific, not
>>> just give examples, something like:
>>>
>>>     Note that functions which take a symbol argument (like
>>>     ‘symbol-value’, ‘boundp’, and ‘set’) can only retrieve or modify a
>>>     variable’s dynamic binding (i.e., the contents of its symbol’s
>>>     value cell).
>>
>> Be even more specific: A Lisp symbol is a dynamic thing.
>> It is an object.  Lexical binding has nothing to do with symbols.
>> A given _name_ in code can sometimes be lexically bound.
>
> Hmm, this threatens to get a little philosophical, but that seems to
> contradict earlier text in the same node:
>
>        Here is how lexical binding works.  Each binding construct
>     defines a “lexical environment”, specifying the symbols that are
>     bound within the construct and their local values.

I think it's more a question of definition than philosophy: AFAIU using
the word "symbols" here is strictly speaking incorrect; it should be
"variables".

Steve Berman





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-25 10:12         ` Stephen Berman
@ 2016-06-25 16:53           ` Noam Postavsky
  2016-06-25 18:53             ` Stephen Berman
  2016-06-25 20:42             ` Drew Adams
  0 siblings, 2 replies; 18+ messages in thread
From: Noam Postavsky @ 2016-06-25 16:53 UTC (permalink / raw)
  To: Stephen Berman; +Cc: Michael Heerdegen, Tino Calancha, 23781

On Sat, Jun 25, 2016 at 6:12 AM, Stephen Berman <stephen.berman@gmx.net> wrote:
> On Fri, 24 Jun 2016 20:26:45 -0400 Noam Postavsky <npostavs@users.sourceforge.net> wrote:
>
>> On Thu, Jun 23, 2016 at 7:18 PM, Drew Adams <drew.adams@oracle.com> wrote:
>>>> I think we should be a little more specific, not
>>>> just give examples, something like:
>>>>
>>>>     Note that functions which take a symbol argument (like
>>>>     ‘symbol-value’, ‘boundp’, and ‘set’) can only retrieve or modify a
>>>>     variable’s dynamic binding (i.e., the contents of its symbol’s
>>>>     value cell).
>>>
>>> Be even more specific: A Lisp symbol is a dynamic thing.
>>> It is an object.  Lexical binding has nothing to do with symbols.
>>> A given _name_ in code can sometimes be lexically bound.
>>
>> Hmm, this threatens to get a little philosophical, but that seems to
>> contradict earlier text in the same node:
>>
>>        Here is how lexical binding works.  Each binding construct
>>     defines a “lexical environment”, specifying the symbols that are
>>     bound within the construct and their local values.
>
> I think it's more a question of definition than philosophy: AFAIU using
> the word "symbols" here is strictly speaking incorrect; it should be
> "variables".

Yes, perhaps the implementation details leaked a bit too much into the
description. I think it remains the case that the name of a variable
is a symbol (as opposed to a string) though.





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-25 16:53           ` Noam Postavsky
@ 2016-06-25 18:53             ` Stephen Berman
  2016-06-25 19:46               ` Noam Postavsky
  2016-06-25 21:00               ` Drew Adams
  2016-06-25 20:42             ` Drew Adams
  1 sibling, 2 replies; 18+ messages in thread
From: Stephen Berman @ 2016-06-25 18:53 UTC (permalink / raw)
  To: Noam Postavsky; +Cc: Michael Heerdegen, Tino Calancha, 23781

On Sat, 25 Jun 2016 12:53:18 -0400 Noam Postavsky <npostavs@users.sourceforge.net> wrote:

> On Sat, Jun 25, 2016 at 6:12 AM, Stephen Berman <stephen.berman@gmx.net> wrote:
>> On Fri, 24 Jun 2016 20:26:45 -0400 Noam Postavsky
>> <npostavs@users.sourceforge.net> wrote:
>>
>>> On Thu, Jun 23, 2016 at 7:18 PM, Drew Adams <drew.adams@oracle.com> wrote:
>>>>> I think we should be a little more specific, not
>>>>> just give examples, something like:
>>>>>
>>>>>     Note that functions which take a symbol argument (like
>>>>>     ‘symbol-value’, ‘boundp’, and ‘set’) can only retrieve or modify a
>>>>>     variable’s dynamic binding (i.e., the contents of its symbol’s
>>>>>     value cell).
>>>>
>>>> Be even more specific: A Lisp symbol is a dynamic thing.
>>>> It is an object.  Lexical binding has nothing to do with symbols.
>>>> A given _name_ in code can sometimes be lexically bound.
>>>
>>> Hmm, this threatens to get a little philosophical, but that seems to
>>> contradict earlier text in the same node:
>>>
>>>        Here is how lexical binding works.  Each binding construct
>>>     defines a “lexical environment”, specifying the symbols that are
>>>     bound within the construct and their local values.
>>
>> I think it's more a question of definition than philosophy: AFAIU using
>> the word "symbols" here is strictly speaking incorrect; it should be
>> "variables".
>
> Yes, perhaps the implementation details leaked a bit too much into the
> description. I think it remains the case that the name of a variable
> is a symbol (as opposed to a string) though.

Well, the info node `(elisp) Variables' says:

   In Lisp, each variable is represented by a Lisp symbol (see
   Symbols::).  The variable name is simply the symbol’s name [...]

and a symbol's name is a string (according to `symbol-name').  But maybe
we should leave the bike shed before this gets too philosophical ;-)

Steve Berman 






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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-25 18:53             ` Stephen Berman
@ 2016-06-25 19:46               ` Noam Postavsky
  2016-06-25 22:07                 ` Stephen Berman
  2016-06-25 21:00               ` Drew Adams
  1 sibling, 1 reply; 18+ messages in thread
From: Noam Postavsky @ 2016-06-25 19:46 UTC (permalink / raw)
  To: Stephen Berman; +Cc: Michael Heerdegen, Tino Calancha, 23781

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

On Sat, Jun 25, 2016 at 2:53 PM, Stephen Berman <stephen.berman@gmx.net> wrote:
> But maybe
> we should leave the bike shed before this gets too philosophical ;-)

Ugh, yes please.

So can we agree on this updated wording? (as shown in attached patch)

       Note that unlike dynamic variables which are tied to the symbol
    object itself, the relationship between lexical variables and
    symbols is only present in the interpreter (or compiler).
    Therefore, functions which take a symbol argument (like
    ‘symbol-value’, ‘boundp’, and ‘set’) can only retrieve or modify a
    variable’s dynamic binding (i.e., the contents of its symbol’s
    value cell).  Also, the code in the body of a ‘defun’ or
    ‘defmacro’ cannot refer to surrounding lexical variables.

Should it be updated any further? (if yes, please reply with concrete proposals)

[-- Attachment #2: 0001-Clarify-lexical-binding-with-symbol-args-behavior.patch --]
[-- Type: text/x-patch, Size: 2145 bytes --]

From 151c2837dc5c82073465f6b68e0216a0e8149cf7 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Fri, 24 Jun 2016 20:39:24 -0400
Subject: [PATCH] Clarify lexical binding with symbol args behavior

* doc/lispref/variables.texi (Lexical Binding): Clarify that symbol
arguments always refer to dynamic values (Bug #23781).
---
 doc/lispref/variables.texi | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index 6c53e9b..b4d6857 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -974,7 +974,7 @@ Lexical Binding
 
 @cindex lexical environment
   Here is how lexical binding works.  Each binding construct defines a
-@dfn{lexical environment}, specifying the symbols that are bound
+@dfn{lexical environment}, specifying the variables that are bound
 within the construct and their local values.  When the Lisp evaluator
 wants the current value of a variable, it looks first in the lexical
 environment; if the variable is not specified in there, it looks in
@@ -1032,11 +1032,14 @@ Lexical Binding
 time we evaluate the closure, it increments @code{x}, using the
 binding of @code{x} in that lexical environment.
 
-  Note that functions like @code{symbol-value}, @code{boundp}, and
-@code{set} only retrieve or modify a variable's dynamic binding
-(i.e., the contents of its symbol's value cell).  Also, the code in
-the body of a @code{defun} or @code{defmacro} cannot refer to
-surrounding lexical variables.
+  Note that unlike dynamic variables which are tied to the symbol
+object itself, the relationship between lexical variables and symbols
+is only present in the interpreter (or compiler).  Therefore,
+functions which take a symbol argument (like @code{symbol-value},
+@code{boundp}, and @code{set}) can only retrieve or modify a
+variable's dynamic binding (i.e., the contents of its symbol's value
+cell).  Also, the code in the body of a @code{defun} or
+@code{defmacro} cannot refer to surrounding lexical variables.
 
 @node Using Lexical Binding
 @subsection Using Lexical Binding
-- 
2.8.0


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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-25 16:53           ` Noam Postavsky
  2016-06-25 18:53             ` Stephen Berman
@ 2016-06-25 20:42             ` Drew Adams
  1 sibling, 0 replies; 18+ messages in thread
From: Drew Adams @ 2016-06-25 20:42 UTC (permalink / raw)
  To: Noam Postavsky, Stephen Berman; +Cc: Michael Heerdegen, Tino Calancha, 23781

> > I think it's more a question of definition than philosophy: AFAIU using
> > the word "symbols" here is strictly speaking incorrect; it should be
> > "variables".
> 
> Yes, perhaps the implementation details leaked a bit too much into the
> description. I think it remains the case that the name of a variable
> is a symbol (as opposed to a string) though.

The _name_ of a variable is not a symbol.

A symbol is a Lisp object.  It can have a name (`symbol-name'), a
value as a (dynamic) variable (`symbol-value'), a value as a
function (`symbol-function'), and a list of arbitrary Lisp values
(`symbol-plist').

Other kinds of programming variables also exist in Emacs Lisp,
including lexical variables.  A `let' and similar constructs in
the language can bind a lexical variable or it can bind a dynamic
variable, that is, a symbol used as a variable.  In the latter
case, the bound value is available as the symbol's `symbol-value'.





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-25 18:53             ` Stephen Berman
  2016-06-25 19:46               ` Noam Postavsky
@ 2016-06-25 21:00               ` Drew Adams
  1 sibling, 0 replies; 18+ messages in thread
From: Drew Adams @ 2016-06-25 21:00 UTC (permalink / raw)
  To: Stephen Berman, Noam Postavsky; +Cc: Michael Heerdegen, Tino Calancha, 23781

> Well, the info node `(elisp) Variables' says:
> 
>    In Lisp, each variable is represented by a Lisp symbol (see
>    Symbols::).  The variable name is simply the symbol’s name [...]
> 
> and a symbol's name is a string (according to `symbol-name').  But maybe
> we should leave the bike shed before this gets too philosophical ;-)

That was written (and was true) back when Emacs had only dynamic
variables, that is, symbols that act as variables, with name
`symbol-name' and value `symbol-value'.

Unfortunately, the developer who added lexical binding to Emacs
Lisp was not very strong or motivated in the Doc department (by
his own admission), so that text was not amended.  At least that's
my guess for why it still says that.

Section `Variable Scoping' was added to the manual to present
lexical binding.  And there is some hint of it in node `Local
Variables'.  The rest of the doc seems to generally be talking
about dynamic variables (even if local, buffer-local, file-local,
etc.).





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-25 19:46               ` Noam Postavsky
@ 2016-06-25 22:07                 ` Stephen Berman
  2016-06-25 23:42                   ` Michael Heerdegen
  2016-06-26  2:23                   ` Drew Adams
  0 siblings, 2 replies; 18+ messages in thread
From: Stephen Berman @ 2016-06-25 22:07 UTC (permalink / raw)
  To: Noam Postavsky; +Cc: Michael Heerdegen, Tino Calancha, 23781

On Sat, 25 Jun 2016 15:46:38 -0400 Noam Postavsky <npostavs@users.sourceforge.net> wrote:

> So can we agree on this updated wording? (as shown in attached patch)
>
>        Note that unlike dynamic variables which are tied to the symbol
>     object itself, the relationship between lexical variables and
>     symbols is only present in the interpreter (or compiler).
>     Therefore, functions which take a symbol argument (like
>     ‘symbol-value’, ‘boundp’, and ‘set’) can only retrieve or modify a
>     variable’s dynamic binding (i.e., the contents of its symbol’s
>     value cell).  Also, the code in the body of a ‘defun’ or
>     ‘defmacro’ cannot refer to surrounding lexical variables.

This sounds clearer to me, thanks.

> Should it be updated any further? (if yes, please reply with concrete proposals)

I don't feel competent enough to judge that; however, Drew pointed out
that the `(elisp) Variables' node I quoted from earlier and other places
in the manual haven't been updated for lexical binding.  Anyway, these
questions would be more properly assigned to a separate bug report.

Steve Berman





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-25 22:07                 ` Stephen Berman
@ 2016-06-25 23:42                   ` Michael Heerdegen
  2016-06-26  3:34                     ` Noam Postavsky
  2016-06-26  2:23                   ` Drew Adams
  1 sibling, 1 reply; 18+ messages in thread
From: Michael Heerdegen @ 2016-06-25 23:42 UTC (permalink / raw)
  To: Stephen Berman; +Cc: Tino Calancha, 23781, Noam Postavsky

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

> >  Also, the code in the body of a ‘defun’ or
> >  ‘defmacro’ cannot refer to surrounding lexical variables.


This seems a bit unclear to me.  It sounds like something like this
would not work:

;; -*- lexical-binding: t -*-
(let ((x 1))
  (defun f () x))

(f) ==> 1


The term "surrounding" can describe different things here (mostly,
"lexically" vs. "dynamically" surrounding).


Michael.





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-25 22:07                 ` Stephen Berman
  2016-06-25 23:42                   ` Michael Heerdegen
@ 2016-06-26  2:23                   ` Drew Adams
  1 sibling, 0 replies; 18+ messages in thread
From: Drew Adams @ 2016-06-26  2:23 UTC (permalink / raw)
  To: Stephen Berman, Noam Postavsky; +Cc: Michael Heerdegen, Tino Calancha, 23781

> > So can we agree on this updated wording? (as shown in attached patch)
> >
> >        Note that unlike dynamic variables which are tied to the symbol
> >     object itself, the relationship between lexical variables and
> >     symbols is only present in the interpreter (or compiler).
> >     Therefore, functions which take a symbol argument (like
> >     ‘symbol-value’, ‘boundp’, and ‘set’) can only retrieve or modify a
> >     variable’s dynamic binding (i.e., the contents of its symbol’s
> >     value cell).  Also, the code in the body of a ‘defun’ or
> >     ‘defmacro’ cannot refer to surrounding lexical variables.
> 
> This sounds clearer to me, thanks.
> 
> > Should it be updated any further? (if yes, please reply with concrete
> proposals)
> 
> I don't feel competent enough to judge that; however, Drew pointed out
> that the `(elisp) Variables' node I quoted from earlier and other places
> in the manual haven't been updated for lexical binding.  Anyway, these
> questions would be more properly assigned to a separate bug report.

My comments were probably too simplistic.  It would be good for
someone to take a close look at all of the doc about symbols,
variables, and lexical/dynamic treatment.  But it is probably
not critical.  If someone does that, s?he probably needs to be
careful, and the result, if precise, might be too unreadable
for our manual.

I agree that any such consideration is outside this bug report.

FWIW, the CLTL2 section "3. Scope and Extent" is helpful here,
even though Emacs Lisp is not Common Lisp.

You will soon see there, however, that the relation between
symbols and variables is not so straightforward.  You will
right away see "referencable entities", which have both scope
and extent and which become "established" by "the execution
of some language construct".  Referencable entities include
function parameters and other variables, and even `catch'
and `throw' tags.

I recommend a (re-)reading of that section, asking yourself
why this or that term is introduced instead of just referring
to words like "variable".  None of the terms are introduced
gratuitously.

So yes, it would be good to be precise in the Elisp manual,
but some degree of imprecision can sometimes make for more,
not less clarity. ;-)

One thing that could perhaps be made more clear in the doc
is that the Lisp reader creates symbols (and conses and
vectors and...).  I'm not sure that this is made clear.

These created symbols etc. are used when the objects resulting
from reading are later evaluated.  IOW, even a referencable
entity such as a `catch' tag is associated with a symbol when
the `catch' code is read.  Likewise, for function parameters and
other variables, including variables that use lexical binding.





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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-25 23:42                   ` Michael Heerdegen
@ 2016-06-26  3:34                     ` Noam Postavsky
  2016-06-27  0:55                       ` Noam Postavsky
  0 siblings, 1 reply; 18+ messages in thread
From: Noam Postavsky @ 2016-06-26  3:34 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: Tino Calancha, Stephen Berman, 23781

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

On Sat, Jun 25, 2016 at 7:42 PM, Michael Heerdegen
<michael_heerdegen@web.de> wrote:
> Stephen Berman <stephen.berman@gmx.net> writes:
>
>> >  Also, the code in the body of a ‘defun’ or
>> >  ‘defmacro’ cannot refer to surrounding lexical variables.
>
>
> This seems a bit unclear to me.  It sounds like something like this
> would not work:
>
> ;; -*- lexical-binding: t -*-
> (let ((x 1))
>   (defun f () x))
>
> (f) ==> 1

That's indeed what it meant, but this restriction was lifted sometime
after 24.1, see
http://help-gnu-emacs.gnu.narkive.com/uspqRdsq/surrounding-lexical-variable-reference-in-the-body-of-defun
and http://stackoverflow.com/questions/12026137/emacs-the-code-in-the-body-of-a-defun-or-defmacro-cannot-refer-to-surrounding-l.
Updated patch to remove that sentence.

[-- Attachment #2: v2-0001-Add-to-elisp-completion-at-point-s-docstring.patch --]
[-- Type: text/x-patch, Size: 2087 bytes --]

From 3f08a8a535e8fb5dced8bf1474659244ed358125 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Sat, 25 Jun 2016 16:23:04 -0400
Subject: [PATCH v2] Add to elisp-completion-at-point's docstring

* lisp/progmodes/elisp-mode.el (elisp-completion-at-point): Document
position dependent behavior.  Remove mention of obsolete restriction
regarding lexical binding for defun and defmacro, this no longer applies
since 61b108cc 2012-05-29 "* lisp/emacs-lisp/byte-run.el (defmacro,
defun): Move from C..." (Bug #19854).
---
 doc/lispref/variables.texi   | 3 +--
 lisp/progmodes/elisp-mode.el | 6 +++++-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index b4d6857..a2d6481 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -1038,8 +1038,7 @@ Lexical Binding
 functions which take a symbol argument (like @code{symbol-value},
 @code{boundp}, and @code{set}) can only retrieve or modify a
 variable's dynamic binding (i.e., the contents of its symbol's value
-cell).  Also, the code in the body of a @code{defun} or
-@code{defmacro} cannot refer to surrounding lexical variables.
+cell).
 
 @node Using Lexical Binding
 @subsection Using Lexical Binding
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index 7ad8871..850ebb4 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -455,7 +455,11 @@ elisp--company-location
      ((facep sym) (find-definition-noselect sym 'defface)))))
 
 (defun elisp-completion-at-point ()
-  "Function used for `completion-at-point-functions' in `emacs-lisp-mode'."
+  "Function used for `completion-at-point-functions' in `emacs-lisp-mode'.
+The returned completions depend on whether point is in a function
+or variable position; in positions where both are
+possible (e.g. quoted symbols), functions are annotated with
+\"<f>\" via the `:annotation-function' property."
   (with-syntax-table emacs-lisp-mode-syntax-table
     (let* ((pos (point))
 	   (beg (condition-case nil
-- 
2.8.0


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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-26  3:34                     ` Noam Postavsky
@ 2016-06-27  0:55                       ` Noam Postavsky
  2016-07-01  4:07                         ` npostavs
  0 siblings, 1 reply; 18+ messages in thread
From: Noam Postavsky @ 2016-06-27  0:55 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: Tino Calancha, Stephen Berman, 23781

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

On Sat, Jun 25, 2016 at 11:34 PM, Noam Postavsky
<npostavs@users.sourceforge.net> wrote:
> Updated patch to remove that sentence.

I messed up the patch (the change got combined with unrelated commit).
Here's a corrected one.

[-- Attachment #2: v3-0001-Clarify-lexical-binding-with-symbol-args-behavior.patch --]
[-- Type: text/x-patch, Size: 2240 bytes --]

From a669e69972cf6bcb9845a06a2427034b8bd18c0b Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Fri, 24 Jun 2016 20:39:24 -0400
Subject: [PATCH v3] Clarify lexical binding with symbol args behavior

* doc/lispref/variables.texi (Lexical Binding): Clarify that symbol
arguments always refer to dynamic values (Bug #23781).  Remove mention
of obsolete restriction regarding lexical binding for defun and
defmacro, this no longer applies since 61b108cc 2012-05-29 "*
lisp/emacs-lisp/byte-run.el (defmacro, defun): Move from C...".
---
 doc/lispref/variables.texi | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index 6c53e9b..a2d6481 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -974,7 +974,7 @@ Lexical Binding
 
 @cindex lexical environment
   Here is how lexical binding works.  Each binding construct defines a
-@dfn{lexical environment}, specifying the symbols that are bound
+@dfn{lexical environment}, specifying the variables that are bound
 within the construct and their local values.  When the Lisp evaluator
 wants the current value of a variable, it looks first in the lexical
 environment; if the variable is not specified in there, it looks in
@@ -1032,11 +1032,13 @@ Lexical Binding
 time we evaluate the closure, it increments @code{x}, using the
 binding of @code{x} in that lexical environment.
 
-  Note that functions like @code{symbol-value}, @code{boundp}, and
-@code{set} only retrieve or modify a variable's dynamic binding
-(i.e., the contents of its symbol's value cell).  Also, the code in
-the body of a @code{defun} or @code{defmacro} cannot refer to
-surrounding lexical variables.
+  Note that unlike dynamic variables which are tied to the symbol
+object itself, the relationship between lexical variables and symbols
+is only present in the interpreter (or compiler).  Therefore,
+functions which take a symbol argument (like @code{symbol-value},
+@code{boundp}, and @code{set}) can only retrieve or modify a
+variable's dynamic binding (i.e., the contents of its symbol's value
+cell).
 
 @node Using Lexical Binding
 @subsection Using Lexical Binding
-- 
2.8.0


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

* bug#23781: 25.0.95; read-string with HIST lexically bound
  2016-06-27  0:55                       ` Noam Postavsky
@ 2016-07-01  4:07                         ` npostavs
  0 siblings, 0 replies; 18+ messages in thread
From: npostavs @ 2016-07-01  4:07 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: Tino Calancha, Stephen Berman, 23781

tags 23781 fixed
close 23781 25.1
quit

Noam Postavsky <npostavs@users.sourceforge.net> writes:

> On Sat, Jun 25, 2016 at 11:34 PM, Noam Postavsky
> <npostavs@users.sourceforge.net> wrote:
>> Updated patch to remove that sentence.
>
> I messed up the patch (the change got combined with unrelated commit).
> Here's a corrected one.

I've pushed as 850ba444





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

end of thread, other threads:[~2016-07-01  4:07 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-06-17  5:19 bug#23781: 25.0.95; read-string with HIST lexically bound Tino Calancha
2016-06-17 15:25 ` Michael Heerdegen
2016-06-23 23:01   ` Noam Postavsky
2016-06-23 23:18     ` Drew Adams
2016-06-25  0:26       ` Noam Postavsky
2016-06-25 10:12         ` Stephen Berman
2016-06-25 16:53           ` Noam Postavsky
2016-06-25 18:53             ` Stephen Berman
2016-06-25 19:46               ` Noam Postavsky
2016-06-25 22:07                 ` Stephen Berman
2016-06-25 23:42                   ` Michael Heerdegen
2016-06-26  3:34                     ` Noam Postavsky
2016-06-27  0:55                       ` Noam Postavsky
2016-07-01  4:07                         ` npostavs
2016-06-26  2:23                   ` Drew Adams
2016-06-25 21:00               ` Drew Adams
2016-06-25 20:42             ` Drew Adams
2016-06-24  2:24     ` Tino Calancha

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