POV-Ray : Newsgroups : povray.general : Macro problem Server Time
29 Jul 2024 04:19:03 EDT (-0400)
  Macro problem (Message 4 to 13 of 13)  
<<< Previous 3 Messages Goto Initial 10 Messages
From: MichaelJF
Subject: Re: Macro problem
Date: 11 Oct 2013 06:15:01
Message: <web.5257ce9030eb22c6e83c0f490@news.povray.org>
"posfan12" <nomail@nomail> wrote:
> I'm using RC7 by the way.
>
>
> "posfan12" <nomail@nomail> wrote:
> > I'm trying to write a macro that randomly either returns -1 or 1. This is what I
> > have:
> >
> > #macro randsign()
> >  #if (rand(HPlanet_Seed_Value) > 0.5)
> >   1
> >  #else
> >   -1
> >  #end
> > #end
> >
> > However, POVray stops rendering and says "All #declares of float, vector, and
> >  color require semi-colon ';' at end if the language version is set to 3.5 or
> >  higher."
> >
> > What am I doing wrong? Adding the semi-colon causes the scene to quit for other
> > reasons.

Better thsi one:

#declare Zufall=seed(317);

#macro randsign()
   #local Z1=rand(Zufall)-0.5;
   #if (Z1=0) Z1=0.1; #end     // avoid division by zero
   Z1/abs(Z1)
#end

#declare Count=0;
#while(Count<100)
   #declare ZufallsZahl=randsign();
   #debug concat("Zufallszahl: ",str(ZufallsZahl,8,4),"\n")
   #declare Count=Count+1;
#end


Post a reply to this message

From: posfan12
Subject: Re: Macro problem
Date: 11 Oct 2013 06:15:01
Message: <web.5257ced630eb22c641a177270@news.povray.org>
"MichaelJF" <mi-### [at] t-onlinede> wrote:
> "posfan12" <nomail@nomail> wrote:
> > I'm using RC7 by the way.
> >
> >
> > "posfan12" <nomail@nomail> wrote:
> > > I'm trying to write a macro that randomly either returns -1 or 1. This is what I
> > > have:
> > >
> > > #macro randsign()
> > >  #if (rand(HPlanet_Seed_Value) > 0.5)
> > >   1
> > >  #else
> > >   -1
> > >  #end
> > > #end
> > >
> > > However, POVray stops rendering and says "All #declares of float, vector, and
> > >  color require semi-colon ';' at end if the language version is set to 3.5 or
> > >  higher."
> > >
> > > What am I doing wrong? Adding the semi-colon causes the scene to quit for other
> > > reasons.
>
> I tried your code, but got no idea about this semi-colon issue.
>
> This one works for me:
> #declare Zufall=seed(317);
>
> #macro randsign()
>    #local Z1=rand(Zufall)-0.5;
>    Z1/abs(Z1)
> #end
>
> #declare Count=0;
> #while(Count<100)
>    #declare ZufallsZahl=randsign();
>    #debug concat("Zufallszahl: ",str(ZufallsZahl,8,4),"\n")
>    #declare Count=Count+1;
> #end
>
> Best regards,
> Michael

Should I file a bug report?


Post a reply to this message

From: MichaelJF
Subject: Re: Macro problem
Date: 11 Oct 2013 06:15:01
Message: <web.5257cef730eb22c6e83c0f490@news.povray.org>
Sorry again:

#declare Zufall=seed(317);

#macro randsign()
   #local Z1=rand(Zufall)-0.5;
   #if (Z1=0) #local Z1=0.1; #end     // avoid division by zero
   Z1/abs(Z1)
#end

#declare Count=0;
#while(Count<100)
   #declare ZufallsZahl=randsign();
   #debug concat("Zufallszahl: ",str(ZufallsZahl,8,4),"\n")
   #declare Count=Count+1;
#end


Post a reply to this message

From: scott
Subject: Re: Macro problem
Date: 11 Oct 2013 06:19:24
Message: <5257d0ac$1@news.povray.org>
> #macro randsign()
>   #if (rand(HPlanet_Seed_Value) > 0.5)
>    1
>   #else
>    -1
>   #end
> #end

It seems you can't do that (IDK why - maybe a bug, or more likely a 
"feature" of the parser). In fact you can't even do this:

#macro A()
#if(true)
1
#end
#end

It doesn't like having anything to return inside a #if within a #macro

A solution is to just use a temporary variable:

#macro randsign()
  #if (rand(HPlanet_Seed_Value) > 0.5)
   #local temp = 1;
  #else
   #local temp = -1;
  #end
  temp
#end


Post a reply to this message

