unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* GURU NEEDED : macro SQUARE(x) for any type x
@ 2011-01-14  6:46 bolega
  2011-01-14  7:09 ` luser- -droog
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: bolega @ 2011-01-14  6:46 UTC (permalink / raw)
  To: help-gnu-emacs; +Cc: bolega

Basically, I have spent a few hours experimenting and searching on the
comp.lang.c/c++

Let me use SQR for brevity and saving line

Here are progressively refined macros :

#define SQR(x) ((x)*(x))

#define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})  // NOTE,
closure or {} inside () is a valid idea in C, and thus no return is
needed.

this macro is given in several posts like

http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/38ef2b108e325da6/e5fe657622e5595b?q=%22typedef+xtype%22&pli=1

there is a problem with typedef

Bolega


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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14  6:46 GURU NEEDED : macro SQUARE(x) for any type x bolega
@ 2011-01-14  7:09 ` luser- -droog
  2011-01-14  7:10 ` Rivka Miller
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: luser- -droog @ 2011-01-14  7:09 UTC (permalink / raw)
  To: help-gnu-emacs

On Jan 14, 12:46 am, bolega <gnuist...@gmail.com> wrote:
> Basically, I have spent a few hours experimenting and searching on the
> comp.lang.c/c++
>
> Let me use SQR for brevity and saving line
>
> Here are progressively refined macros :
>
> #define SQR(x) ((x)*(x))
>
> #define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})  // NOTE,
> closure or {} inside () is a valid idea in C, and thus no return is
> needed.
>
> this macro is given in several posts like
>
> http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/38ef2...
>
> there is a problem with typedef
>
> Bolega

What problem?


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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14  6:46 GURU NEEDED : macro SQUARE(x) for any type x bolega
  2011-01-14  7:09 ` luser- -droog
@ 2011-01-14  7:10 ` Rivka Miller
  2011-01-14  7:15 ` luser- -droog
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Rivka Miller @ 2011-01-14  7:10 UTC (permalink / raw)
  To: help-gnu-emacs

On Jan 13, 10:46 pm, bolega <gnuist...@gmail.com> wrote:
> Basically, I have spent a few hours experimenting and searching on the
> comp.lang.c/c++
>
> Let me use SQR for brevity and saving line
>
> Here are progressively refined macros :
>
> #define SQR(x) ((x)*(x))
>
> #define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})  // NOTE,
> closure or {} inside () is a valid idea in C, and thus no return is
> needed.
>
> this macro is given in several posts like
>
> http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/38ef2...
>
> there is a problem with typedef
>
> Bolega

try if this works

#define square(x) ({typeof(x) temp=x; temp*temp;})

Rivka


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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14  6:46 GURU NEEDED : macro SQUARE(x) for any type x bolega
  2011-01-14  7:09 ` luser- -droog
  2011-01-14  7:10 ` Rivka Miller
@ 2011-01-14  7:15 ` luser- -droog
  2011-01-14  8:14   ` Hans Vlems
  2011-01-14  8:51 ` Gert-Jan de Vos
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: luser- -droog @ 2011-01-14  7:15 UTC (permalink / raw)
  To: help-gnu-emacs

On Jan 14, 12:46 am, bolega <gnuist...@gmail.com> wrote:
> Basically, I have spent a few hours experimenting and searching on the
> comp.lang.c/c++
>
> Let me use SQR for brevity and saving line
>
> Here are progressively refined macros :
>
> #define SQR(x) ((x)*(x))
>
> #define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})  // NOTE,
> closure or {} inside () is a valid idea in C, and thus no return is
> needed.
>
> this macro is given in several posts like
>
> http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/38ef2...
>
> there is a problem with typedef
>
> Bolega

OIK

#define SQR(x) pow((x),2)
or
#define SQR(x) exp(2 * log(x))


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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14  7:15 ` luser- -droog
@ 2011-01-14  8:14   ` Hans Vlems
  2011-01-14  9:04     ` luser- -droog
  0 siblings, 1 reply; 13+ messages in thread
From: Hans Vlems @ 2011-01-14  8:14 UTC (permalink / raw)
  To: help-gnu-emacs

