Re: global vars and #:declarative? (was [critical bug] The set! doesn't work in indirect reference)

Taylan Kammer <[email protected]>
Newsgroups gmane.lisp.guile.user
Message-ID <[email protected]>
On 19.09.2024 14:30, Nala Ginrut wrote:
> Although I mostly put global var like global parameters in such a module, I
> think there's always something that needs a globally setter.
> The parameter works when you could get the state first in the runtime,
> then you can bind it with pameterize. But for the case that you have to
> call another function first, then check the state change or not, the easier
> way is to take advantage of side-effects.

Parameter objects can also be set permanently by calling them on a value:

scheme@(guile-user)> (define x (make-parameter 1))
scheme@(guile-user)> (x 2)
$1 = 1
scheme@(guile-user)> (x)
$2 = 2

(Note that, when calling it to change the value, it returns the previous value.)

I'm not sure if there's ever a really good reason to use mutable global variables instead of parameters.

Perhaps reading a variable is more efficient than reading a parameter's value. Usually, that's going to be an unnecessary micro-optimization. But even if such an optimization were needed, one could just bind the value of a parameter to a local variable where needed:

(let ((value (my-parameter)))
  (loop-a-million-times
    (lambda () (do-something-with value))))

If I'm not mistaken: Using a local variable is often more efficient than using a global variable, so if you needed to micro-optimize code for maximum efficiency, you would want to do this anyway.

There's one potential issue with using parameters like this: Their value is thread-local. If you change a parameter's value from one thread, with the setting syntax above (calling it on a value), it will never become visible to other threads that are currently executing. However, setting it before spawning a new thread will ensure that the new thread sees the new value:

scheme@(guile-user)> (x 3)
$5 = 2
scheme@(guile-user)> (join-thread (begin-thread (x)))
$6 = 3
scheme@(guile-user)> (join-thread (begin-thread (x 4) (x)))
$7 = 4
scheme@(guile-user)> (x)
$8 = 3

Hope that helps!

- Taylan
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.