GNU bug report logs -
#66509
29.1.50; let-alist should support numeric indexing
Previous Next
To reply to this bug, email your comments to 66509 AT debbugs.gnu.org.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#66509
; Package
emacs
.
(Thu, 12 Oct 2023 22:04:02 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
Spencer Baugh <sbaugh <at> janestreet.com>
:
New bug report received and forwarded. Copy sent to
bug-gnu-emacs <at> gnu.org
.
(Thu, 12 Oct 2023 22:04:02 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
It would be nice if let-alist supported indexing. So if my alist
contained lists in some places, instead of writing:
(let-alist alist
(let-alist (nth 0 .a)
(let-alist (nth 3 .b)
.c)))
I could instead write:
(let-alist alist
.a.0.b.3.c)
A patch which does this to follow.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#66509
; Package
emacs
.
(Thu, 12 Oct 2023 22:05:02 GMT)
Full text and
rfc822 format available.
Message #8 received at 66509 <at> debbugs.gnu.org (full text, mbox):
[0001-Support-numeric-indexing-in-let-alist.patch (text/x-patch, inline)]
From 28e52a343f72dddd991cafd23fea910cc5f64ac5 Mon Sep 17 00:00:00 2001
From: Spencer Baugh <sbaugh <at> janestreet.com>
Date: Thu, 12 Oct 2023 18:01:46 -0400
Subject: [PATCH] Support numeric indexing in let-alist
let-alist is very useful. But sometimes an alist contains a list in
the middle, which contains yet more alists. Previously, this was
somewhat painful to deal with, and required something like:
(let-alist alist
(let-alist (nth 0 .a)
(let-alist (nth 3 .b)
.c)))
Now, the following works:
(let-alist alist
.a.0.b.3.c)
* lisp/emacs-lisp/let-alist.el (let-alist--access-sexp): Properly
parse numbers.
(let-alist--list-to-sexp): Use nth to handle numbers.
(let-alist): Update docs.
---
lisp/emacs-lisp/let-alist.el | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/lisp/emacs-lisp/let-alist.el b/lisp/emacs-lisp/let-alist.el
index d9ad46b2af7..de7c087bf2a 100644
--- a/lisp/emacs-lisp/let-alist.el
+++ b/lisp/emacs-lisp/let-alist.el
@@ -36,22 +36,23 @@
;; symbol inside body is let-bound to their cdrs in the alist. Dotted
;; symbol is any symbol starting with a `.'. Only those present in
;; the body are let-bound and this search is done at compile time.
+;; A number will result in a list index.
;;
;; For instance, the following code
;;
;; (let-alist alist
-;; (if (and .title .body)
+;; (if (and .title.0 .body)
;; .body
;; .site
;; .site.contents))
;;
;; essentially expands to
;;
-;; (let ((.title (cdr (assq 'title alist)))
+;; (let ((.title.0 (nth 0 (cdr (assq 'title alist))))
;; (.body (cdr (assq 'body alist)))
;; (.site (cdr (assq 'site alist)))
;; (.site.contents (cdr (assq 'contents (cdr (assq 'site alist))))))
-;; (if (and .title .body)
+;; (if (and .title.0 .body)
;; .body
;; .site
;; .site.contents))
@@ -93,14 +94,17 @@ let-alist--access-sexp
(if (string-match "\\`\\." name)
clean
(let-alist--list-to-sexp
- (mapcar #'intern (nreverse (split-string name "\\.")))
+ (mapcar #'read (nreverse (split-string name "\\.")))
variable))))
(defun let-alist--list-to-sexp (list var)
"Turn symbols LIST into recursive calls to `cdr' `assq' on VAR."
- `(cdr (assq ',(car list)
- ,(if (cdr list) (let-alist--list-to-sexp (cdr list) var)
- var))))
+ (let ((sym (car list))
+ (rest (if (cdr list) (let-alist--list-to-sexp (cdr list) var)
+ var)))
+ (cond
+ ((numberp sym) `(nth ,sym ,rest))
+ (t `(cdr (assq ',sym ,rest))))))
(defun let-alist--remove-dot (symbol)
"Return SYMBOL, sans an initial dot."
@@ -116,22 +120,23 @@ let-alist
"Let-bind dotted symbols to their cdrs in ALIST and execute BODY.
Dotted symbol is any symbol starting with a `.'. Only those present
in BODY are let-bound and this search is done at compile time.
+A number will result in a list index.
For instance, the following code
(let-alist alist
- (if (and .title .body)
+ (if (and .title.0 .body)
.body
.site
.site.contents))
essentially expands to
- (let ((.title (cdr (assq \\='title alist)))
+ (let ((.title (nth 0 (cdr (assq \\='title alist))))
(.body (cdr (assq \\='body alist)))
(.site (cdr (assq \\='site alist)))
(.site.contents (cdr (assq \\='contents (cdr (assq \\='site alist))))))
- (if (and .title .body)
+ (if (and .title.0 .body)
.body
.site
.site.contents))
--
2.39.3
Severity set to 'wishlist' from 'normal'
Request was from
Stefan Kangas <stefankangas <at> gmail.com>
to
control <at> debbugs.gnu.org
.
(Sun, 22 Oct 2023 19:49:04 GMT)
Full text and
rfc822 format available.
Added tag(s) patch.
Request was from
Spencer Baugh <sbaugh <at> janestreet.com>
to
control <at> debbugs.gnu.org
.
(Fri, 16 Feb 2024 22:42:01 GMT)
Full text and
rfc822 format available.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#66509
; Package
emacs
.
(Tue, 10 Sep 2024 23:24:02 GMT)
Full text and
rfc822 format available.
Message #15 received at 66509 <at> debbugs.gnu.org (full text, mbox):
Artur, do you have any thoughts on the below patch?
Spencer Baugh <sbaugh <at> janestreet.com> writes:
> From 28e52a343f72dddd991cafd23fea910cc5f64ac5 Mon Sep 17 00:00:00 2001
> From: Spencer Baugh <sbaugh <at> janestreet.com>
> Date: Thu, 12 Oct 2023 18:01:46 -0400
> Subject: [PATCH] Support numeric indexing in let-alist
>
> let-alist is very useful. But sometimes an alist contains a list in
> the middle, which contains yet more alists. Previously, this was
> somewhat painful to deal with, and required something like:
>
> (let-alist alist
> (let-alist (nth 0 .a)
> (let-alist (nth 3 .b)
> .c)))
>
> Now, the following works:
>
> (let-alist alist
> .a.0.b.3.c)
>
> * lisp/emacs-lisp/let-alist.el (let-alist--access-sexp): Properly
> parse numbers.
> (let-alist--list-to-sexp): Use nth to handle numbers.
> (let-alist): Update docs.
> ---
> lisp/emacs-lisp/let-alist.el | 25 +++++++++++++++----------
> 1 file changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/lisp/emacs-lisp/let-alist.el b/lisp/emacs-lisp/let-alist.el
> index d9ad46b2af7..de7c087bf2a 100644
> --- a/lisp/emacs-lisp/let-alist.el
> +++ b/lisp/emacs-lisp/let-alist.el
> @@ -36,22 +36,23 @@
> ;; symbol inside body is let-bound to their cdrs in the alist. Dotted
> ;; symbol is any symbol starting with a `.'. Only those present in
> ;; the body are let-bound and this search is done at compile time.
> +;; A number will result in a list index.
> ;;
> ;; For instance, the following code
> ;;
> ;; (let-alist alist
> -;; (if (and .title .body)
> +;; (if (and .title.0 .body)
> ;; .body
> ;; .site
> ;; .site.contents))
> ;;
> ;; essentially expands to
> ;;
> -;; (let ((.title (cdr (assq 'title alist)))
> +;; (let ((.title.0 (nth 0 (cdr (assq 'title alist))))
> ;; (.body (cdr (assq 'body alist)))
> ;; (.site (cdr (assq 'site alist)))
> ;; (.site.contents (cdr (assq 'contents (cdr (assq 'site alist))))))
> -;; (if (and .title .body)
> +;; (if (and .title.0 .body)
> ;; .body
> ;; .site
> ;; .site.contents))
> @@ -93,14 +94,17 @@ let-alist--access-sexp
> (if (string-match "\\`\\." name)
> clean
> (let-alist--list-to-sexp
> - (mapcar #'intern (nreverse (split-string name "\\.")))
> + (mapcar #'read (nreverse (split-string name "\\.")))
> variable))))
>
> (defun let-alist--list-to-sexp (list var)
> "Turn symbols LIST into recursive calls to `cdr' `assq' on VAR."
> - `(cdr (assq ',(car list)
> - ,(if (cdr list) (let-alist--list-to-sexp (cdr list) var)
> - var))))
> + (let ((sym (car list))
> + (rest (if (cdr list) (let-alist--list-to-sexp (cdr list) var)
> + var)))
> + (cond
> + ((numberp sym) `(nth ,sym ,rest))
> + (t `(cdr (assq ',sym ,rest))))))
>
> (defun let-alist--remove-dot (symbol)
> "Return SYMBOL, sans an initial dot."
> @@ -116,22 +120,23 @@ let-alist
> "Let-bind dotted symbols to their cdrs in ALIST and execute BODY.
> Dotted symbol is any symbol starting with a `.'. Only those present
> in BODY are let-bound and this search is done at compile time.
> +A number will result in a list index.
>
> For instance, the following code
>
> (let-alist alist
> - (if (and .title .body)
> + (if (and .title.0 .body)
> .body
> .site
> .site.contents))
>
> essentially expands to
>
> - (let ((.title (cdr (assq \\='title alist)))
> + (let ((.title (nth 0 (cdr (assq \\='title alist))))
> (.body (cdr (assq \\='body alist)))
> (.site (cdr (assq \\='site alist)))
> (.site.contents (cdr (assq \\='contents (cdr (assq \\='site alist))))))
> - (if (and .title .body)
> + (if (and .title.0 .body)
> .body
> .site
> .site.contents))
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#66509
; Package
emacs
.
(Tue, 17 Sep 2024 02:10:01 GMT)
Full text and
rfc822 format available.
Message #18 received at 66509 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
Hi all,
The patch looks good.
Stefan, would you mind applying it? (It'll take a while for me to get
everything configured.)
best,
Artur
On Tue, 10 Sept 2024 at 20:22, Stefan Kangas <stefankangas <at> gmail.com> wrote:
> Artur, do you have any thoughts on the below patch?
>
> Spencer Baugh <sbaugh <at> janestreet.com> writes:
>
> > From 28e52a343f72dddd991cafd23fea910cc5f64ac5 Mon Sep 17 00:00:00 2001
> > From: Spencer Baugh <sbaugh <at> janestreet.com>
> > Date: Thu, 12 Oct 2023 18:01:46 -0400
> > Subject: [PATCH] Support numeric indexing in let-alist
> >
> > let-alist is very useful. But sometimes an alist contains a list in
> > the middle, which contains yet more alists. Previously, this was
> > somewhat painful to deal with, and required something like:
> >
> > (let-alist alist
> > (let-alist (nth 0 .a)
> > (let-alist (nth 3 .b)
> > .c)))
> >
> > Now, the following works:
> >
> > (let-alist alist
> > .a.0.b.3.c)
> >
> > * lisp/emacs-lisp/let-alist.el (let-alist--access-sexp): Properly
> > parse numbers.
> > (let-alist--list-to-sexp): Use nth to handle numbers.
> > (let-alist): Update docs.
> > ---
> > lisp/emacs-lisp/let-alist.el | 25 +++++++++++++++----------
> > 1 file changed, 15 insertions(+), 10 deletions(-)
> >
> > diff --git a/lisp/emacs-lisp/let-alist.el b/lisp/emacs-lisp/let-alist.el
> > index d9ad46b2af7..de7c087bf2a 100644
> > --- a/lisp/emacs-lisp/let-alist.el
> > +++ b/lisp/emacs-lisp/let-alist.el
> > @@ -36,22 +36,23 @@
> > ;; symbol inside body is let-bound to their cdrs in the alist. Dotted
> > ;; symbol is any symbol starting with a `.'. Only those present in
> > ;; the body are let-bound and this search is done at compile time.
> > +;; A number will result in a list index.
> > ;;
> > ;; For instance, the following code
> > ;;
> > ;; (let-alist alist
> > -;; (if (and .title .body)
> > +;; (if (and .title.0 .body)
> > ;; .body
> > ;; .site
> > ;; .site.contents))
> > ;;
> > ;; essentially expands to
> > ;;
> > -;; (let ((.title (cdr (assq 'title alist)))
> > +;; (let ((.title.0 (nth 0 (cdr (assq 'title alist))))
> > ;; (.body (cdr (assq 'body alist)))
> > ;; (.site (cdr (assq 'site alist)))
> > ;; (.site.contents (cdr (assq 'contents (cdr (assq 'site
> alist))))))
> > -;; (if (and .title .body)
> > +;; (if (and .title.0 .body)
> > ;; .body
> > ;; .site
> > ;; .site.contents))
> > @@ -93,14 +94,17 @@ let-alist--access-sexp
> > (if (string-match "\\`\\." name)
> > clean
> > (let-alist--list-to-sexp
> > - (mapcar #'intern (nreverse (split-string name "\\.")))
> > + (mapcar #'read (nreverse (split-string name "\\.")))
> > variable))))
> >
> > (defun let-alist--list-to-sexp (list var)
> > "Turn symbols LIST into recursive calls to `cdr' `assq' on VAR."
> > - `(cdr (assq ',(car list)
> > - ,(if (cdr list) (let-alist--list-to-sexp (cdr list) var)
> > - var))))
> > + (let ((sym (car list))
> > + (rest (if (cdr list) (let-alist--list-to-sexp (cdr list) var)
> > + var)))
> > + (cond
> > + ((numberp sym) `(nth ,sym ,rest))
> > + (t `(cdr (assq ',sym ,rest))))))
> >
> > (defun let-alist--remove-dot (symbol)
> > "Return SYMBOL, sans an initial dot."
> > @@ -116,22 +120,23 @@ let-alist
> > "Let-bind dotted symbols to their cdrs in ALIST and execute BODY.
> > Dotted symbol is any symbol starting with a `.'. Only those present
> > in BODY are let-bound and this search is done at compile time.
> > +A number will result in a list index.
> >
> > For instance, the following code
> >
> > (let-alist alist
> > - (if (and .title .body)
> > + (if (and .title.0 .body)
> > .body
> > .site
> > .site.contents))
> >
> > essentially expands to
> >
> > - (let ((.title (cdr (assq \\='title alist)))
> > + (let ((.title (nth 0 (cdr (assq \\='title alist))))
> > (.body (cdr (assq \\='body alist)))
> > (.site (cdr (assq \\='site alist)))
> > (.site.contents (cdr (assq \\='contents (cdr (assq \\='site
> alist))))))
> > - (if (and .title .body)
> > + (if (and .title.0 .body)
> > .body
> > .site
> > .site.contents))
>
[Message part 2 (text/html, inline)]
Reply sent
to
Stefan Kangas <stefankangas <at> gmail.com>
:
You have taken responsibility.
(Thu, 19 Sep 2024 01:59:02 GMT)
Full text and
rfc822 format available.
Notification sent
to
Spencer Baugh <sbaugh <at> janestreet.com>
:
bug acknowledged by developer.
(Thu, 19 Sep 2024 01:59:02 GMT)
Full text and
rfc822 format available.
Message #23 received at 66509-done <at> debbugs.gnu.org (full text, mbox):
Version: 31.1
Artur Malabarba <arturmalabarba <at> gmail.com> writes:
> Hi all,
>
> The patch looks good.
Thanks.
> Stefan, would you mind applying it? (It'll take a while for me to get
> everything configured.)
Pushed to master (commit ae4171efdc6).
I'm therefore closing this bug report.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#66509
; Package
emacs
.
(Thu, 19 Sep 2024 05:58:02 GMT)
Full text and
rfc822 format available.
Message #26 received at 66509 <at> debbugs.gnu.org (full text, mbox):
> Resent-To: bug-gnu-emacs <at> gnu.org
> Cc: Spencer Baugh <sbaugh <at> janestreet.com>, 66509-done <at> debbugs.gnu.org
> From: Stefan Kangas <stefankangas <at> gmail.com>
> Date: Wed, 18 Sep 2024 18:56:37 -0700
>
> Version: 31.1
>
> Artur Malabarba <arturmalabarba <at> gmail.com> writes:
>
> > Hi all,
> >
> > The patch looks good.
>
> Thanks.
>
> > Stefan, would you mind applying it? (It'll take a while for me to get
> > everything configured.)
>
> Pushed to master (commit ae4171efdc6).
>
> I'm therefore closing this bug report.
Thanks, but could we perhaps have tests for this new functionality?
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#66509
; Package
emacs
.
(Fri, 27 Sep 2024 07:18:01 GMT)
Full text and
rfc822 format available.
Message #29 received at 66509 <at> debbugs.gnu.org (full text, mbox):
reopen 66509
thanks
>> Pushed to master (commit ae4171efdc6).
>>
>> I'm therefore closing this bug report.
I'm reopening this bug report, based on this request from Robert Pluim:
> Would it be possible to update the elisp manual as well (and maybe add
> an entry to NEWS)?
I think that should be done also, so I'm reopening the bug to track that
work. Spencer, do you think you could you please address it?
Bonus points for adding tests, as requested by Eli.
Thanks in advance.
bug No longer marked as fixed in versions 31.1 and reopened.
Request was from
Debbugs Internal Request <help-debbugs <at> gnu.org>
to
internal_control <at> debbugs.gnu.org
.
(Fri, 27 Sep 2024 07:18:02 GMT)
Full text and
rfc822 format available.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#66509
; Package
emacs
.
(Wed, 12 Feb 2025 04:16:02 GMT)
Full text and
rfc822 format available.
Message #34 received at 66509 <at> debbugs.gnu.org (full text, mbox):
Stefan Kangas <stefankangas <at> gmail.com> writes:
> reopen 66509
> thanks
>
>>> Pushed to master (commit ae4171efdc6).
>>>
>>> I'm therefore closing this bug report.
>
> I'm reopening this bug report, based on this request from Robert Pluim:
>
>> Would it be possible to update the elisp manual as well (and maybe add
>> an entry to NEWS)?
>
> I think that should be done also, so I'm reopening the bug to track that
> work. Spencer, do you think you could you please address it?
>
> Bonus points for adding tests, as requested by Eli.
Ping!
This bug report was last modified 123 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.