On 14 jan, 08:15, luser- -droog <mijo...@yahoo.com> wrote:
> On Jan 14, 12:46 am, bolega <gnuist...@gmail.com> wrote:
>
>
>
>
>
> > Basically, I have spent a few hours experimenting and searching on the
> > comp.lang.c/c++
>
> > Let me use SQR for brevity and saving line
>
> > Here are progressively refined macros :
>
> > #define SQR(x) ((x)*(x))
>
> > #define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})  // NOTE,
> > closure or {} inside () is a valid idea in C, and thus no return is
> > needed.
>
> > this macro is given in several posts like
>
> >http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/38ef2...
>
> > there is a problem with typedef
>
> > Bolega
>
> OIK
>
> #define SQR(x) pow((x),2)
> or
> #define SQR(x) exp(2 * log(x))- Tekst uit oorspronkelijk bericht niet weergeven -
>
> - Tekst uit oorspronkelijk bericht weergeven -

What happens for x=0 in the second example?


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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14  6:46 GURU NEEDED : macro SQUARE(x) for any type x bolega
                   ` (2 preceding siblings ...)
  2011-01-14  7:15 ` luser- -droog
@ 2011-01-14  8:51 ` Gert-Jan de Vos
  2011-01-14 11:13   ` James Kuyper
  2011-01-14  9:57 ` Bart van Ingen Schenau
  2011-01-15  2:24 ` PKM
  5 siblings, 1 reply; 13+ messages in thread
From: Gert-Jan de Vos @ 2011-01-14  8:51 UTC (permalink / raw)
  To: help-gnu-emacs

On Jan 14, 7:46 am, bolega <gnuist...@gmail.com> wrote:
> Basically, I have spent a few hours experimenting and searching on the
> comp.lang.c/c++
>
> Let me use SQR for brevity and saving line
>
> Here are progressively refined macros :
>
> #define SQR(x) ((x)*(x))
>
> #define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})  // NOTE,
> closure or {} inside () is a valid idea in C, and thus no return is
> needed.
>
> this macro is given in several posts like
>
> http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/38ef2...
>
> there is a problem with typedef
>
> Bolega

Why not just an inline function template (this being c.l.c++)?

template <typename T>
inline T square(T value)
{
    return value*value;
}

Gert-Jan


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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14  8:14   ` Hans Vlems
@ 2011-01-14  9:04     ` luser- -droog
  0 siblings, 0 replies; 13+ messages in thread
From: luser- -droog @ 2011-01-14  9:04 UTC (permalink / raw)
  To: help-gnu-emacs

On Jan 14, 2:14 am, Hans Vlems <hvl...@freenet.de> wrote:
> On 14 jan, 08:15, luser- -droog <mijo...@yahoo.com> wrote:
>
>
>
> > On Jan 14, 12:46 am, bolega <gnuist...@gmail.com> wrote:
>
> > > Basically, I have spent a few hours experimenting and searching on the
> > > comp.lang.c/c++
>
> > > Let me use SQR for brevity and saving line
>
> > > Here are progressively refined macros :
>
> > > #define SQR(x) ((x)*(x))
>
> > > #define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})  // NOTE,
> > > closure or {} inside () is a valid idea in C, and thus no return is
> > > needed.
>
> > > this macro is given in several posts like
>
> > >http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/38ef2...
>
> > > there is a problem with typedef
>
> > > Bolega
>
> > OIK
>
> > #define SQR(x) pow((x),2)
> > or
> > #define SQR(x) exp(2 * log(x))- Tekst uit oorspronkelijk bericht niet weergeven -
>
> > - Tekst uit oorspronkelijk bericht weergeven -
>
> What happens for x=0 in the second example?

Rats! And you can't do a ternary 'cause you'd have to
mention x twice.

But that would be a penalty in lisp, too wouldn't it?
An expression with a side-effect would perform the
side-effect twice, right?


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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14  6:46 GURU NEEDED : macro SQUARE(x) for any type x bolega
                   ` (3 preceding siblings ...)
  2011-01-14  8:51 ` Gert-Jan de Vos
