unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Passing a list to an interactive function
@ 2020-12-18 11:05 pietru
  2020-12-18 11:30 ` Jean Louis
  0 siblings, 1 reply; 15+ messages in thread
From: pietru @ 2020-12-18 11:05 UTC (permalink / raw)
  To: Help Gnu Emacs

I would like to pass a list to an interactive function.  How can I do that?

Sincerely
Pietro





^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-18 11:05 Passing a list to an interactive function pietru
@ 2020-12-18 11:30 ` Jean Louis
  2020-12-18 11:38   ` pietru
  0 siblings, 1 reply; 15+ messages in thread
From: Jean Louis @ 2020-12-18 11:30 UTC (permalink / raw)
  To: pietru; +Cc: Help Gnu Emacs

* pietru@caramail.com <pietru@caramail.com> [2020-12-18 14:19]:
> I would like to pass a list to an interactive function.  How can I do that?

(funcall-interactively #'YOUR-FUNCTION '("List" 2))




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-18 11:30 ` Jean Louis
@ 2020-12-18 11:38   ` pietru
  2020-12-18 11:49     ` Joost Kremers
                       ` (3 more replies)
  0 siblings, 4 replies; 15+ messages in thread
From: pietru @ 2020-12-18 11:38 UTC (permalink / raw)
  To: Jean Louis; +Cc: Help Gnu Emacs



> Sent: Friday, December 18, 2020 at 12:30 PM
> From: "Jean Louis" <bugs@gnu.support>
> To: pietru@caramail.com
> Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> Subject: Re: Passing a list to an interactive function
>
> * pietru@caramail.com <pietru@caramail.com> [2020-12-18 14:19]:
> > I would like to pass a list to an interactive function.  How can I do that?
>
> (funcall-interactively #'YOUR-FUNCTION '("List" 2))

I mean, how do I define an interactive function that takes a list as argument?




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-18 11:38   ` pietru
@ 2020-12-18 11:49     ` Joost Kremers
  2020-12-18 11:50     ` tomas
                       ` (2 subsequent siblings)
  3 siblings, 0 replies; 15+ messages in thread
From: Joost Kremers @ 2020-12-18 11:49 UTC (permalink / raw)
  To: help-gnu-emacs


On Fri, Dec 18 2020, pietru@caramail.com wrote:
> I mean, how do I define an interactive function that takes a list as argument?

Check out the interactive codes in the Elisp manual, if you haven't found those already:

(info "(elisp) Interactive Codes")

The only codes that would allow you to do what you want are "x" and "X", which
both read a Lisp object, the difference being that "X" also evaluates it.

-- 
Joost Kremers
Life has its moments



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-18 11:38   ` pietru
  2020-12-18 11:49     ` Joost Kremers
@ 2020-12-18 11:50     ` tomas
  2020-12-18 11:56     ` Jean Louis
  2020-12-19  2:05     ` pietru
  3 siblings, 0 replies; 15+ messages in thread
From: tomas @ 2020-12-18 11:50 UTC (permalink / raw)
  To: help-gnu-emacs

