* How to put this in a macro
@ 2010-04-16 21:13 Cecil Westerhof
2010-04-16 23:28 ` José A. Romero L.
` (2 more replies)
0 siblings, 3 replies; 18+ messages in thread
From: Cecil Westerhof @ 2010-04-16 21:13 UTC (permalink / raw)
To: help-gnu-emacs
In my code I use the following code on several places:
(if (equal start end)
(setq start (point-min)
end (point-max))
(setq start (or start (point-min)))
(setq end (or end (point-max))))
I think it would be good to put this in a macro. How would I write a
macro for this code?
Or could it be done with a function?
--
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-16 21:13 How to put this in a macro Cecil Westerhof
@ 2010-04-16 23:28 ` José A. Romero L.
2010-04-17 3:08 ` Barry Margolin
2010-04-18 7:50 ` Pascal J. Bourguignon
2 siblings, 0 replies; 18+ messages in thread
From: José A. Romero L. @ 2010-04-16 23:28 UTC (permalink / raw)
To: help-gnu-emacs
On 16 Kwi, 23:13, Cecil Westerhof <Ce...@decebal.nl> wrote:
> In my code I use the following code on several places:
> (if (equal start end)
> (setq start (point-min)
> end (point-max))
> (setq start (or start (point-min)))
> (setq end (or end (point-max))))
>
> I think it would be good to put this in a macro. How would I write a
> macro for this code?
>
> Or could it be done with a function?
You could certainly write some macro for that piece of code, but I'd
strongly recommend against doing so. Just think about it, suppose you
write this:
(defmacro cw/fix-bounds (start end)
`(if (equal ,start ,end)
(setq start (point-min)
end (point-max))
(setq start (or ,start (point-min))
end (or ,end (point-max)))))
then, at run time you have no real control over what you are actually
setting: the variables start and end may or may not be defined at the
point (and in the scope) where the macro is expanded, or may have a
totally different meaning or type than what you originally imagined -
Welcome to dynamic scoping land :-)
But this isn't only a matter of dynamic vs. lexical scoping - I think
you may be trying to refactor your code at a too low level. Consider
the way you're using those variables: are they by chance being used
always together, to represent some kind of extent in a buffer? if so,
then that's what IMHO you should be trying to model. In any case, try
to look at the surroundings of those lines for more common behavior
that could be factored out, even if the code doesn't look the same.
That's it: see your program as living behavior, not as dead code.
Duh, looks like I should better go to sleep now ;-)
Cheers,
--
José A. Romero L.
escherdragon at gmail
"We who cut mere stones must always be envisioning cathedrals."
(Quarry worker's creed)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-16 21:13 How to put this in a macro Cecil Westerhof
2010-04-16 23:28 ` José A. Romero L.
@ 2010-04-17 3:08 ` Barry Margolin
2010-04-17 6:38 ` Cecil Westerhof
2010-04-18 7:50 ` Pascal J. Bourguignon
2 siblings, 1 reply; 18+ messages in thread
From: Barry Margolin @ 2010-04-17 3:08 UTC (permalink / raw)
To: help-gnu-emacs
In article <87pr1zw164.fsf@linux-lqcw.site>,
Cecil Westerhof <Cecil@decebal.nl> wrote:
> In my code I use the following code on several places:
> (if (equal start end)
> (setq start (point-min)
> end (point-max))
> (setq start (or start (point-min)))
> (setq end (or end (point-max))))
>
> I think it would be good to put this in a macro. How would I write a
> macro for this code?
>
> Or could it be done with a function?
(defmacro canonicalize-start-end (start-var end-var)
`(if (equal ,start-var ,end-var)
(setq ,start-var (point-min)
,end-var (point-max))
(setq ,start-var (or ,start-var (point-min))
,end-var (or ,end-var (point-max))))
You then use this as:
(canonicalize-start-end start end)
--
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***
*** PLEASE don't copy me on replies, I'll read them in the group ***
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 3:08 ` Barry Margolin
@ 2010-04-17 6:38 ` Cecil Westerhof
2010-04-17 10:30 ` José A. Romero L.
2010-04-17 15:12 ` Barry Margolin
0 siblings, 2 replies; 18+ messages in thread
From: Cecil Westerhof @ 2010-04-17 6:38 UTC (permalink / raw)
To: help-gnu-emacs
Barry Margolin <barmar@alum.mit.edu> writes:
> (defmacro canonicalize-start-end (start-var end-var)
> `(if (equal ,start-var ,end-var)
> (setq ,start-var (point-min)
> ,end-var (point-max))
> (setq ,start-var (or ,start-var (point-min))
> ,end-var (or ,end-var (point-max))))
This gives an error:
Debugger entered--Lisp error: (void-variable start-var)
(list (quote equal) start-var end-var)
--
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 6:38 ` Cecil Westerhof
@ 2010-04-17 10:30 ` José A. Romero L.
2010-04-17 11:07 ` Cecil Westerhof
2010-04-17 15:14 ` Barry Margolin
2010-04-17 15:12 ` Barry Margolin
1 sibling, 2 replies; 18+ messages in thread
From: José A. Romero L. @ 2010-04-17 10:30 UTC (permalink / raw)
To: help-gnu-emacs
On 17 Kwi, 08:38, Cecil Westerhof <Ce...@decebal.nl> wrote:
> Barry Margolin <bar...@alum.mit.edu> writes:
> > (defmacro canonicalize-start-end (start-var end-var)
> > `(if (equal ,start-var ,end-var)
> > (setq ,start-var (point-min)
> > ,end-var (point-max))
> > (setq ,start-var (or ,start-var (point-min))
> > ,end-var (or ,end-var (point-max))))
>
> This gives an error:
> Debugger entered--Lisp error: (void-variable start-var)
> (list (quote equal) start-var end-var)
(...)
Makes sense. In general writing things like `(setq ,foo bar) is (if
possible at all) asking for trouble -- what would happen when foo is
nil, or 5?
Maybe you could do something like this:
(defmacro cw/set-bounds (start-sym end-sym)
`(if (equal (symbol-value ,start-sym) (symbol-value ,end-sym))
(progn
(set ,start-sym (point-min))
(set ,end-sym (point-max)))
(progn
(set ,start-sym (or start (point-min)))
(set ,end-sym (or end (point-max))))))
and use it as:
(cw/set-bounds 'start 'end)
i.e. passing the symbols of the variables you want to set.
Cheers,
--
José A. Romero L.
escherdragon at gmail
"We who cut mere stones must always be envisioning cathedrals."
(Quarry worker's creed)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 10:30 ` José A. Romero L.
@ 2010-04-17 11:07 ` Cecil Westerhof
2010-04-17 11:40 ` Cecil Westerhof
2010-04-17 12:13 ` José A. Romero L.
2010-04-17 15:14 ` Barry Margolin
1 sibling, 2 replies; 18+ messages in thread
From: Cecil Westerhof @ 2010-04-17 11:07 UTC (permalink / raw)
To: help-gnu-emacs
José A. Romero L. <escherdragon@gmail.com> writes:
> Maybe you could do something like this:
>
> (defmacro cw/set-bounds (start-sym end-sym)
> `(if (equal (symbol-value ,start-sym) (symbol-value ,end-sym))
> (progn
> (set ,start-sym (point-min))
> (set ,end-sym (point-max)))
> (progn
> (set ,start-sym (or start (point-min)))
> (set ,end-sym (or end (point-max))))))
Almost. It looks like the following does what I want:
(defmacro cw/set-bounds (start-sym end-sym)
`(if (equal (symbol-value ,start-sym) (symbol-value ,end-sym))
(progn
(set ,start-sym (point-min))
(set ,end-sym (point-max)))
(progn
(set ,start-sym (or ,start-sym (point-min)))
(set ,end-sym (or ,end-sym (point-max))))))
In the or's the parameter is used instead of the hard variables start
and end.
Thanks.
--
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 11:07 ` Cecil Westerhof
@ 2010-04-17 11:40 ` Cecil Westerhof
2010-04-17 15:15 ` José A. Romero L.
2010-04-17 12:13 ` José A. Romero L.
1 sibling, 1 reply; 18+ messages in thread
From: Cecil Westerhof @ 2010-04-17 11:40 UTC (permalink / raw)
To: help-gnu-emacs
Cecil Westerhof <Cecil@decebal.nl> writes:
> Almost. It looks like the following does what I want:
> (defmacro cw/set-bounds (start-sym end-sym)
> `(if (equal (symbol-value ,start-sym) (symbol-value ,end-sym))
> (progn
> (set ,start-sym (point-min))
> (set ,end-sym (point-max)))
> (progn
> (set ,start-sym (or ,start-sym (point-min)))
> (set ,end-sym (or ,end-sym (point-max))))))
>
Almost. It should be:
(defmacro dcbl-set-bounds (start-sym end-sym)
`(if (equal (symbol-value ,start-sym) (symbol-value ,end-sym))
(progn
(set ,start-sym (point-min))
(set ,end-sym (point-max)))
(progn
(set ,start-sym (or (symbol-value ,start-sym) (point-min)))
(set ,end-sym (or (symbol-value ,end-sym) (point-max))))
(if (> (symbol-value ,start-sym) (symbol-value ,end-sym))
(let ((temp (symbol-value ,start-sym)))
(set ,start-sym (symbol-value ,end-sym))
(set ,end-sym temp)))))
I also make sure now that start is not after end.
--
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 11:07 ` Cecil Westerhof
2010-04-17 11:40 ` Cecil Westerhof
@ 2010-04-17 12:13 ` José A. Romero L.
1 sibling, 0 replies; 18+ messages in thread
From: José A. Romero L. @ 2010-04-17 12:13 UTC (permalink / raw)
To: help-gnu-emacs
On 17 Kwi, 13:07, Cecil Westerhof <Ce...@decebal.nl> wrote:
> José A. Romero L. <escherdra...@gmail.com> writes:
(...)
> > (progn
> > (set ,start-sym (or start (point-min)))
> > (set ,end-sym (or end (point-max))))))
>
> Almost. It looks like the following does what I want:
(...)
> (progn
> (set ,start-sym (or ,start-sym (point-min)))
> (set ,end-sym (or ,end-sym (point-max))))))
>
> In the or's the parameter is used instead of the hard variables start
> and end.
Oops, sorry, that was a mind shortcut happening too soon. In any case
it should be rather:
(...)
(progn
(set ,start-sym (or (symbol-value ,start-sym) (point-min)))
(set ,start-sym (or (symbol-value ,end-sym) (point-max))))
as you won't be passing nil as one of the arguments to the macro.
Cheers,
--
José A. Romero L.
escherdragon at gmail
"We who cut mere stones must always be envisioning cathedrals."
(Quarry worker's creed)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 6:38 ` Cecil Westerhof
2010-04-17 10:30 ` José A. Romero L.
@ 2010-04-17 15:12 ` Barry Margolin
1 sibling, 0 replies; 18+ messages in thread
From: Barry Margolin @ 2010-04-17 15:12 UTC (permalink / raw)
To: help-gnu-emacs
In article <87d3xywpm6.fsf@linux-lqcw.site>,
Cecil Westerhof <Cecil@decebal.nl> wrote:
> Barry Margolin <barmar@alum.mit.edu> writes:
>
> > (defmacro canonicalize-start-end (start-var end-var)
> > `(if (equal ,start-var ,end-var)
> > (setq ,start-var (point-min)
> > ,end-var (point-max))
> > (setq ,start-var (or ,start-var (point-min))
> > ,end-var (or ,end-var (point-max))))
>
> This gives an error:
> Debugger entered--Lisp error: (void-variable start-var)
> (list (quote equal) start-var end-var)
Sorry, I posted without testing. Add another close paren at the end.
--
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***
*** PLEASE don't copy me on replies, I'll read them in the group ***
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 10:30 ` José A. Romero L.
2010-04-17 11:07 ` Cecil Westerhof
@ 2010-04-17 15:14 ` Barry Margolin
2010-04-17 16:49 ` José A. Romero L.
1 sibling, 1 reply; 18+ messages in thread
From: Barry Margolin @ 2010-04-17 15:14 UTC (permalink / raw)
To: help-gnu-emacs
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1689 bytes --]
In article
<bf0039f9-f7eb-497d-bb74-88d3bb9c5077@u34g2000yqu.googlegroups.com>,
José A. Romero L. <escherdragon@gmail.com> wrote:
> On 17 Kwi, 08:38, Cecil Westerhof <Ce...@decebal.nl> wrote:
> > Barry Margolin <bar...@alum.mit.edu> writes:
> > > (defmacro canonicalize-start-end (start-var end-var)
> > > `(if (equal ,start-var ,end-var)
> > > (setq ,start-var (point-min)
> > > ,end-var (point-max))
> > > (setq ,start-var (or ,start-var (point-min))
> > > ,end-var (or ,end-var (point-max))))
> >
> > This gives an error:
> > Debugger entered--Lisp error: (void-variable start-var)
> > (list (quote equal) start-var end-var)
> (...)
>
> Makes sense. In general writing things like `(setq ,foo bar) is (if
> possible at all) asking for trouble -- what would happen when foo is
> nil, or 5?
My macro requires that the parameters be variables, not expressions.
>
> Maybe you could do something like this:
>
> (defmacro cw/set-bounds (start-sym end-sym)
> `(if (equal (symbol-value ,start-sym) (symbol-value ,end-sym))
> (progn
> (set ,start-sym (point-min))
> (set ,end-sym (point-max)))
> (progn
> (set ,start-sym (or start (point-min)))
> (set ,end-sym (or end (point-max))))))
>
> and use it as:
>
> (cw/set-bounds 'start 'end)
>
> i.e. passing the symbols of the variables you want to set.
If you call it like that, it can be a function, not a macro.
--
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***
*** PLEASE don't copy me on replies, I'll read them in the group ***
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 11:40 ` Cecil Westerhof
@ 2010-04-17 15:15 ` José A. Romero L.
2010-04-17 16:49 ` Barry Margolin
2010-04-17 19:38 ` Cecil Westerhof
0 siblings, 2 replies; 18+ messages in thread
From: José A. Romero L. @ 2010-04-17 15:15 UTC (permalink / raw)
To: help-gnu-emacs
On 17 Kwi, 13:40, Cecil Westerhof <Ce...@decebal.nl> wrote:
(...)
> (if (> (symbol-value ,start-sym) (symbol-value ,end-sym))
> (let ((temp (symbol-value ,start-sym)))
> (set ,start-sym (symbol-value ,end-sym))
> (set ,end-sym temp)))))
>
> I also make sure now that start is not after end.
(...)
Hmm, be careful with lets inside macros - this will work OK until one
of the variables you try to set is named precisely "temp" (no lexical
scope, remember?).
Cheers,
--
José A. Romero L.
escherdragon at gmail
"We who cut mere stones must always be envisioning cathedrals."
(Quarry worker's creed)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 15:15 ` José A. Romero L.
@ 2010-04-17 16:49 ` Barry Margolin
2010-04-17 16:57 ` José A. Romero L.
2010-04-17 19:38 ` Cecil Westerhof
1 sibling, 1 reply; 18+ messages in thread
From: Barry Margolin @ 2010-04-17 16:49 UTC (permalink / raw)
To: help-gnu-emacs
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 921 bytes --]
In article
<0b67cc27-1c96-459b-a8f8-435cef946281@q15g2000yqj.googlegroups.com>,
José A. Romero L. <escherdragon@gmail.com> wrote:
> On 17 Kwi, 13:40, Cecil Westerhof <Ce...@decebal.nl> wrote:
> (...)
> > (if (> (symbol-value ,start-sym) (symbol-value ,end-sym))
> > (let ((temp (symbol-value ,start-sym)))
> > (set ,start-sym (symbol-value ,end-sym))
> > (set ,end-sym temp)))))
> >
> > I also make sure now that start is not after end.
> (...)
>
> Hmm, be careful with lets inside macros - this will work OK until one
> of the variables you try to set is named precisely "temp" (no lexical
> scope, remember?).
Another reason why his version should be a function.
--
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***
*** PLEASE don't copy me on replies, I'll read them in the group ***
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 15:14 ` Barry Margolin
@ 2010-04-17 16:49 ` José A. Romero L.
0 siblings, 0 replies; 18+ messages in thread
From: José A. Romero L. @ 2010-04-17 16:49 UTC (permalink / raw)
To: help-gnu-emacs
On 17 Kwi, 17:14, Barry Margolin <bar...@alum.mit.edu> wrote:
(...)
> > possible at all) asking for trouble -- what would happen when foo is
> > nil, or 5?
>
> My macro requires that the parameters be variables, not expressions.
You're right. Emacs is actually smarter than I thought and won't let
you pass anything but variables to the call.
(...)
> > i.e. passing the symbols of the variables you want to set.
>
> If you call it like that, it can be a function, not a macro.
(...)
It can be a function or a macro, whatever you prefer, though I do
agree your version is definitely better.
Cheers,
--
José A. Romero L.
escherdragon at gmail
"We who cut mere stones must always be envisioning cathedrals."
(Quarry worker's creed)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 16:49 ` Barry Margolin
@ 2010-04-17 16:57 ` José A. Romero L.
2010-04-17 21:41 ` Barry Margolin
0 siblings, 1 reply; 18+ messages in thread
From: José A. Romero L. @ 2010-04-17 16:57 UTC (permalink / raw)
To: help-gnu-emacs
On 17 Kwi, 18:49, Barry Margolin <bar...@alum.mit.edu> wrote:
(...)
> > Hmm, be careful with lets inside macros - this will work OK until one
> > of the variables you try to set is named precisely "temp" (no lexical
> > scope, remember?).
>
> Another reason why his version should be a function.
(...)
I don't think that would make any difference - let binds the same in
functions as it does in macros.
Cheers,
--
José A. Romero L.
escherdragon at gmail
"We who cut mere stones must always be envisioning cathedrals."
(Quarry worker's creed)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 15:15 ` José A. Romero L.
2010-04-17 16:49 ` Barry Margolin
@ 2010-04-17 19:38 ` Cecil Westerhof
2010-04-17 23:58 ` José A. Romero L.
1 sibling, 1 reply; 18+ messages in thread
From: Cecil Westerhof @ 2010-04-17 19:38 UTC (permalink / raw)
To: help-gnu-emacs
José A. Romero L. <escherdragon@gmail.com> writes:
>> (if (> (symbol-value ,start-sym) (symbol-value ,end-sym))
>> (let ((temp (symbol-value ,start-sym)))
>> (set ,start-sym (symbol-value ,end-sym))
>> (set ,end-sym temp)))))
>>
>> I also make sure now that start is not after end.
> (...)
>
> Hmm, be careful with lets inside macros - this will work OK until one
> of the variables you try to set is named precisely "temp" (no lexical
> scope, remember?).
I deleted it again. It is at the moment not important, because all the
functions that use the macro do not care if the end is before the
beginning. So it is not really important at the moment. But I like to
make robust code, and when in the future the macro is used where it is a
problem when the start is after the end ... So is it possible to switch
the values when the end is before the start?
--
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 16:57 ` José A. Romero L.
@ 2010-04-17 21:41 ` Barry Margolin
0 siblings, 0 replies; 18+ messages in thread
From: Barry Margolin @ 2010-04-17 21:41 UTC (permalink / raw)
To: help-gnu-emacs
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 853 bytes --]
In article
<20cf62c9-76ef-47c7-b9e4-edcc4b99b560@u34g2000yqu.googlegroups.com>,
José A. Romero L. <escherdragon@gmail.com> wrote:
> On 17 Kwi, 18:49, Barry Margolin <bar...@alum.mit.edu> wrote:
> (...)
> > > Hmm, be careful with lets inside macros - this will work OK until one
> > > of the variables you try to set is named precisely "temp" (no lexical
> > > scope, remember?).
> >
> > Another reason why his version should be a function.
> (...)
>
> I don't think that would make any difference - let binds the same in
> functions as it does in macros.
Right. You even mentioned non-lexical scoping, although that's actually
irrelevant when it's a macro.
--
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***
*** PLEASE don't copy me on replies, I'll read them in the group ***
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-17 19:38 ` Cecil Westerhof
@ 2010-04-17 23:58 ` José A. Romero L.
0 siblings, 0 replies; 18+ messages in thread
From: José A. Romero L. @ 2010-04-17 23:58 UTC (permalink / raw)
To: help-gnu-emacs
On 17 Kwi, 21:38, Cecil Westerhof <Ce...@decebal.nl> wrote:
(...)
> beginning. So it is not really important at the moment. But I like to
> make robust code, and when in the future the macro is used where it is a
> problem when the start is after the end ... So is it possible to switch
> the values when the end is before the start?
(...)
If you're in for a bit of coding stunts :-) I guess we could have one
last try, using your name, Barry's macro and shorter variable names:
(defmacro dcbl-set-bounds (start end)
`(progn
(if (equal ,start ,end)
(setq ,start (point-min)
,end (point-max))
(setq ,start (or ,start (point-min))
,end (or ,end (point-max))))
(setq ,start (list ,start ,end)
,start (sort ,start '<)
,end (second ,start)
,start (first ,start))))
it should be OK to use one of the variables being changed as the temp
var, shouldn't it?
Cheers,
--
José A. Romero L.
escherdragon at gmail
"We who cut mere stones must always be envisioning cathedrals."
(Quarry worker's creed)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: How to put this in a macro
2010-04-16 21:13 How to put this in a macro Cecil Westerhof
2010-04-16 23:28 ` José A. Romero L.
2010-04-17 3:08 ` Barry Margolin
@ 2010-04-18 7:50 ` Pascal J. Bourguignon
2 siblings, 0 replies; 18+ messages in thread
From: Pascal J. Bourguignon @ 2010-04-18 7:50 UTC (permalink / raw)
To: help-gnu-emacs
Cecil Westerhof <Cecil@decebal.nl> writes:
> In my code I use the following code on several places:
> (if (equal start end)
> (setq start (point-min)
> end (point-max))
> (setq start (or start (point-min)))
> (setq end (or end (point-max))))
>
> I think it would be good to put this in a macro. How would I write a
> macro for this code?
>
> Or could it be done with a function?
Yes.
;; In a functional style:
(require 'cl)
(defun normalize-start-end (start end)
;; In addition, we will sort the bounds:
(cond
((null start) (values (point-min) (or end (point-max))))
((null end) (values start (point-max)))
((= start end) (values (point-min) (point-max)))
((< start end) (values start end))
(t (values end start))))
(defun cmd (start end)
(interactive "r")
(multiple-value-bind (start end) (normalize-start-end start end)
...))
;; In emacs lisp, we can also set the symbols:
(defun set-normalized-start-end (start-sym end-sym)
(multiple-value-bind (start end) (normalize-start-end
(symbol-value start-sym)
(symbol-value end-sym))
(setf (symbol-value start-sym) start
(symbol-value end-sym) end)))
(defun cmd (start end)
(interactive "r")
(set-normalized-start-end 'start 'end)
...)
I would write the macro as:
(defmacro with-normalized-start-end ((start-var end-var) &body body)
`(multiple-value-bind (,start-var ,end-var)
(normalize-start-end ,start-var ,end-var)
,@body))
(defun cmd (start end)
(interactive "r")
(with-normalized-start-end (start end)
...))
--
__Pascal Bourguignon__
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2010-04-18 7:50 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-16 21:13 How to put this in a macro Cecil Westerhof
2010-04-16 23:28 ` José A. Romero L.
2010-04-17 3:08 ` Barry Margolin
2010-04-17 6:38 ` Cecil Westerhof
2010-04-17 10:30 ` José A. Romero L.
2010-04-17 11:07 ` Cecil Westerhof
2010-04-17 11:40 ` Cecil Westerhof
2010-04-17 15:15 ` José A. Romero L.
2010-04-17 16:49 ` Barry Margolin
2010-04-17 16:57 ` José A. Romero L.
2010-04-17 21:41 ` Barry Margolin
2010-04-17 19:38 ` Cecil Westerhof
2010-04-17 23:58 ` José A. Romero L.
2010-04-17 12:13 ` José A. Romero L.
2010-04-17 15:14 ` Barry Margolin
2010-04-17 16:49 ` José A. Romero L.
2010-04-17 15:12 ` Barry Margolin
2010-04-18 7:50 ` Pascal J. Bourguignon
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.