@ 2011-01-14  9:57 ` Bart van Ingen Schenau
  2011-01-15  2:24 ` PKM
  5 siblings, 0 replies; 13+ messages in thread
From: Bart van Ingen Schenau @ 2011-01-14  9:57 UTC (permalink / raw)
  To: help-gnu-emacs

On Jan 14, 7:46 am, bolega <gnuist...@gmail.com> wrote:
> Basically, I have spent a few hours experimenting and searching on the
> comp.lang.c/c++
>
> Let me use SQR for brevity and saving line
>
> Here are progressively refined macros :
>
> #define SQR(x) ((x)*(x))
>
> #define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})  // NOTE,
> closure or {} inside () is a valid idea in C, and thus no return is
> needed.

The ({ ... }) construct is not valid in standard C or standard C++. It
is a GCC extension.
If you want a standard-conforming macro that works for any type and
also yields a value of that same type, you are stuck with the first
macro you present.
There is no way to write such a macro in standard C without evaluating
x twice.

In C++, you have the option of using an inline templated function, as
shown by Gert-Jan de Vos.

If your portability needs do not extend beyond GCC (and compilers
accepting the same dialect), you can use an expression-block similar
to the second block, as shown by Rivka Miller.

>
> Bolega

Bart v Ingen Schenau


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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14  8:51 ` Gert-Jan de Vos
@ 2011-01-14 11:13   ` James Kuyper
  2011-01-14 20:01     ` Stefan Monnier
  0 siblings, 1 reply; 13+ messages in thread
From: James Kuyper @ 2011-01-14 11:13 UTC (permalink / raw)
  To: help-gnu-emacs

On 01/14/2011 03:51 AM, Gert-Jan de Vos wrote:
> On Jan 14, 7:46�am, bolega<gnuist...@gmail.com>  wrote:
>> Basically, I have spent a few hours experimenting and searching on the
>> comp.lang.c/c++
>>
>> Let me use SQR for brevity and saving line
>>
>> Here are progressively refined macros :
>>
>> #define SQR(x) ((x)*(x))
>>
>> #define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval}) �// NOTE,
>> closure or {} inside () is a valid idea in C, and thus no return is
>> needed.
>>
>> this macro is given in several posts like
>>
>> http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/38ef2...
>>
>> there is a problem with typedef
>>
>> Bolega
>
> Why not just an inline function template (this being c.l.c++)?
>
> template<typename T>
> inline T square(T value)
> {
>      return value*value;
> }

Because this is also cross-posted to c.l.c. That could mean he's one of 
those people who thinks C and C++ are a single language called C/C++, 
but alternatively, it could mean that he needs a separate solution for 
each language, or a single solution that works in both languages.



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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14 11:13   ` James Kuyper
@ 2011-01-14 20:01     ` Stefan Monnier
  2011-01-14 21:57       ` James Kuyper
  0 siblings, 1 reply; 13+ messages in thread
From: Stefan Monnier @ 2011-01-14 20:01 UTC (permalink / raw)
  To: help-gnu-emacs

> Because this is also cross-posted to c.l.c. That could mean he's one of
> those people who thinks C and C++ are a single language called C/C++, but
> alternatively, it could mean that he needs a separate solution for each
> language, or a single solution that works in both languages.

Since he also cross-posted to g.e.help, I guess we should presume he
thinks Help is also a language in the same family or that he also wants
a solution in that language?


        Stefan


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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14 20:01     ` Stefan Monnier
@ 2011-01-14 21:57       ` James Kuyper
  0 siblings, 0 replies; 13+ messages in thread
From: James Kuyper @ 2011-01-14 21:57 UTC (permalink / raw)
  To: help-gnu-emacs

On 01/14/2011 03:01 PM, Stefan Monnier wrote:
>> Because this is also cross-posted to c.l.c. That could mean he's one of
>> those people who thinks C and C++ are a single language called C/C++, but
>> alternatively, it could mean that he needs a separate solution for each
>> language, or a single solution that works in both languages.
>
> Since he also cross-posted to g.e.help, I guess we should presume he
> thinks Help is also a language in the same family or that he also wants
> a solution in that language?