[-- Attachment #1: Type: text/plain, Size: 1036 bytes --]

On Fri, Dec 18, 2020 at 12:38:17PM +0100, pietru@caramail.com wrote:
> 
> 
> > Sent: Friday, December 18, 2020 at 12:30 PM
> > From: "Jean Louis" <bugs@gnu.support>
> > To: pietru@caramail.com
> > Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> > Subject: Re: Passing a list to an interactive function
> >
> > * pietru@caramail.com <pietru@caramail.com> [2020-12-18 14:19]:
> > > I would like to pass a list to an interactive function.  How can I do that?
> >
> > (funcall-interactively #'YOUR-FUNCTION '("List" 2))
> 
> I mean, how do I define an interactive function that takes a list as argument?

I'd guess that 'x' is the most appropriate template char. Extracted from
`interactive's docstring:

  x -- Lisp expression read but not evaluated.

Or you don't provide a string description to `interactive'. Then you
have full control over the user input (for example, if you have a
more concrete idea about how your list's members should look like:
you didn't say anything about that part :-)

Cheers
 - t

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-18 11:38   ` pietru
  2020-12-18 11:49     ` Joost Kremers
  2020-12-18 11:50     ` tomas
@ 2020-12-18 11:56     ` Jean Louis
  2020-12-19  2:05     ` pietru
  3 siblings, 0 replies; 15+ messages in thread
From: Jean Louis @ 2020-12-18 11:56 UTC (permalink / raw)
  To: pietru; +Cc: Help Gnu Emacs

* pietru@caramail.com <pietru@caramail.com> [2020-12-18 14:38]:
> I mean, how do I define an interactive function that takes a list as argument?

I do it this way:

(defun my-function (&optional list)
  (interactive)
  continue here...

So that way I can run the function by using M-x or I can also run
it by providing the list.

If I do not do &optional function will require the list and
normally I cannot run it with M-x interactively.

Jean




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-18 11:38   ` pietru
                       ` (2 preceding siblings ...)
  2020-12-18 11:56     ` Jean Louis
@ 2020-12-19  2:05     ` pietru
  2020-12-19  3:25       ` Jean Louis
  3 siblings, 1 reply; 15+ messages in thread
From: pietru @ 2020-12-19  2:05 UTC (permalink / raw)
  To: pietru; +Cc: Help Gnu Emacs, Jean Louis


> Sent: Friday, December 18, 2020 at 12:38 PM
> From: pietru@caramail.com
> To: "Jean Louis" <bugs@gnu.support>
> Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> Subject: Re: Passing a list to an interactive function
>
>
>
> > Sent: Friday, December 18, 2020 at 12:30 PM
> > From: "Jean Louis" <bugs@gnu.support>
> > To: pietru@caramail.com
> > Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> > Subject: Re: Passing a list to an interactive function
> >
> > * pietru@caramail.com <pietru@caramail.com> [2020-12-18 14:19]:
> > > I would like to pass a list to an interactive function.  How can I do that?
> >
> > (funcall-interactively #'YOUR-FUNCTION '("List" 2))

Still very unsure what to do.  I want to call "M-x thermoluminescence"
but pass six numbers to the function.

(defun thermoluminesce (ta tb tlab tc td tlcd te tf tlef)
   (interactive) )

Could I simply pass six numbers separated by spaces




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-19  2:05     ` pietru
@ 2020-12-19  3:25       ` Jean Louis
  2020-12-19  3:34         ` pietru
  0 siblings, 1 reply; 15+ messages in thread
From: Jean Louis @ 2020-12-19  3:25 UTC (permalink / raw)
  To: pietru; +Cc: Help Gnu Emacs

* pietru@caramail.com <pietru@caramail.com> [2020-12-19 05:06]:
> Still very unsure what to do.  I want to call "M-x thermoluminescence"
> but pass six numbers to the function.
> 
> (defun thermoluminesce (ta tb tlab tc td tlcd te tf tlef)
>    (interactive) )
> 
> Could I simply pass six numbers separated by spaces

To make it less error prone, just do this:

(defun thermoluminesce ()
  (interactive)
  (let* ((list '()) ;; here you prepare empty list
	 (list (dotimes (n 6 (reverse list))
		 (push (read-number (format "Enter number %s: " (1+ n))) list)))
	 (ta (elt list 0))
	 (tb (elt list 1))
	 (tlab (elt list 2))
	 (tc (elt list 3))
	 (td (elt list 4))
	 (tlcd (elt list 5))
	 (te (elt list 6)))
    ;; continue here using variables
    ))



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-19  3:25       ` Jean Louis
@ 2020-12-19  3:34         ` pietru
  2020-12-19  3:49           ` Jean Louis
  0 siblings, 1 reply; 15+ messages in thread
From: pietru @ 2020-12-19  3:34 UTC (permalink / raw)
  To: Jean Louis; +Cc: Help Gnu Emacs

I decided towards a simpler strategy by passing a string with numbers
separated by spaces.  But inside the function, I got to convert from
string to a list containing numbers.

How  could I convert to a list containing numbers.

Example of string: "3 5 13"

> Sent: Saturday, December 19, 2020 at 4:25 AM
> From: "Jean Louis" <bugs@gnu.support>
> To: pietru@caramail.com
> Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> Subject: Re: Passing a list to an interactive function
>
> * pietru@caramail.com <pietru@caramail.com> [2020-12-19 05:06]:
> > Still very unsure what to do.  I want to call "M-x thermoluminescence"
> > but pass six numbers to the function.
> >
> > (defun thermoluminesce (ta tb tlab tc td tlcd te tf tlef)
> >    (interactive) )
> >
> > Could I simply pass six numbers separated by spaces
>
> To make it less error prone, just do this:
>
> (defun thermoluminesce ()
>   (interactive)
>   (let* ((list '()) ;; here you prepare empty list
> 	 (list (dotimes (n 6 (reverse list))
> 		 (push (read-number (format "Enter number %s: " (1+ n))) list)))
> 	 (ta (elt list 0))
> 	 (tb (elt list 1))
> 	 (tlab (elt list 2))
> 	 (tc (elt list 3))
> 	 (td (elt list 4))
> 	 (tlcd (elt list 5))
> 	 (te (elt list 6)))
>     ;; continue here using variables
>     ))
>



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-19  3:34         ` pietru
@ 2020-12-19  3:49           ` Jean Louis
  2020-12-19  4:29             ` pietru
  0 siblings, 1 reply; 15+ messages in thread
From: Jean Louis @ 2020-12-19  3:49 UTC (permalink / raw)
  To: pietru; +Cc: Help Gnu Emacs

* pietru@caramail.com <pietru@caramail.com> [2020-12-19 06:34]:
> I decided towards a simpler strategy by passing a string with numbers
> separated by spaces.  But inside the function, I got to convert from
> string to a list containing numbers.
> 
> How  could I convert to a list containing numbers.
> 
> Example of string: "3 5 13"

Function `read-number' ensured you get the number. If function is for
you it is fine, if it is for others you risk not getting a number. If
data goes to database which also accepts string you risk losing
data as you maybe did not get a number.

If user writes spaces before numbers or after numbers or multiple
spaces between you need to remove such.

(setq my-worse-string "  1 2  3 4  5 6    ")

(setq my-string (split-string my-worse-string) ;; it will convert to numbers

my-string becomes => ("1" "2" "3" "4" "5" "6")

      Inspect `split-string' as it can omit nulls and trim
      strings automatically. But I did not here include those
      switches, as it does so by default.

Then you need to convert list of strings to list of numbers:
      
(mapcar #'string-to-number my-string)




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-19  3:49           ` Jean Louis
@ 2020-12-19  4:29             ` pietru
  2020-12-19  5:54               ` Jean Louis
  2020-12-19  6:23               ` Michael Heerdegen
  0 siblings, 2 replies; 15+ messages in thread
From: pietru @ 2020-12-19  4:29 UTC (permalink / raw)
  To: Jean Louis; +Cc: Help Gnu Emacs

Am trying to fill variables "ta tb tc" with the numbers from "tlist"

(defun thermoluminesce (tseq)
  "Sets thermoluminesce."
  (interactive "stseq: ")
  (message "stseq: %s " tseq)
  (let  ((slist (split-string tseq))
         tlist ta tb tpab)
    (message "slist: %s" slist)
    (message "tlist: %s" tlist)
    (message "tlen: %d" (length tlist))
    (setq tlist (mapcar #'string-to-number slist))
    ;;(setq ta (nth 1 tlist))
    ;;(setq tb (nth 2 tlist))
    ;;(setq tc (nth 3 tlist))
    (message "ta tb tc: %d %d %d" ta tb tc) ))



> Sent: Saturday, December 19, 2020 at 4:49 AM
> From: "Jean Louis" <bugs@gnu.support>
> To: pietru@caramail.com
> Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> Subject: Re: Passing a list to an interactive function
>
> * pietru@caramail.com <pietru@caramail.com> [2020-12-19 06:34]:
> > I decided towards a simpler strategy by passing a string with numbers
> > separated by spaces.  But inside the function, I got to convert from
> > string to a list containing numbers.
> >
> > How  could I convert to a list containing numbers.
> >
> > Example of string: "3 5 13"
>
> Function `read-number' ensured you get the number. If function is for
> you it is fine, if it is for others you risk not getting a number. If
> data goes to database which also accepts string you risk losing
> data as you maybe did not get a number.
>
> If user writes spaces before numbers or after numbers or multiple
> spaces between you need to remove such.
>
> (setq my-worse-string "  1 2  3 4  5 6    ")
>
> (setq my-string (split-string my-worse-string) ;; it will convert to numbers
>
> my-string becomes => ("1" "2" "3" "4" "5" "6")
>
>       Inspect `split-string' as it can omit nulls and trim
>       strings automatically. But I did not here include those
>       switches, as it does so by default.
>
> Then you need to convert list of strings to list of numbers:
>
> (mapcar #'string-to-number my-string)
>
>
>



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-19  4:29             ` pietru
@ 2020-12-19  5:54               ` Jean Louis
  2020-12-19 11:03                 ` pietru
  2020-12-19  6:23               ` Michael Heerdegen
  1 sibling, 1 reply; 15+ messages in thread
From: Jean Louis @ 2020-12-19  5:54 UTC (permalink / raw)
  To: pietru; +Cc: Help Gnu Emacs

* pietru@caramail.com <pietru@caramail.com> [2020-12-19 07:30]:
> Am trying to fill variables "ta tb tc" with the numbers from "tlist"
> 
(defun thermoluminesce (tseq)
  "Sets thermoluminesce."
  (interactive "stseq: ")
  (message "stseq: %s " tseq)
  (let  ((slist (split-string tseq))
         tlist ta tb tpab)
    (message "slist: %s" slist)
    (message "tlist: %s" tlist)
    (message "tlen: %d" (length tlist))
    (setq tlist (mapcar #'string-to-number slist))
    ;;(setq ta (nth 1 tlist))
    ;;(setq tb (nth 2 tlist))
    (setq tc (nth 3 tlist))
    (message "ta tb tc: %d %d %d" ta tb tc) ))

You could as well teach us here what those variables mean by giving
them better descriptive names.

(nth 2 '(1 2 3)) => 3

Is maybe that the problem? That nth is counting starting from 0, not from 1.




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-19  4:29             ` pietru
  2020-12-19  5:54               ` Jean Louis
@ 2020-12-19  6:23               ` Michael Heerdegen
  2020-12-19  6:26                 ` pietru
  1 sibling, 1 reply; 15+ messages in thread
From: Michael Heerdegen @ 2020-12-19  6:23 UTC (permalink / raw)
  To: help-gnu-emacs

pietru@caramail.com writes:

>     ;;(setq ta (nth 1 tlist))
>     ;;(setq tb (nth 2 tlist))
>     ;;(setq tc (nth 3 tlist))

You do not just miss the fact that the list element number index starts
from 0?

Michael.




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Passing a list to an interactive function
  2020-12-19  6:23               ` Michael Heerdegen
@ 2020-12-19  6:26                 ` pietru
  0 siblings, 0 replies; 15+ messages in thread
From: pietru @ 2020-12-19  6:26 UTC (permalink / raw)
  Cc: help-gnu-emacs


Have got everything working now.  Yes, had checked and start at 0.

Thanks

> Sent: Saturday, December 19, 2020 at 11:53 AM
> From: "Michael Heerdegen" <michael_heerdegen@web.de>
> To: help-gnu-emacs@gnu.org
> Subject: Re: Passing a list to an interactive function
>
> pietru@caramail.com writes:
>
> >     ;;(setq ta (nth 1 tlist))
> >     ;;(setq tb (nth 2 tlist))
> >     ;;(setq tc (nth 3 tlist))
>
> You do not just miss the fact that the list element number index starts
> from 0?
>
> Michael.
>
>
>



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Passing a list to an interactive function
  2020-12-19  5:54               ` Jean Louis
@ 2020-12-19 11:03                 ` pietru
  0 siblings, 0 replies; 15+ messages in thread
From: pietru @ 2020-12-19 11:03 UTC (permalink / raw)
  To: Jean Louis; +Cc: Help Gnu Emacs

Yes, that was the problem, the counting from 1.

> Sent: Saturday, December 19, 2020 at 11:24 AM
> From: "Jean Louis" <bugs@gnu.support>
> To: pietru@caramail.com
> Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> Subject: Re: Passing a list to an interactive function
>
> * pietru@caramail.com <pietru@caramail.com> [2020-12-19 07:30]:
> > Am trying to fill variables "ta tb tc" with the numbers from "tlist"
> >
> (defun thermoluminesce (tseq)
>   "Sets thermoluminesce."
>   (interactive "stseq: ")
>   (message "stseq: %s " tseq)
>   (let  ((slist (split-string tseq))
>          tlist ta tb tpab)
>     (message "slist: %s" slist)
>     (message "tlist: %s" tlist)
>     (message "tlen: %d" (length tlist))
>     (setq tlist (mapcar #'string-to-number slist))
>     ;;(setq ta (nth 1 tlist))
>     ;;(setq tb (nth 2 tlist))
>     (setq tc (nth 3 tlist))
>     (message "ta tb tc: %d %d %d" ta tb tc) ))
>
> You could as well teach us here what those variables mean by giving
> them better descriptive names.
>
> (nth 2 '(1 2 3)) => 3
>
> Is maybe that the problem? That nth is counting starting from 0, not from 1.
>
>
>



^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2020-12-19 11:03 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-12-18 11:05 Passing a list to an interactive function pietru
2020-12-18 11:30 ` Jean Louis
2020-12-18 11:38   ` pietru
2020-12-18 11:49     ` Joost Kremers
2020-12-18 11:50     ` tomas
2020-12-18 11:56     ` Jean Louis
2020-12-19  2:05     ` pietru
2020-12-19  3:25       ` Jean Louis
2020-12-19  3:34         ` pietru
2020-12-19  3:49           ` Jean Louis
2020-12-19  4:29             ` pietru
2020-12-19  5:54               ` Jean Louis
2020-12-19 11:03                 ` pietru
2020-12-19  6:23               ` Michael Heerdegen
2020-12-19  6:26                 ` pietru

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).