From: Jean Louis <bugs@gnu.support>
To: help-gnu-emacs@gnu.org
Subject: Re: How do I pass a variable defined in a wrapping let, to a lambda?
Date: Sat, 12 Mar 2022 09:40:22 +0300 [thread overview]
Message-ID: <YixAVr0oz2PxXCr6@protected.localdomain> (raw)
In-Reply-To: <87r177rjzn.fsf@zoho.eu>
* Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> [2022-03-12 05:41]:
> Michael Heerdegen wrote:
>
> > you may want to find out what evaluating lexical-binding in
> > the buffer with lexical-binding -> nil gives you.
> >
> > Second: (AFAIK...) be sure to reeval `steinars-test' with
> > lexical-binding -> nil. `steinars-test' defined using the
> > lexical binding dialect will return a closure even when
> > called in the dynamcially binding dialect.
>
> This is an example of why I think there should be three `let':
>
> * "let" that is static/lexical except for already-defined
> dynamic/special variables (i.e., what `let' is already under
> static/lexical scope, so won't break any code to change.
> well, there wouldn't be any change except static/lexical
> would be default everywhere)
>
> * "dlet" that is always dynamic/special
New `dlet' is this and it broke my programs because somebody removed
`let*' inside. I don't think that person who changed it every used
`dlet' in their own programs. Reason is semantics, "dlet" uses "let*"
so they changed it, but did not provide "dlet*" (though is easy to
adapt it).
new `dlet':
(defmacro dlet (binders &rest body)
"Like `let' but using dynamic scoping."
(declare (indent 1) (debug let))
;; (defvar FOO) only affects the current scope, but in order for
;; this not to affect code after the main `let' we need to create a new scope,
;; which is what the surrounding `let' is for.
;; FIXME: (let () ...) currently doesn't actually create a new scope,
;; which is why we use (let (_) ...).
`(let (_)
,@(mapcar (lambda (binder)
`(defvar ,(if (consp binder) (car binder) binder)))
binders)
(let ,binders ,@body)))
so I have just changed it back to what it was and use it with my own
prefix as `rcd-dlet' -- that way there is no need for quarrel.
(defmacro rcd-dlet (binders &rest body)
"Like `let*' but using dynamic scoping."
(declare (indent 1) (debug let))
;; (defvar FOO) only affects the current scope, but in order for
;; this not to affect code after the main `let' we need to create a new scope,
;; which is what the surrounding `let' is for.
;; FIXME: (let () ...) currently doesn't actually create a new scope,
;; which is why we use (let (_) ...).
`(let (_)
,@(mapcar (lambda (binder)
`(defvar ,(if (consp binder) (car binder) binder)))
binders)
(let* ,binders ,@body)))
I find `dlet', rather `rcd-dlet' very useful in interpolation of
variables and templates that come from third sources, thus not coming
from the Emacs Lisp file itself.
Some insights:
(rcd-dlet ((wrs::template (gethash "templates_content" wrs::template))
;; now wrs::template is visible inside of
;; wrs::template, sounds funny
(open-graph-type "Article")
;; now "open-graph-type" variable is accessible
;; for use or interpolation within wrs::template scripts
(wrs::html (rcd-template-eval wrs::template '("⟦" "⟧") wrs::variables))
;; now wrs::template is interpolating various
;; wrs::variables, expanding them inside of the
;; template as otherwise they would not be visible
;; rcd-dlet as only rcd-dlet breaks out of lexical binding
(wrs::local-file (wrs-page-url page-id t))
(wrs::local-dir (file-name-directory wrs::local-file)))
(make-directory wrs::local-dir t)
(string-to-file-force wrs::html wrs::local-file)))))
--
Jean
Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns
In support of Richard M. Stallman
https://stallmansupport.org/
next prev parent reply other threads:[~2022-03-12 6:40 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-11 22:44 How do I pass a variable defined in a wrapping let, to a lambda? Steinar Bang
2022-03-11 23:04 ` Eric Abrahamsen
2022-03-12 4:52 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-03-12 6:08 ` Eduardo Ochs
2022-03-12 13:33 ` Stefan Monnier
2022-03-12 18:56 ` Eduardo Ochs
2022-03-12 19:12 ` Stefan Monnier
2022-03-12 20:17 ` Eduardo Ochs
2022-03-12 20:31 ` [External] : " Drew Adams
2022-03-12 22:33 ` Eduardo Ochs
2022-03-12 23:14 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-03-13 12:19 ` Eduardo Ochs
2022-03-13 23:46 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-03-13 0:20 ` Michael Heerdegen
2022-03-12 20:34 ` tomas
2022-03-12 8:53 ` Steinar Bang
2022-03-12 14:47 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-03-12 16:59 ` Steinar Bang
2022-03-12 17:15 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-13 18:11 ` Steinar Bang
2022-03-12 19:09 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-03-12 20:57 ` Steinar Bang
2022-03-12 8:51 ` Steinar Bang
2022-03-12 9:34 ` Steinar Bang
2022-03-12 19:13 ` Steinar Bang
2022-03-12 14:03 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-13 16:06 ` Eric Abrahamsen
2022-03-13 18:20 ` Steinar Bang
2022-03-11 23:48 ` Eric Abrahamsen
2022-03-12 0:43 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-12 0:52 ` Eric Abrahamsen
2022-03-12 1:00 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-12 0:58 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-12 1:37 ` Michael Heerdegen
2022-03-12 2:18 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-12 6:40 ` Jean Louis [this message]
2022-03-14 13:57 ` `let' vs `let*' (was: Re: How do I pass a variable defined in a wrapping let, to a lambda?) Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-15 7:36 ` Jean Louis
2022-03-15 8:30 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-15 15:26 ` [External] : " Drew Adams
2022-03-15 15:41 ` tomas
2022-03-15 22:40 ` [External] : `let' vs `let*' Stefan Monnier via Users list for the GNU Emacs text editor
2022-03-16 0:25 ` [External] : `let' vs `let*' (was: Re: How do I pass a variable defined in a wrapping let, to a lambda?) Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-15 17:16 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-14 14:51 ` How do I pass a variable defined in a wrapping let, to a lambda? Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-12 2:19 ` Eric Abrahamsen
2022-03-11 23:58 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-03-12 0:47 ` Emanuel Berg via Users list for the GNU Emacs text editor
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YixAVr0oz2PxXCr6@protected.localdomain \
--to=bugs@gnu.support \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.