From: MichaelJF
Subject: Re: Macro problem
Date: 11 Oct 2013 06:50:00
Message: <web.5257d79430eb22c6e83c0f490@news.povray.org>
"posfan12" <nomail@nomail> wrote:

>
> Should I file a bug report?

I'm not sure, if it is a bug. May be we both have overlooked something. I wanted
to provide you with a quick workaround.

Best regards,
Michael


Post a reply to this message

From: Warp
Subject: Re: Macro problem
Date: 11 Oct 2013 13:23:48
Message: <52583424@news.povray.org>
posfan12 <nomail@nomail> wrote:
> #macro randsign()
>  #if (rand(HPlanet_Seed_Value) > 0.5)
>   1
>  #else
>   -1
>  #end
> #end

It's not a bug, but by design (even though it might not be intuitive.)

You have to assign the value you want to "return" from the macro to a
local variable and then have the name of that variable as the last thing
in the macro.

-- 
                                                          - Warp


Post a reply to this message

From: Alain
Subject: Re: Macro problem
Date: 11 Oct 2013 13:33:07
Message: <52583653$1@news.povray.org>

> I'm trying to write a macro that randomly either returns -1 or 1. This is what I
> have:
>
> #macro randsign()
>   #if (rand(HPlanet_Seed_Value) > 0.5)
>    1
>   #else
>    -1
>   #end
> #end
>
> However, POVray stops rendering and says "All #declares of float, vector, and
>   color require semi-colon ';' at end if the language version is set to 3.5 or
>   higher."
>
> What am I doing wrong? Adding the semi-colon causes the scene to quit for other
> reasons.
>
>

It may depend on how you call your macro.

You can call it this way:
#declare Var= randsign();

Or edit the macro this way:
#macro randsign()
  #if (rand(HPlanet_Seed_Value) > 0.5)
   1;
  #else
   -1;
  #end
#end

and sue it this way:
#declare Val= randsign()

OR, use it in some calculation:

#declare Val= randsign()* Value;


Alain


Post a reply to this message

From: MichaelJF
Subject: Re: Macro problem
Date: 11 Oct 2013 13:50:01
Message: <web.5258395730eb22c692cabf390@news.povray.org>
Warp <war### [at] tagpovrayorg> wrote:
> posfan12 <nomail@nomail> wrote:
> > #macro randsign()
> >  #if (rand(HPlanet_Seed_Value) > 0.5)
> >   1
> >  #else
> >   -1
> >  #end
> > #end
>
> It's not a bug, but by design (even though it might not be intuitive.)
>
> You have to assign the value you want to "return" from the macro to a
> local variable and then have the name of that variable as the last thing
> in the macro.
>
> --
>                                                           - Warp

>I have guessed that we had overlooked something. But is this issue really mentioned
within the documentary? A document
ary which is still closed to the users right now. And called a Wiki ...

Best regards,
Michael


Post a reply to this message

From: posfan12
Subject: Re: Macro problem
Date: 11 Oct 2013 14:10:01
Message: <web.52583ee130eb22c641a177270@news.povray.org>
Warp <war### [at] tagpovrayorg> wrote:
> It's not a bug, but by design (even though it might not be intuitive.)
>
> You have to assign the value you want to "return" from the macro to a
> local variable and then have the name of that variable as the last thing
> in the macro.
>
> --
>                                                           - Warp

Awesome, thanks!


Mike


Post a reply to this message

From: Warp
Subject: Re: Macro problem
Date: 11 Oct 2013 15:10:22
Message: <52584d1e@news.povray.org>
Warp <war### [at] tagpovrayorg> wrote:
> It's not a bug, but by design (even though it might not be intuitive.)

Btw, with "by design" I don't mean that the developers deliberately
chose to make macros work like that on purpose, while discarding
alternatives. It's more like macros were tacked onto the existing SDL
parser (the SDL parser has existed for a lot longer than #macros), and
the way in which it parses has this kind of side-effect, and it was
decided to leave it as it is. It may not be the most intuitive way
of "returning a value" (if you can call it as such) from a macro, but
it works with the current SDL parser as it was originally designed.
I think that making macros work more intuitively in this regard would
have required too large of a refactoring job of the entire parser.

There are other curious side-effects of how the SDL parser works, some
of them beneficial, and which are relatively little-known.

For example, if you read values from a file using #read, said file
can have #declare statements in it, and they will be parsed normally
(as if they had been #included.) It's just a side-effect of using the
same SDL parser to implement #read.

-- 
                                                          - Warp


Post a reply to this message

<<< Previous 3 Messages Goto Initial 10 Messages

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.