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

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

Re: [SOLVED with `eval']: Why I cannot use this variable in macro call f


From: Jean Louis
Subject: Re: [SOLVED with `eval']: Why I cannot use this variable in macro call from function?
Date: Wed, 9 Jun 2021 11:22:38 +0300
User-agent: Mutt/2.0.7+183 (3d24855) (2021-05-28)

* tomas@tuxteam.de <tomas@tuxteam.de> [2021-06-09 10:40]:
> You snipped the (for me) interesting part: did you notice how
> `eval' jumps over the local declaration?

Do you mean variables within `let'?

(defun rcd-db-completing-table-history (table)
  "Return symbol of history variable for TABLE.

If TABLE is \"businesses\" the symbol will become
`rcd-db-completing-table-history-businesses' and it will be used
for functions `completing-read' and `read-from-minibuffer'
history.

If a dynamically generated variable does not exist, it will be
generated on the fly."
  (let ((rcd-symbol (intern (concat "rcd-db-completing-table-history-" table)))
        (description (format "History for table `%s'" table)))
    (if (boundp rcd-symbol)
        rcd-symbol
      (eval (list 'defvar rcd-symbol nil description)))))

In the above function I want to get a symbol of a global history
variable.

read-from-minibuffer is a built-in function in ‘C source code’.

(read-from-minibuffer PROMPT &optional INITIAL-CONTENTS KEYMAP READ
HIST DEFAULT-VALUE INHERIT-INPUT-METHOD)

(completing-read PROMPT COLLECTION &optional PREDICATE REQUIRE-MATCH
INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)

History symbol HIST is used in the above functions. There are many
various columns and database tables and is for time being difficult to
find which one references to which one. New tables are created each in
a while, new variables would need to be created, that is not
handy. Users may create new variables too. It is easier to dynamically
(not related to dynamic bindings) assign global variables that keep
the history for `completing-read' and `read-from-minibuffer'. It is
useful not to mess with the global history.

> It doesn't even /see/ it, the defun whithin the eval munged with the
> outer scope (which might be buffer-local or just global).

There is `defvar' within the eval, it defines global variables. I
don't knof is such variable should be really buffer local, most
probably not as user may invoke functions from outside of the common
modes or buffers.

> If this is what you want, fine. If it's not, think again. I can't
> even venture a guess towards what you have in mind, I'm that bad
> at interpreting what you write.

Maybe you should start using history variables in
`read-from-minibuffer' or `completing-read' and you will understand
that one has to give some symbol. In the context of editing column
values in multiple database tables the difficulty is that one would
need to assign a history variable to each such column names. Columns
are also changeable, they could be even changed by user on the fly. If
I hard code the history variable then user would need to modify the
source. This way history variables are dynamically created without
modification of the source.

I have explained what I want:

- to dynamically (not related to global bindings) request for a symbol
  representing a global variable;

- function or macro should either create the new global variable and
  return the symbol or return the existing symbol if variable exists
  already;

The bottom line is, what is the solution?

The only solution that works is in the above function, maybe something
else would work but I would not know how to implement it.

> And then there is the issue of how readable your code becomes,
> which will be important or not, depending on whether you want
> others to read it or not.

Readability can be improved, but if there is no functionality why
focus on readability?

You imply you know how to make it, so let me know how to make it
better.

-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



reply via email to

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