[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: result of completing-read contradicting require-match
From: |
Jean Louis |
Subject: |
Re: result of completing-read contradicting require-match |
Date: |
Sat, 9 Jul 2022 16:17:57 +0300 |
User-agent: |
Mutt/+ () (2022-06-11) |
* Yuri Khan <yuri.v.khan@gmail.com> [2022-07-02 22:56]:
> On Sun, 3 Jul 2022 at 02:29, Jean Louis <bugs@gnu.support> wrote:
>
> > REQUIRE-MATCH can take the following values:
> > - a function, which will be called with the input as the parameter.
> > If it returns a non-nil value, the minibuffer is exited with that value.
>
> > other way to persist asking until you get the true result is here:
> >
> > (defun rcd-repeat-until-not-empty-string (function &rest args)
> > "Repeat FUNCTION with optional ARGS until result is not empty string."
> > (let ((result))
> > (while (string-empty-p (setq result (apply function args))))
> > result))
>
> Based on the quoted part of the docstring, you could probably pass a
> function that returns t for an allowed value, and nil for disallowed
> values, including an empty string or nil.
I would like to do that Yuri. I was thinking about it, and it bothers
me. I would like to merge these two functions and use each of them
sometimes singly. The third merged one would check for both values.
(defun rcd-repeat-until-not-nil (function &rest args)
"Repeat FUNCTION with optional ARGS until result is not nil."
(let ((result))
(while (not (setq result (apply function args))))
result))
(defun rcd-repeat-until-not-empty-string (function &rest args)
"Repeat FUNCTION with optional ARGS until result is not empty string."
(let ((result))
(while (string-empty-p (setq result (apply function args))))
result))
You say to pass the function to check for allowed values. Do you mean
then to have something like
(defun rcd-repeat- (function check-function &args) ?
Example usage would be like:
(rdc-repeat-until-something 'read-from-minibuffer)
but also
(rdc-repeat-until-something 'read-number)
and here is what I come up with,
(defun rcd-is-something-p (thing)
"Return TRUE if THING is something."
(cond ((and (stringp thing) (seq-empty-p thing)) nil)
((and (numberp thing) (not thing)) nil)
(t t)))
(defun rcd-repeat-until-something (function &rest args)
"Repeat FUNCTION with optional ARGS until result is something.
Result shall be non empty string or number."
(let ((result))
(while (rcd-is-nothing-p (setq result (apply function args))))
result))
Then I can tell for example:
rcd-repeat-until-something 'read-from-minibuffer "Say: ") ⇒ "Something"
without being allowed to exit the loop until the result is there.
But then I am also checking for number to be non-nil as well.
--
Jean
Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns
In support of Richard M. Stallman
https://stallmansupport.org/
Re: result of completing-read contradicting require-match, carlmarcos, 2022/07/02