* bug#66509: 29.1.50; let-alist should support numeric indexing
@ 2023-10-12 22:03 Spencer Baugh
2023-10-12 22:04 ` Spencer Baugh
0 siblings, 1 reply; 6+ messages in thread
From: Spencer Baugh @ 2023-10-12 22:03 UTC (permalink / raw)
To: 66509
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.
^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#66509: 29.1.50; let-alist should support numeric indexing
2023-10-12 22:03 bug#66509: 29.1.50; let-alist should support numeric indexing Spencer Baugh
@ 2023-10-12 22:04 ` Spencer Baugh
2024-09-10 23:22 ` Stefan Kangas
0 siblings, 1 reply; 6+ messages in thread
From: Spencer Baugh @ 2023-10-12 22:04 UTC (permalink / raw)
To: 66509
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: 0001-Support-numeric-indexing-in-let-alist.patch --]
[-- Type: text/x-patch, Size: 3579 bytes --]
From 28e52a343f72dddd991cafd23fea910cc5f64ac5 Mon Sep 17 00:00:00 2001
From: Spencer Baugh <sbaugh@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
^ permalink raw reply related [flat|nested] 6+ messages in thread
* bug#66509: 29.1.50; let-alist should support numeric indexing
2023-10-12 22:04 ` Spencer Baugh
@ 2024-09-10 23:22 ` Stefan Kangas
2024-09-17 2:07 ` Artur Malabarba
0 siblings, 1 reply; 6+ messages in thread
From: Stefan Kangas @ 2024-09-10 23:22 UTC (permalink / raw)
To: Spencer Baugh; +Cc: Artur Malabarba, 66509
Artur, do you have any thoughts on the below patch?
Spencer Baugh <sbaugh@janestreet.com> writes:
> From 28e52a343f72dddd991cafd23fea910cc5f64ac5 Mon Sep 17 00:00:00 2001
> From: Spencer Baugh <sbaugh@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))
^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#66509: 29.1.50; let-alist should support numeric indexing
2024-09-10 23:22 ` Stefan Kangas
@ 2024-09-17 2:07 ` Artur Malabarba
2024-09-19 1:56 ` Stefan Kangas
0 siblings, 1 reply; 6+ messages in thread
From: Artur Malabarba @ 2024-09-17 2:07 UTC (permalink / raw)
To: Stefan Kangas; +Cc: Spencer Baugh, 66509
[-- Attachment #1: Type: text/plain, Size: 4303 bytes --]
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@gmail.com> wrote:
> Artur, do you have any thoughts on the below patch?
>
> Spencer Baugh <sbaugh@janestreet.com> writes:
>
> > From 28e52a343f72dddd991cafd23fea910cc5f64ac5 Mon Sep 17 00:00:00 2001
> > From: Spencer Baugh <sbaugh@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))
>
[-- Attachment #2: Type: text/html, Size: 5891 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#66509: 29.1.50; let-alist should support numeric indexing
2024-09-17 2:07 ` Artur Malabarba
@ 2024-09-19 1:56 ` Stefan Kangas
2024-09-19 5:56 ` Eli Zaretskii
0 siblings, 1 reply; 6+ messages in thread
From: Stefan Kangas @ 2024-09-19 1:56 UTC (permalink / raw)
To: Artur Malabarba; +Cc: Spencer Baugh, 66509-done
Version: 31.1
Artur Malabarba <arturmalabarba@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.
^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#66509: 29.1.50; let-alist should support numeric indexing
2024-09-19 1:56 ` Stefan Kangas
@ 2024-09-19 5:56 ` Eli Zaretskii
0 siblings, 0 replies; 6+ messages in thread
From: Eli Zaretskii @ 2024-09-19 5:56 UTC (permalink / raw)
To: Stefan Kangas; +Cc: sbaugh, stefankangas, 66509
> Resent-To: bug-gnu-emacs@gnu.org
> Cc: Spencer Baugh <sbaugh@janestreet.com>, 66509-done@debbugs.gnu.org
> From: Stefan Kangas <stefankangas@gmail.com>
> Date: Wed, 18 Sep 2024 18:56:37 -0700
>
> Version: 31.1
>
> Artur Malabarba <arturmalabarba@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?
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-09-19 5:56 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-12 22:03 bug#66509: 29.1.50; let-alist should support numeric indexing Spencer Baugh
2023-10-12 22:04 ` Spencer Baugh
2024-09-10 23:22 ` Stefan Kangas
2024-09-17 2:07 ` Artur Malabarba
2024-09-19 1:56 ` Stefan Kangas
2024-09-19 5:56 ` Eli Zaretskii
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.