[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: `let' vs `let*' (was: Re: How do I pass a variable defined in a wrap

From: Jean Louis
Subject: Re: `let' vs `let*' (was: Re: How do I pass a variable defined in a wrapping let, to a lambda?)
Date: Tue, 15 Mar 2022 10:36:57 +0300
User-agent: Mutt/2.2.0 (2022-02-12)

* Emanuel Berg via Users list for the GNU Emacs text editor 
<> [2022-03-15 06:16]:
> Jean Louis wrote:
> > 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).
> Okay, well, I'm not a `dlet' user myself since dynamic/special
> scope isn't in my programmer's DNA ...
> As for `let' vs `let*' in theory `let' is parallel and `let*'
> sequential but in practice `let*' allows references back to
> its own bindings, so it is recursive `let' if you will, and
> `let' isn't ...

In the `dlet' discussion, well... I see it so, dlet is creating
dynamically bound variables, and thus they should be available to all
variables inside of `dlet"

(dlet ((first-var 1)
       (second-var first-var))

second-var should be equal to first var, but developer Mattias
Engdegård, he changed it for the reason that dlet is not dlet* 

>   commit b72f88518b89560accf740a4548368863e6238e0
>   Author: Mattias Engdegård <>
>   Date:   Sun Aug 1 17:05:48 2021 +0200
> *     Make dlet work like let, not let*
> *     Change `dlet` so that it has binding semantics like `let` because that
> *     is what a user would expect and it allows a corresponding `dlet*` to
>       be added later should the need arise.  Fortunately the change has no
>       effect where it is currently used.

That is what user would expect. But that is not what I as user
expect. And nobody of other users complained on that, though the
definition of dlet is changed.

dlet is described with: Like ‘let’ but using dynamic scoping.

(dlet ((first-var 1) ;; if this is now in dynamic scoping, then:
       (second-var first-var)) ;; it should be visible 
                               ;; also in this second line
   second-var) ;; but it is not visible

Common Emacs Lisp users will get all variables from files. That is
what you do and majority of other people.

In my use case variables come from database. There are scripts in the
database that wish to access some information. 

For example there may be a template in the database asking for the
title of the page. In this below example it is `wrs::title'

<!DOCTYPE html>
<html lang="⟦ languages_extension ⟧">
    <title>⟦ (xml-escape wrs::title) ⟧</title>
    ⟦ pages_content ⟧
    ⟦ after_content ⟧
    ⟦ inquiry ⟧

Unless the variable wrs::title is dynamically bound it would not be
seen for further interpolation inside of the template. That is where
`dlet' becomes useful from within lexically scoped programs. Though I
use it with reverted modification as `rcd-dlet' so that all variables
defined within `rcd-dlet' become globally visible to other variables
in the same function.


Take action in Free Software Foundation campaigns:

In support of Richard M. Stallman

reply via email to

[Prev in Thread] Current Thread [Next in Thread]