From: Emanuel Berg <incal@dataswamp.org>
To: help-gnu-emacs@gnu.org
Subject: Re: Making a function than can only be used interactively
Date: Fri, 08 Jul 2022 08:30:04 +0200 [thread overview]
Message-ID: <87bku0ce1f.fsf@dataswamp.org> (raw)
In-Reply-To: CAP_d_8W5e4s2Mih0FMkrbcSvrN7eHVyBE66Ci5MMU=GYJZpBSA@mail.gmail.com
Yuri Khan wrote:
> It does not matter for interactive use. [...] ‘&optional’
> comes into play if you use this function non-interactively,
> from Lisp
No, it matters. One example how it matters is that optional
arguments defaults to nil.
Check out this file and in particular example 4 which doesn't
make sense to me?
;;; -*- lexical-binding: t -*-
;;
;; this file:
;; https://dataswamp.org/~incal/emacs-init/dwim.el
;; DWIM example 1, from Lisp ignore region if set
(defun test-dwim (&optional beg end)
(interactive (when (use-region-p)
(list (region-beginning) (region-end)) ))
(or beg (setq beg (point-min))) ; or (point)
(or end (setq end (point-max)))
;; insert code here
;; now let's just make a list to do something
(list beg end) )
;; example 2, use the region if available from Lisp as well
(defun test-dwim-2 (&optional beg end)
(interactive (when (use-region-p)
(list (region-beginning) (region-end)) ))
(or beg (setq beg (if (use-region-p) (region-beginning) (point-min))))
(or end (setq end (if (use-region-p) (region-end) (point-max))))
(list beg end) )
;; example 3, one call to `use-region-p' is enough
(defun test-dwim-3 (re &optional beg end)
(interactive `(,(read-regexp "re: ")
,@(when (use-region-p)
(list (region-beginning) (region-end)) )))
(or beg (setq beg (point-min)))
(or end (setq end (point-max)))
(message "%s" (list re beg end)) )
;; example 4, let's do that with the `interactive' spec
;; string. but without `use-region-p' it doesn't reset after
;; I clear the region, or that's what I thought happened
;; anyway :) so this doesn't work as intended, which
;; `test-dwim-3' does, supposedly the worse one.
(defun test-dwim-4 (re &optional beg end)
(interactive "sre: \nr")
(or beg (setq beg (point-min)))
(or end (setq end (point-max)))
(message "%s" (list re beg end)) )
;; test the interface
(when nil
(save-excursion
(set-mark 10)
(goto-char 500)
(call-interactively #'test-dwim) ) ; (10 500)
(call-interactively #'test-dwim) ; ( 1 2867)
(test-dwim 30 90) ; (30 90)
(test-dwim) ; ( 1 2867)
)
;; example function
(defun count-chars (&optional beg end)
(interactive (when (use-region-p)
(list (region-beginning) (region-end)) ))
(let*((bg (or beg (point-min)))
(ed (or end (point-max)))
(df (- ed bg)) )
(prog1
df
(message "%d" df) )))
;; Test the example function:
;;
:; [try these with and without a region]
;;
;; (call-interactively #'count-chars)
;; (count-chars)
;;
;; [this will always be the same tho]
;;
;; (count-chars 10 40)
;;
;; Note:
;; A common mistake in Elisp is that optional formal
;; parameters aren't sent as arguments when called from
;; Lisp, they are then nil but are used as for example an
;; integer, as in:
;;
;; (when (and (<= 0 width) (<= width 648)) ... ) ; DNC
;;
;; The test method is to call the function every way possible:
;; 1. interactively with a region
;; 2. ditto w/o
;; 3. From Lisp with arguments
;; 4. ditto w/o
;; .. ..
--
underground experts united
https://dataswamp.org/~incal
next prev parent reply other threads:[~2022-07-08 6:30 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-03 19:16 Making a function than can only be used interactively carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-03 19:28 ` Bruno Barbier
[not found] ` <N64WnlX--3-2@missing-mail-id>
2022-07-03 19:36 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-03 19:53 ` Tassilo Horn
2022-07-03 20:17 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-04 4:51 ` Tassilo Horn
2022-07-05 23:13 ` Emanuel Berg
2022-07-03 20:14 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-07-03 20:27 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-03 20:51 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-03 21:18 ` Stefan Monnier
2022-07-03 21:29 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-03 22:01 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-07-03 22:45 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-04 1:13 ` Stefan Monnier
[not found] ` <jwvczelllyq.fsf-monnier+emacs@gnu.org-N65lQ2m----2>
2022-07-04 10:36 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-04 10:55 ` Tassilo Horn
2022-07-04 11:43 ` Christopher Dimech
2022-07-04 13:21 ` Stefan Monnier
2022-07-04 14:08 ` Robert Pluim
2022-07-04 21:40 ` Christopher Dimech
2022-07-05 17:35 ` Jean Louis
2022-07-04 19:17 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-04 19:40 ` Stefan Monnier
2022-07-04 19:50 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-04 20:45 ` Stefan Monnier
2022-07-06 0:07 ` Jean Louis
2022-07-06 20:00 ` Christopher Dimech
2022-07-06 20:29 ` Jean Louis
2022-07-07 11:03 ` Christopher Dimech
2022-07-07 21:06 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-07 21:28 ` Emanuel Berg
2022-07-07 22:14 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-08 3:40 ` Emanuel Berg
2022-07-08 6:08 ` Yuri Khan
2022-07-08 6:30 ` Emanuel Berg [this message]
2022-07-08 6:55 ` Yuri Khan
2022-07-08 11:44 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-09 2:05 ` Emanuel Berg
2022-07-10 4:33 ` Emanuel Berg
2022-07-08 12:06 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-08 12:11 ` Christopher Dimech
[not found] ` <N6Sh4jm--3-2@tutanota.com-N6ShCt5----2>
2022-07-08 12:18 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-08 16:14 ` Christopher Dimech
2022-07-08 20:29 ` [External] : " Drew Adams
2022-07-08 21:09 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-08 22:17 ` Drew Adams
2022-07-08 22:34 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-09 14:53 ` Drew Adams
2022-08-09 2:24 ` Emanuel Berg
2022-07-09 2:06 ` Emanuel Berg
2022-07-08 23:19 ` Emanuel Berg
2022-07-04 20:53 ` Drew Adams
2022-07-05 23:30 ` no difference between interactive and "from Lisp" (was: Re: Making a function than can only be used interactively) Emanuel Berg
2022-07-06 2:28 ` no difference between interactive and "from Lisp" Stefan Monnier via Users list for the GNU Emacs text editor
2022-07-06 3:42 ` Emanuel Berg
2022-07-04 1:06 ` Making a function than can only be used interactively Po Lu
-- strict thread matches above, loose matches on Subject: below --
2022-07-04 19:32 Christopher Dimech
2022-07-04 20:10 Christopher Dimech
2022-07-04 20:35 ` Stefan Monnier
2022-07-04 20:46 ` Christopher Dimech
2022-07-04 21:18 ` Stefan Monnier
2022-07-04 21:59 ` Christopher Dimech
2022-07-05 22:34 ` carlmarcos--- via Users list for the GNU Emacs text editor
2022-07-04 21:07 Christopher Dimech
2022-07-04 21:45 ` Stefan Monnier
2022-07-04 22:05 ` Christopher Dimech
2022-07-04 22:35 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-07-04 23:33 ` Christopher Dimech
2022-07-04 23:42 Christopher Dimech
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87bku0ce1f.fsf@dataswamp.org \
--to=incal@dataswamp.org \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.