help-gnu-emacs
[Top][All Lists]
Advanced

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

Re: Understanding the "let" construct and the setting of variables


From: steve-humphreys
Subject: Re: Understanding the "let" construct and the setting of variables
Date: Thu, 17 Dec 2020 06:12:00 +0100

> How I understand it is that `setq' I can freely use on variables
> already defined with and within my `let' as then the variable
> will not become global.
> 
> (defun my-fun ()
>   (let ((my-var nil))
>     (setq my-var 2)))
> 
> (my-fun)
> 
> my-var is not defined
Here the variable remains local.  my-var does not become a global
variable because it is defined within the let.  So one can use "set"
with variables defined in a "let" construct.  I thought you could not
do that - call "setq" on a local variable defined in a "let" expression.


 
> (defun my-fun ()
>   (let ((my-var nil)))
>   (setq my-var 2))
> 
> (my-fun)
> 
> my-var is here defined as 2 and became global variable.
> 
> And each time that variable is already defined with `defvar' one
> can then change it with setq.
And here "my-var" becames a global variable because my-var is
set using "setq" outside the "let" expression.

Thanks.  Was not too difficult as I thought.  



> Sent: Thursday, December 17, 2020 at 5:34 AM
> From: "Jean Louis" <bugs@gnu.support>
> To: steve-humphreys@gmx.com
> Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> Subject: Re: Understanding the "let" construct and the setting of variables
>
> > -*- lexical-binding: t; -*-
> * steve-humphreys@gmx.com <steve-humphreys@gmx.com> [2020-12-17 03:26]:
> > Let's introspect two questions.
> > 
> > 1. In what simple circumstances would one use a "setq" in the body
> > of a let?
> 
> Whenever I find myself in linear programming within a function and
> need to change variable I will use setq. Some global variables are
> rather set with setq:
> 
>     (set-buffer buffer)
>     (setq header-line-format (concat buffer " ➜ Finish with `q' or `h'"))
>     (cf-org-view-mode)
>     (insert blob)
>     (setq org-hierarchical-todo-statistics nil)
>     (org-update-parent-todo-statistics)
>     (goto-char 1)
> 
> But I will often use it in construction of lists:
> 
> (defun rcd-cgi-parse-query-string (query-string)
>   "Parse QUERY-STRING that normally comes from the environment
> variable `QUERY_STRING'. Return PLIST."
>   (let* ((query-string (url-unhex-string query-string))
>        (parts (split-string query-string "&"))
>        (length (length parts))
>        (plist '()))
>     (dolist (part parts plist)
>       (let* ((data (split-string part "="))
>            (prop (car data))
>            (val (cadr data)))
>       (setq plist (plist-put plist (intern prop) val))))))
> 
> 
> (defun iota (count &optional start step)
>   "Return a list containing COUNT numbers, starting from START
> and adding STEP each time.  The default START is 0, the default
> STEP is 1"
>   (let* ((start (if start start 0))
>        (step (if step step 1))
>        (last (+ start count))
>        (counter 0)
>        (list '())
>        (elt start))
>     (while (< counter count)
>       (push elt list)
>       (setq elt (+ elt step))
>       (setq counter (1+ counter)))
>     (reverse list)))
> 
> How I understand it is that `setq' I can freely use on variables
> already defined with and within my `let' as then the variable
> will not become global.
> 
> (defun my-fun ()
>   (let ((my-var nil))
>     (setq my-var 2)))
> 
> (my-fun)
> 
> my-var is not defined
> 
> (defun my-fun ()
>   (let ((my-var nil)))
>   (setq my-var 2))
> 
> (my-fun)
> 
> my-var is here defined as 2 and became global variable.
> 
> And each time that variable is already defined with `defvar' one
> can then change it with setq.
> 
> Jean
>



reply via email to

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