all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* How to exit function from inside its `interactive' call?
@ 2014-08-06 19:38 Thorsten Jolitz
  2014-08-06 19:47 ` Drew Adams
  0 siblings, 1 reply; 5+ messages in thread
From: Thorsten Jolitz @ 2014-08-06 19:38 UTC (permalink / raw
  To: help-gnu-emacs


Hi List, 

how can I use catch/throw (or whatever) to exit function foo from inside
its 'interactive call? All combinations I tried so far only exit
'interactive and still execute the function body. 

#+begin_src emacs-lisp
  (defun foo (&optional arg)
    (catch 'exit
      (interactive
       (let ((bar (if current-prefix-arg
                      (prefix-numeric-value)
                    (throw 'exit nil))))
         (list (+ 2 bar)))))
    (message "Arg: %s" arg))
#+end_src

#+results:
: Arg: nil

#+begin_src emacs-lisp
 (foo)
#+end_src

#+results:
: Arg: nil

#+begin_src emacs-lisp
 (foo '(4))
#+end_src

#+results:
: Arg: (4)

Thanks for any hint.



-- 
cheers,
Thorsten




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

* RE: How to exit function from inside its `interactive' call?
  2014-08-06 19:38 How to exit function from inside its `interactive' call? Thorsten Jolitz
@ 2014-08-06 19:47 ` Drew Adams
  2014-08-06 21:12   ` Thorsten Jolitz
  0 siblings, 1 reply; 5+ messages in thread
From: Drew Adams @ 2014-08-06 19:47 UTC (permalink / raw
  To: Thorsten Jolitz, help-gnu-emacs


> how can I use catch/throw (or whatever) to exit function foo from inside
> its 'interactive call? All combinations I tried so far only exit
> 'interactive and still execute the function body.

(defun bar ()
  (interactive (top-level))
  (message "aaaaaaaaa"))

(defun foo ()
  (interactive
   (throw 'top-level 'HELLO))
  (message "JJJJJJJJJJJJJJ"))



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

* Re: How to exit function from inside its `interactive' call?
  2014-08-06 19:47 ` Drew Adams
@ 2014-08-06 21:12   ` Thorsten Jolitz
  2014-08-07  7:14     ` Nicolas Richard
  0 siblings, 1 reply; 5+ messages in thread
From: Thorsten Jolitz @ 2014-08-06 21:12 UTC (permalink / raw
  To: help-gnu-emacs

Drew Adams <drew.adams@oracle.com> writes:

>> how can I use catch/throw (or whatever) to exit function foo from inside
>> its 'interactive call? All combinations I tried so far only exit
>> 'interactive and still execute the function body.
>
> (defun bar ()
>   (interactive (top-level))
>   (message "aaaaaaaaa"))
>
> (defun foo ()
>   (interactive
>    (throw 'top-level 'HELLO))
>   (message "JJJJJJJJJJJJJJ"))


That works, thanks!
Did not know about `top-level'. 

-- 
cheers,
Thorsten




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

* Re: How to exit function from inside its `interactive' call?
  2014-08-06 21:12   ` Thorsten Jolitz
@ 2014-08-07  7:14     ` Nicolas Richard
  2014-08-07  8:33       ` Thorsten Jolitz
  0 siblings, 1 reply; 5+ messages in thread
From: Nicolas Richard @ 2014-08-07  7:14 UTC (permalink / raw
  To: Thorsten Jolitz; +Cc: help-gnu-emacs

Thorsten Jolitz <tjolitz@gmail.com> writes:
> That works, thanks!
> Did not know about `top-level'. 

There is an obvious shortcoming : if you're in the middle of a recursive
edit, you'll be back to top level.

Why not simply throw an error ?

(defun foo ()
  (interactive
   (user-error "Interrupted"))
  (message "JJJJJJJJJJJJJJ")) 

-- 
Nico.



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

* Re: How to exit function from inside its `interactive' call?
  2014-08-07  7:14     ` Nicolas Richard
@ 2014-08-07  8:33       ` Thorsten Jolitz
  0 siblings, 0 replies; 5+ messages in thread
From: Thorsten Jolitz @ 2014-08-07  8:33 UTC (permalink / raw
  To: help-gnu-emacs

Nicolas Richard <theonewiththeevillook@yahoo.fr> writes:

> Thorsten Jolitz <tjolitz@gmail.com> writes:
>> That works, thanks!
>> Did not know about `top-level'. 
>
> There is an obvious shortcoming : if you're in the middle of a recursive
> edit, you'll be back to top level.

I see.

> Why not simply throw an error ?
>
> (defun foo ()
>   (interactive
>    (user-error "Interrupted"))
>   (message "JJJJJJJJJJJJJJ")) 

Mhhh ... because actually no error occured, the function is simply done
at that point, and I did not want to produce an error?

But when called interactively, its more like an (error-) message anyway,
so I might as well use this. Thanks.

-- 
cheers,
Thorsten




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

end of thread, other threads:[~2014-08-07  8:33 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-06 19:38 How to exit function from inside its `interactive' call? Thorsten Jolitz
2014-08-06 19:47 ` Drew Adams
2014-08-06 21:12   ` Thorsten Jolitz
2014-08-07  7:14     ` Nicolas Richard
2014-08-07  8:33       ` Thorsten Jolitz

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.