I have not the slightest idea why he cross-posted to g.e.help. The 
speculation I wrote about his motives for posting to c.l.c and c.l.c++ 
reflects my past experiences with other people who made similar 
cross-postings.



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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-14  6:46 GURU NEEDED : macro SQUARE(x) for any type x bolega
                   ` (4 preceding siblings ...)
  2011-01-14  9:57 ` Bart van Ingen Schenau
@ 2011-01-15  2:24 ` PKM
  2011-01-15 19:55   ` Keith Thompson
  5 siblings, 1 reply; 13+ messages in thread
From: PKM @ 2011-01-15  2:24 UTC (permalink / raw)
  To: help-gnu-emacs

On Jan 13, 11:46 pm, bolega <gnuist...@gmail.com> wrote:
> #define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})  // NOTE,
> closure or {} inside () is a valid idea in C, and thus no return is
> needed.

I don't see how this could possibly work:

/*test.c*/
#define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})

int main(void)
{
	SQR(2);
	return 0;
}

$ gcc test.c
test.c: In function ‘main’:
test.c:7: error: typedef ‘xtype’ is initialized (use __typeof__
instead)
test.c:7: error: expected ‘;’ before ‘}’ token

Recompiling after making those changes yields

test.c: In function ‘main’:
test.c:7: error: expected ‘(’ before ‘xtype’
test.c:7: error: ‘xtype’ undeclared (first use in this function)
test.c:7: error: (Each undeclared identifier is reported only once
test.c:7: error: for each function it appears in.)
test.c:7: error: expected ‘;’ before ‘xval’
test.c:7: error: ‘xval’ undeclared (first use in this function)

And even if it did compile, isn't it the case that
this code is attempting to use the same token as both
a value and as a type?


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

* Re: GURU NEEDED : macro SQUARE(x) for any type x
  2011-01-15  2:24 ` PKM
@ 2011-01-15 19:55   ` Keith Thompson
  0 siblings, 0 replies; 13+ messages in thread
From: Keith Thompson @ 2011-01-15 19:55 UTC (permalink / raw)
  To: help-gnu-emacs

PKM <phoenixstormcrow@gmail.com> writes:
> On Jan 13, 11:46 pm, bolega <gnuist...@gmail.com> wrote:
>> #define SQR(x) ({typedef xtype=x; xtype xval=x; xval*xval})  // NOTE,
>> closure or {} inside () is a valid idea in C, and thus no return is
>> needed.
>
> I don't see how this could possibly work:

It can't.

It depends on two gcc-specific extensions, and it gets both of them
wrong.

Here's a version that actually works with gcc:

#define SQR(x) ({typedef typeof(x) xtype; xtype xval=(x); xval * xval;})

The "typeof" keyword is non-standard, as is the use of a "statement
expression".

There is no general solution in standard C that avoids evaluating the
argument twice.

But in practice, this:

#define SQR(x) ((x) * (x))

works perfectly well.  The convention of using all-caps for macro names
warns the user that the argument might be evaluated more than once.

-- 
Keith Thompson (The_Other_Keith) kst-u@mib.org  <http://www.ghoti.net/~kst>
Nokia
"We must do something.  This is something.  Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"


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

end of thread, other threads:[~2011-01-15 19:55 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-14  6:46 GURU NEEDED : macro SQUARE(x) for any type x bolega
2011-01-14  7:09 ` luser- -droog
2011-01-14  7:10 ` Rivka Miller
2011-01-14  7:15 ` luser- -droog
2011-01-14  8:14   ` Hans Vlems
2011-01-14  9:04     ` luser- -droog
2011-01-14  8:51 ` Gert-Jan de Vos
2011-01-14 11:13   ` James Kuyper
2011-01-14 20:01     ` Stefan Monnier
2011-01-14 21:57       ` James Kuyper
2011-01-14  9:57 ` Bart van Ingen Schenau
2011-01-15  2:24 ` PKM
2011-01-15 19:55   ` Keith Thompson

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).