LISTSERV at the University of Georgia
Menubar Imagemap
Home Browse Manage Request Manuals Register
Previous messageNext messagePrevious in topicNext in topicPrevious by same authorNext by same authorPrevious page (June 2006, week 4)Back to main SAS-L pageJoin or leave SAS-L (or change settings)ReplyPost a new messageSearchProportional fontNon-proportional font
Date:   Thu, 22 Jun 2006 16:32:19 +0000
Reply-To:   toby dunn <tobydunn@HOTMAIL.COM>
Sender:   "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU>
From:   toby dunn <tobydunn@HOTMAIL.COM>
Subject:   Re: macro structure
Comments:   To: Ya.Huang@amylin.com
In-Reply-To:   <C0C8366F844D9F448DF6A5E40A1C2B9E61A65F@A-EXCH2K3-VS2.amylin.com>
Content-Type:   text/plain; format=flowed

If you are only going to call it once then perhaps you dont need too use macros at all or perhaps you dont need to have the second macro A.

During World War II the British started noticing that many of their bombers where getting shot down. They were getting shot down not from losing a wing or something as drastic as that but rather from bullet holes in the bombers gas tank. They also noticed that the German planes did not suffer from this. A quick investigation revealed that the German bombers had self-sealing gas tanks. The British quickly decided that they needed to do something to improve their bombers gas tanks. The intelligence/scientist working with the British government, R. V Jones, investigated and found that at the end of World War I Britain has actually developed a bullet proof gas tank. However, since was developed at the end of World War I it was also decided that the gas tank should be not only bullet proof but crash proof since crashes where the major cause of death to the pilots then. Well needless to say they never could come up with both a bullet proof and a crash proof gas tank, so the whole concept was forgotten about. Along these lines another scientist proposed that the best material to develop motorcycle crash helmets out of was plate glass. Well it doesn’t take a rocket scientist to deduce that while plate glass was great for visibility and did a good job at keeping the bugs and elements off of the riders head it wouldn’t fare so well when the rider crashed.

So what does bullet /crash proof gas tanks and plate glass motorcycle helmets have to do with macros? Well they are perfect examples of getting the problem correct. Macros are at their best when they do one thing and do that one thing well. When the problem is miss specified the macro will either try to do much, leading to the macro becoming overly complicated and inflexible. This case is much like the gas tank example above, the real problem was that they needed to only be bullet proof, the addition of crash proof over specified the problem and since they couldn’t find away to have both the project was dropped. On the other hand miss specifying the problem can lead to the macro not doing enough to solve the problem, this is similar to the crash helmet example above. While the plate glass helmet does provide great visibility it does not protect the rider when a crash occurs.

Now one other thing to consider, suppose you need to expand the program. This is reasonable as alot of use get this request. You find that you need to functionality of macro A but you dont need the all the overhead of Macro Main. If you use your second example your screwed, you have to call macro Main to get to use macro A, which I bet you a dollar to a doughnut wont work for variaous reasons. If you went with your first example there would be no problem. Macro Main simply calls macro A, and if you need to use macro A in another macro or somehwere else outside of a second macro frame work there is no problems you just call it. This is call loose coupling and is something you should strive for in your programs. It provides modularity and flexability while alleviating people reading, using, and modifying your programs from having to know everything that is going on in your programs or macros at the same time. We humans have a limited amount of cranial space and whie we are very creative we are also very error prone. Since programs arent simple things (ussually) we need to do everything we can to simplify the problem. Modularity, coupling, cohesion, comments, eternal documentation, paying attention to the flow of the program, using well named variable names, using white space, indentation, and watching which methods and procedures we use really really makes a huge difference.

Toby Dunn

From: "Huang, Ya" <Ya.Huang@amylin.com> To: "toby dunn" <tobydunn@hotmail.com>,<SAS-L@LISTSERV.UGA.EDU> Subject: RE: macro structure Date: Thu, 22 Jun 2006 09:01:22 -0700

But I only call %main once, even though it has a looping inside calls %a multiple times.

-----Original Message----- From: toby dunn [mailto:tobydunn@hotmail.com] Sent: Thursday, June 22, 2006 8:59 AM To: Huang, Ya; SAS-L@LISTSERV.UGA.EDU Subject: RE: macro structure

YA ,

Yes, with macro one both macros A and Main only get compiled once. With your example 2 Macro A gets compiled everytime macro Main gets executed.

Toby Dunn

From: Ya Huang <ya.huang@AMYLIN.COM> Reply-To: Ya Huang <ya.huang@AMYLIN.COM> To: SAS-L@LISTSERV.UGA.EDU Subject: macro structure Date: Thu, 22 Jun 2006 11:52:59 -0400

Hi there,

Structure 1:

%macro a; ... %mend a;

%macro main;

...

%do i=1 %to &xx; %a %end;

... %mend main;

Structure 2:

%macro main;

%macro a; ... %mend a;

...

%do i=1 %to &xx; %a %end;

... %mend main;

So for structure 1, two macro are separated in two files, %main can call %a because of the auto macro call library.

For structure 2, %a is defined inside %main, but before the looping. Is there significant benifit of 1 over 2?

Thanks

Ya


Back to: Top of message | Previous page | Main SAS-L page