<div dir="ltr"><br><div class="gmail_quote">On Mon, May 16, 2011 at 12:23, Joerg Schuelke <span dir="ltr"><<a href="mailto:joerg.schuelke@gmx.de">joerg.schuelke@gmx.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Am Mon, 16 May 2011 11:16:39 +0300<br>
schrieb ik <<a href="mailto:idokan@gmail.com">idokan@gmail.com</a>>:<br>
<div class="im"><br>
> So what that I'm trying to say is that Macro in C and C++ are there<br>
> as a hack to do things you can not do properly<br>
> in any other way. And I can not find any real reason for using it in<br>
> Pascal.<br>
<br>
</div>An macro represents the concept of automated text changing. Nothing<br>
else!!<br></blockquote><div><br>On current FPC yes, on C it's more complicated then that.<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


<br>
The answer was to use a logging facility? Maybe some kind of log<br>
server, where a pascal import unit is avail?<br>
<br>
Thats really very high level for that low level problem ;-(<br></blockquote><div><br>It's not high level, it's the same level as you suggested, but already existed and<br>not required to implement a new feature. You want to write your own logging system,<br>

then ok, please do, but why do I have to use Macro for that ? your example of the <br>whole new logging system is very complicated and prune to have a lot of problems<br>inside.<br><br><br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


<br>
This way you restrict the programmer!<br>
<br>
My debug system gives me what I want:<br>
- FILE info from build-in macro<br>
- FUNC info from build-in macro (patched by myself)<br>
- LINE info from build-in macro<br>
- the additional info I request<br></blockquote><div><br>You can have the entire calling stack of an exception as well (without using a macro) on FPC and I think also on Delphi.<br><br>However the FILE, can be used with TObject.UnitName and no Macro.<br>

FUNC, You can get that information (including it's memory address) using RTTI.<br>LINE, well using exception that you capture you can get that (remember the calling stack feature ?).<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


<br>
And now it is time to say that a real discussion is not possible if you<br>
always say: Yeah, you should not do that! Sounds like religion for me.<br></blockquote><div><br>I was at Ruby IRC once and someone told people that they wish to use Hungarian notation with Ruby.<br>Ruby's variables are all inherited from Kernel class, but can be changed like Pascal's variant on run-time. <br>

It's silly to use Hungarian notation on such type of variables, even if you make them immutable. <br>If that person would recommend that the usage of that notation as a programming guideline, then it will<br>have the same reaction like with the Macro discussion. I still do not understand what are the benefits that<br>

I will have, however I do understand what are the problems I can have (not all).<br>Your example is not good enough to make me understand the need for Macro.<br><br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


<br>
I remember:<br>
                            **********<br>
An macro represents the concept of automated text changing. Nothing<br>
else!!<br>
                            **********<br>
<br>
If you want to criticize it, do it. And I do that to.<br>
Did you see that your argument of macros are a hack to do things which<br>
else not can be done in C, is easily turned around? Some things you do<br>
the only-true-pascal-way are only dirty hacks, to prevent the use of an<br>
macro. Because you do not have one. </blockquote><div><br>In C you can create a callback and any type structure except of records and unions <br>inside a function.<br>It's very unreadable and hard to to maintain or use.<br>

because you are using the include system, you also have a lot of IFDEF that allow things<br>to be included only once.<br>A lot of IFDEF are unmaintainable hacks btw. Not only on C but also with Pascal.<br>The way you suggested to create a Macro is not so readable imho.<br>

<br>Why not to create something like:<br><br><b>macro</b> Macro_Name(Param)<br><b>begin</b><br><b>end</b>;<br><br>The Pascal way ? It's more readable. But then what do you gain with that Macro ?<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


<br>
For example the statement: Use a logging facility instead. If that<br>
would be true, the compiler would use one. You would use one. Everybody<br>
would use one, everytime. </blockquote><div><br>There are unit tests tools, there are BDD based testing tools and more, however <br>most of the time, I prefer to write my own tests that check if things are what they should<br>

or should not have.<br>I used to use a lot of asserts 10 years ago, now I prefer not to use them.<br>I used to like Exceptions, now I prefer to return error codes<br>The thing is that I have a choice. I can do things as I want. but even my "hacks" are<br>

maintainable and readable, you just need to understand the logic of the library and <br>things are easy to use. With Macro you do not have that. Each macro have it's own<br>logic, and it's own idea, and it's own style. See remember the list above ? you can <br>

have the line, unit etc name without using a Macro.<br>You can have logging system that you prefer to have without Macro. Even the one <br>you suggested.<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


But no, we mess around with that writeln thing and comments. Do not say<br>
you did not, you did never.<br></blockquote><div><br>Sure I do, and I use many time something like this:<br><br>procedure toLog(const S : String);<br>{$IFDEF DEBUG}<br>   ....<br>{$ENDIF}<br>end;<br><br>It's not a hack but a choice to insert things to log.<br>

I can also create something like this:<br><br>procedure toLog(debug_level : TDebugLevel; const S : String);<br>
{$IFDEF DEBUG}<br>
   if debug_level <= current_debug_level then<br>    writeln(debug_to_str(debug_level), ' [', DateTimeToStr(now) ,'] ', s);<br>
{$ENDIF}<br>
end;<br> <br>There are so many ways to implement what you ask for without macro.<br>So again, why do I need a macro for ? <br>What are the Pro's that makes it better to be used then the cons ?<br><br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


<br>
Regards<br>
        Jörg<br></blockquote><div><br>Ido<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div><div></div><div class="h5">_______________________________________________<br>
fpc-devel maillist  -  <a href="mailto:fpc-devel@lists.freepascal.org">fpc-devel@lists.freepascal.org</a><br>
<a href="http://lists.freepascal.org/mailman/listinfo/fpc-devel" target="_blank">http://lists.freepascal.org/mailman/listinfo/fpc-devel</a><br>
</div></div></blockquote></div><br></div>