[prev in list] [next in list] [prev in thread] [next in thread] 

List:       sas-l
Subject:    Re: how not 2 err
From:       Fried Egg <fried.egg () VERIZON ! NET>
Date:       2017-06-30 18:37:31
Message-ID: 00c401d2f1cf$ef176da0$cd4648e0$ () verizon ! net
[Download RAW message or body]

This is a multipart message in MIME format.


Your other option would be to convert the result of GETITEMN to real binary data \
using the RBw.d Format, then even if the value is missing, you would not get the \
error you were seeing.

 

    __baftemp__i=nameditem(&src,"%upcase(&&var&x)");

    if itemtype(&src,__baftemp__i)='C' 

        then call pokelong(getitemc(&src,__baftemp__i), addrlong(&methodvar), \
vlength(&methodvar));

        else call pokelong(put(getitemn(&src,__baftemp__i),rb8.), \
addrlong(&methodvar),8);

 

I would still utilize the length attribute (unless you know getitemc could never go \
beyond the length of &methodvar), but the floating-point attribute would not be \
helpful here.

 

From: Allan Bowe [mailto:allnbowe@gmail.com] 
Sent: Friday, June 30, 2017 12:31 PM
To: Fried Egg
Cc: SAS-L@LISTSERV.UGA.EDU
Subject: Re: how not 2 err

 

@Joe - you were correct to omit the length / floating point attributes, that did the \
trick along with a specific test for a missing value:

 

  %else %if %length(&&var&x)>0 %then %do;

    __baftemp__i=nameditem(&src,"%upcase(&&var&x)"); /* index */

    if itemtype(&src,__baftemp__i)='C' then

      call pokelong(getitemc(&src,__baftemp__i), addrlong(&methodvar));

    else if getitemn(&src,__baftemp__i)=. then call missing(&methodvar);

    else call pokelong(getitemn(&src,__baftemp__i), addrlong(&methodvar));

    /*

    if itemtype(&src,__baftemp__i)='C' then &methodvar=getitemc(&src,__baftemp__i);

    else &methodvar=getitemn(&src,__baftemp__i);

    */

  %end;

 

On 30 June 2017 at 16:51, Allan Bowe <allnbowe@gmail.com <mailto:allnbowe@gmail.com> \
> wrote:

@Fried Egg - thanks for this, I made some headway.  Also, after reviewing this \
insightful (and hilarious) paper from the Hash Man himself - \
http://analytics.ncsu.edu/sesug/2005/SER04_05.PDF

 

The approach described works well for assignments to the RIGHT of the = sign.  But \
falls over when assigning to the left.  I followed the approach of using a CALL \
routine and had quite some success with POKELONG - until, this happened:

 

getitemn: listid=51 index=1 value=. rc=0 dsid=1 <<<< LOG NOTE

ERROR: Domain error.

ERROR: Termination due to Floating Point Exception

 

My actual code is below:

 

    __baftemp__i=nameditem(&src,"%upcase(&&var&x)"); /* index */

    if itemtype(&src,__baftemp__i)='C' then

      call pokelong(getitemc(&src,__baftemp__i), addrlong(&methodvar));

    else call pokelong(getitemn(&src,__baftemp__i), addrlong(&methodvar),8,2);

    /*

    if itemtype(&src,__baftemp__i)='C' then &methodvar=getitemc(&src,__baftemp__i);

    else &methodvar=getitemn(&src,__baftemp__i);

    */

 

I presume it fell over due to the missing value returned from my custom getitemn() \
function.  Either that or I should not be hardoding "2" as my floating point value?

 

/Allan

 

On 29 June 2017 at 19:09, Fried Egg <fried.egg@verizon.net \
<mailto:fried.egg@verizon.net> > wrote:

Joe already provided an example of what I had suggested, but to tie that together \
with the additional description of your specific scenario, here is another example

 

proc fcmp outlib=work.func.x;

subroutine x4c(c $);

file log;

put c=;

endsub;

 

subroutine x4n(n);

file log;

put n=;

endsub;

quit;

 

options cmplib=work.func;

 

%macro foobar(var,val);

      data _null_/note2err;

            &var = &val;

 

            if vtype(&var)='C' 

                  then call x4c(      peekclong(addrlong(&var),vlength(&var))      );

                  else call x4n(input(peekclong(addrlong(&var),8            ),rb8.));

      run;

%mend;

%foobar(SOMEANONYMOUSVAR,666)

%foobar(SOMEANONYMOUSVAR,'666')

 

 

From: SAS(r) Discussion [mailto:SAS-L@LISTSERV.UGA.EDU \
                <mailto:SAS-L@LISTSERV.UGA.EDU> ] On Behalf Of Allan Bowe
Sent: Thursday, June 29, 2017 1:51 PM
To: SAS-L@LISTSERV.UGA.EDU <mailto:SAS-L@LISTSERV.UGA.EDU> 
Subject: Re: how not 2 err

 

By Jove - I think you've cracked it.

 

Fried Egg - hat's off!

 

To give context.  My code generator (macro) injects logic into a data step in order \
to dynamically load calculated variables into associated (strongly typed) fcmp \
functions - char to char, numeric to numeric.

 

This prepares variables for use within a nested routine (previously a 'run_macro' but \
moving forward 'dosubl' due to persistent and strange errors with the former).

 

Appreciated.  The pedant in me is pleased.  The realist wonders it it is best. not to \
not2err in the first place.

 

/Allan

 

On 29 June 2017 at 18:16, Joe Matise <snoopy369@gmail.com \
<mailto:snoopy369@gmail.com> > wrote:

Allan,

I think you just need to give us some more context.  I'm quite confident that it's \
possible to do what you're trying to do here.  The problem is that right now you've \
presented us a moving target because there's not enough complexity in your example.

 

I assume it is not *just* a matter of making a character variable - since that has an \
obvious solution (that Dan Nordlund provided shortly before your reply - CATS or \
similar function).  What other kinds of issues are you imagining may occur?

 

It's possible (in fact, likely) that this would be handled on the code generation \
end, rather than in the final datastep, depending on exactly what your code generator \
is doing.  After all, the code generator should be able to divine whether a variable \
it creates is character or numeric (or using VTYPE or macro equivalents can find \
out).  So you handle all of this on that end - in the macro that produces the code, \
using conditional logic.

 

It's also possible that you work around this by creating temporary variables of known \
(character) type (using CATS), and then working with them (again, in a known type at \
this point).  That depends on your numeric variables being of a nature that can \
safely be ported to character (so not floating point with high precision) to not get \
overly complex, but it's manageable in any event.

 

One example of this, not using CATS (even though it would be the far, far simpler \
answer here), is indeed using PEEKCLONG/CALL POKELONG, which has the advantage of \
copying information from one place to another without caring about type (or rather, \
it's always copying character information, even when it's copying the numerics, since \
it's copying the bytes as-is).  I think there might be a simpler answer than this \
one, but this is at least a start.  

 

options missing=' ';

data _null_ / note2err;

  somevar=1;

  vtype=vtype(somevar);

  addr_somevar = addrlong(somevar);

  test_c='       ';

  test_n=.;

  if vtype = 'N' then do;

 test_n=.;

 addr_test = addrlong(test_n);  

 call pokelong(peekclong(addr_somevar,8),addr_test);

  end;

  else do;

      test_c = '        ';

 addr_test = addrlong(test_c);

 call pokelong(peekclong(addr_somevar,8),addr_test);

  end;

  test = ' '||put(test_n,8.)||test_c;   *of course CATS would make more sense here, \
but it would also make the whole thing pointless;

  put test=;

run;

 

 

Of course, again, CATS is far simpler.  

 

-Joe

 

 

On Thu, Jun 29, 2017 at 11:39 AM, Allan Bowe <allnbowe@gmail.com \
<mailto:allnbowe@gmail.com> > wrote:

Quentin - thanks for the suggestion, I know exactly what kind of macro you mean \
(https://rawsas.github.io/coredoc/mf__getvartype_8sas.html), the problem is that this \
variable is calculated at runtime (so it isn't read in from a dataset).

 

Roger - great solution except it still doesn't allow one to dynamically allocate  the \
output variable depending on type - and hence avoid the conversion NOTE in the log.

 

Fried Egg - I peeked at those functions but was none the wiser!

 

It would appear that the only way would be for one to carefully avoid using those all \
the functions / approaches that would cause these kind of notes in the log at \
compilation time.   This is kind of revealing - for some reason I'd always thought \
those notes were generated at runtime.  But compilation time is much more logical.   

 

DATA _null_;  

  set _null_;

  

  SOMEANONYMOUSVAR= 666 ;

 

  if vtype(SOMEANONYMOUSVAR)="C" then do;

       rc=''!!SOMEANONYMOUSVAR;

       putlog 'NOTE: no conversion notes please';

  end;

 

  else if vtype(SOMEANONYMOUSVAR)="N" then do;

       rc=''!! SOMEANONYMOUSVAR;

       putlog 'NOTE: no conversion notes, thankyou';

  end;

 

run;

 

 

/Allan

 

On 29 June 2017 at 16:14, Quentin McMullen <qmcmullen.sas@gmail.com \
<mailto:qmcmullen.sas@gmail.com> > wrote:

Hi Allan,

Is the variable SOMEVAR really being created in that step, or is it a variable read \
from another dataset?

Assuming it's being read (or computed from a variable that is being read from a \
source), then I would probably make a %VTYPE function-style macro (they're no doubt \
around, the old ones would use SCL functions, but DOSUBL is an attractive \
alternative).

So that you could do something like:

%if %vtype(data=somedata,var=somevar)=C %then %do;
  test=somevar;
%end;
%else %do;
  test=put(somevar,8.);
%end;

Happy to see that Roland Rashleigh-Berry's macro library is still up.  He has a \
%vartype macro that I would suspect uses SCL, as it predates DOSUBL:

http://www.datasavantconsulting.com/roland/Spectre/maclist2.html

Kind Regards,
--Q.


On Thu, 29 Jun 2017 13:28:01 +0100, Allan Bowe <allnbowe@GMAIL.COM \
<mailto:allnbowe@GMAIL.COM> > wrote:

> WANT:
> 
> To be 'squeaky clean'
> 
> HAVE:
> 
> 
> data _null_ / note2err;
> somevar=1;
> vtype=vtype(somevar);
> if vtype="C" then test=''!!somevar;
> else test=''!!put(somevar,8.);
> run;
> 
> 
> EXPLANATION:
> 
> My application generates data step code on the fly, and so must perform
> conditional logic to run appropriate functions depending on the variable
> *type*.  This generates conversion notes in the log, *even when those
> conversions are not happening*.

> 
> Is there any way to cheat the system?  We have no prior knowledge of the
> dataset or the variables in question..
> 
> /Allan
> 

 

 

 

 

 


[Attachment #3 (text/html)]

<html xmlns:o="urn:schemas-microsoft-com:office:office" \
xmlns:w="urn:schemas-microsoft-com:office:word" \
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" \
xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type \
content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 \
(filtered medium)"><style><!-- /* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:12.0pt;
	font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:purple;
	text-decoration:underline;}
span.hoenzb
	{mso-style-name:hoenzb;}
span.m523326540528639992m5721107131949264403m-5557563758121565344gmail-apple-tab-span
	{mso-style-name:m_523326540528639992m_5721107131949264403m-5557563758121565344gmail-apple-tab-span;}
 span.m523326540528639992m5721107131949264403m-5557563758121565344m-7517148111494795099gmail-
  {mso-style-name:m_523326540528639992m_5721107131949264403m-5557563758121565344m-7517148111494795099gmail-;}
 span.EmailStyle20
	{mso-style-type:personal;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
span.EmailStyle21
	{mso-style-type:personal-compose;
	font-family:"Calibri","sans-serif";
	color:windowtext;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-family:"Calibri","sans-serif";}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
	{page:WordSection1;}
--></style></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Your other \
option would be to convert the result of GETITEMN to real binary data using the RBw.d \
Format, then even if the value is missing, you would not get the error you were \
seeing.<o:p></o:p></span></p><p class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal style='text-autospace:none'><span \
style='font-size:11.0pt;font-family:"Courier New";color:black;background:white'>      \
__baftemp__i=nameditem(&amp;src,</span><span \
style='font-size:11.0pt;font-family:"Courier \
New";color:purple;background:white'>&quot;%upcase(&amp;&amp;var&amp;x)&quot;</span><span \
style='font-size:11.0pt;font-family:"Courier \
New";color:black;background:white'>);<o:p></o:p></span></p><p class=MsoNormal \
style='text-autospace:none'><span style='font-size:11.0pt;font-family:"Courier \
New";color:black;background:white'>       </span><span \
style='font-size:11.0pt;font-family:"Courier \
New";color:red;background:white'>if</span><span \
style='font-size:11.0pt;font-family:"Courier New";color:black;background:white'> \
itemtype(&amp;src,__baftemp__i)=</span><span \
style='font-size:11.0pt;font-family:"Courier \
New";color:purple;background:white'>'C'</span><span \
style='font-size:11.0pt;font-family:"Courier New";color:black;background:white'> \
<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span \
style='font-size:11.0pt;font-family:"Courier New";color:black;background:white'>      \
then call pokelong(getitemc(&amp;src,__baftemp__i), addrlong(&amp;methodvar), \
vlength(&amp;methodvar));<o:p></o:p></span></p><p class=MsoNormal \
style='text-autospace:none'><span style='font-size:11.0pt;font-family:"Courier \
New";color:black;background:white'>               </span><span \
style='font-size:11.0pt;font-family:"Courier \
New";color:red;background:white'>else</span><span \
style='font-size:11.0pt;font-family:"Courier New";color:black;background:white'> call \
pokelong(put(getitemn(&amp;src,__baftemp__i),</span><span \
style='font-size:11.0pt;font-family:"Courier \
New";color:teal;background:white'>rb8.</span><span \
style='font-size:11.0pt;font-family:"Courier New";color:black;background:white'>), \
addrlong(&amp;methodvar),</span><b><span style='font-size:11.0pt;font-family:"Courier \
New";color:teal;background:white'>8</span></b><span \
style='font-size:11.0pt;font-family:"Courier \
New";color:black;background:white'>);<o:p></o:p></span></p><p class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I would \
still utilize the length attribute (unless you know getitemc could never go beyond \
the length of &amp;methodvar), but the floating-point attribute would not be helpful \
here.<o:p></o:p></span></p><p class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><b><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>From:</span></b><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif"'> Allan Bowe \
[mailto:allnbowe@gmail.com] <br><b>Sent:</b> Friday, June 30, 2017 12:31 \
PM<br><b>To:</b> Fried Egg<br><b>Cc:</b> SAS-L@LISTSERV.UGA.EDU<br><b>Subject:</b> \
Re: how not 2 err<o:p></o:p></span></p><p \
class=MsoNormal><o:p>&nbsp;</o:p></p><div><p class=MsoNormal>@Joe - you were correct \
to omit the length / floating point attributes, that did the trick along with a \
specific test for a missing value:<o:p></o:p></p><div><p \
class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><div><p class=MsoNormal>&nbsp; %else \
%if %length(&amp;&amp;var&amp;x)&gt;0 %then %do;<o:p></o:p></p></div><div><p \
class=MsoNormal>&nbsp; &nbsp; \
__baftemp__i=nameditem(&amp;src,&quot;%upcase(&amp;&amp;var&amp;x)&quot;); /* index \
*/<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp; &nbsp; if \
itemtype(&amp;src,__baftemp__i)='C' then<o:p></o:p></p></div><div><p \
class=MsoNormal>&nbsp; &nbsp; &nbsp; call pokelong(getitemc(&amp;src,__baftemp__i), \
addrlong(&amp;methodvar));<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp; &nbsp; \
else if getitemn(&amp;src,__baftemp__i)=. then call \
missing(&amp;methodvar);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp; &nbsp; \
else call pokelong(getitemn(&amp;src,__baftemp__i), \
addrlong(&amp;methodvar));<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp; &nbsp; \
/*<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp; &nbsp; if \
itemtype(&amp;src,__baftemp__i)='C' then \
&amp;methodvar=getitemc(&amp;src,__baftemp__i);<o:p></o:p></p></div><div><p \
class=MsoNormal>&nbsp; &nbsp; else \
&amp;methodvar=getitemn(&amp;src,__baftemp__i);<o:p></o:p></p></div><div><p \
class=MsoNormal>&nbsp; &nbsp; */<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp; \
%end;<o:p></o:p></p></div></div></div><div><p \
class=MsoNormal><o:p>&nbsp;</o:p></p><div><p class=MsoNormal>On 30 June 2017 at \
16:51, Allan Bowe &lt;<a href="mailto:allnbowe@gmail.com" \
target="_blank">allnbowe@gmail.com</a>&gt; wrote:<o:p></o:p></p><blockquote \
style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in \
6.0pt;margin-left:4.8pt;margin-right:0in'><div><p class=MsoNormal>@Fried Egg - thanks \
for this, I made some headway.&nbsp; Also, after reviewing this insightful (and \
hilarious) paper from the Hash Man himself -&nbsp;<a \
href="http://analytics.ncsu.edu/sesug/2005/SER04_05.PDF" \
target="_blank">http://analytics.ncsu.edu/sesug/2005/SER04_05.PDF</a><o:p></o:p></p><div><div><p \
class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>The approach \
described works well for assignments to the RIGHT of the = sign.&nbsp; But falls over \
when assigning to the left.&nbsp; I followed the approach of using a CALL routine and \
had quite some success with POKELONG - until, this \
happened:<o:p></o:p></p></div><div><p \
class=MsoNormal><o:p>&nbsp;</o:p></p></div></div><blockquote \
style='margin-left:30.0pt;margin-right:0in'><div><div><div><p class=MsoNormal><span \
style='font-family:Consolas;color:black'>getitemn: listid=51 index=1 value=. rc=0 \
dsid=1 &lt;&lt;&lt;&lt; LOG \
NOTE<o:p></o:p></span></p></div></div></div><div><div><div \
id="m_523326540528639992gmail-sasLogError3_1498837296886"><p class=MsoNormal \
style='background:#C5CED8'><span style='font-family:Consolas;color:red'>ERROR: Domain \
error.<o:p></o:p></span></p></div></div></div><div><div><div \
id="m_523326540528639992gmail-sasLogError4_1498837296886"><p class=MsoNormal><span \
style='font-family:Consolas;color:red'>ERROR: Termination due to Floating Point \
Exception<o:p></o:p></span></p></div></div></div></blockquote><div><div><p \
class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>My actual code is \
below:<o:p></o:p></p></div><div><p \
class=MsoNormal><o:p>&nbsp;</o:p></p></div><blockquote \
style='margin-left:30.0pt;margin-right:0in'><div><div><p class=MsoNormal>&nbsp; \
&nbsp; __baftemp__i=nameditem(&amp;src,&quot;%upcase(&amp;&amp;var&amp;x)&quot;); /* \
index */<o:p></o:p></p></div></div><div><div><p class=MsoNormal>&nbsp; &nbsp; if \
itemtype(&amp;src,__baftemp__i)='C' then<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal>&nbsp; &nbsp; &nbsp; call pokelong(getitemc(&amp;src,__baftemp__i), \
addrlong(&amp;methodvar));<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal>&nbsp; &nbsp; else call pokelong(getitemn(&amp;src,__baftemp__i), \
addrlong(&amp;methodvar),8,2);<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal>&nbsp; &nbsp; /*<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal>&nbsp; &nbsp; if itemtype(&amp;src,__baftemp__i)='C' then \
&amp;methodvar=getitemc(&amp;src,__baftemp__i);<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal>&nbsp; &nbsp; else \
&amp;methodvar=getitemn(&amp;src,__baftemp__i);<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal>&nbsp; &nbsp; */<o:p></o:p></p></div></div></blockquote><div><p \
class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>I presume it fell \
over due to the missing value returned from my custom getitemn() function.&nbsp; \
Either that or I should not be hardoding &quot;2&quot; as my floating point \
value?<o:p></o:p></p></div><div><p class=MsoNormal><span \
style='color:#888888'><o:p>&nbsp;</o:p></span></p></div></div><div><p \
class=MsoNormal><span \
style='color:#888888'>/Allan<o:p></o:p></span></p></div></div><div><div><div><p \
class=MsoNormal><o:p>&nbsp;</o:p></p><div><p class=MsoNormal>On 29 June 2017 at \
19:09, Fried Egg &lt;<a href="mailto:fried.egg@verizon.net" \
target="_blank">fried.egg@verizon.net</a>&gt; wrote:<o:p></o:p></p><blockquote \
style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in \
6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Joe already \
provided an example of what I had suggested, but to tie that together with the \
additional description of your specific scenario, here is another \
example</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>&nbsp;</span><o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><b><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:navy;background:white'>proc</span></b><span \
style='font-size:10.0pt;font-family:"Courier New";color:black;background:white'> \
</span><b><span style='font-size:10.0pt;font-family:"Courier \
New";color:navy;background:white'>fcmp</span></b><span \
style='font-size:10.0pt;font-family:"Courier New";color:black;background:white'> \
outlib=work.func.x;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>subroutine x4c(c $);</span><o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier New";color:black;background:white'>file \
log;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier New";color:black;background:white'>put \
c=;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>endsub;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>&nbsp;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>subroutine x4n(n);</span><o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier New";color:black;background:white'>file \
log;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier New";color:black;background:white'>put \
n=;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>endsub;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><b><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:navy;background:white'>quit</span></b><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>&nbsp;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:blue;background:white'>options</span><span \
style='font-size:10.0pt;font-family:"Courier New";color:black;background:white'> \
</span><span style='font-size:10.0pt;font-family:"Courier \
New";color:blue;background:white'>cmplib</span><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>=work.func;</span><o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>&nbsp;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><b><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:navy;background:white'>%macro</span></b><span \
style='font-size:10.0pt;font-family:"Courier New";color:black;background:white'> \
foobar(var,val);</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data \
_null_/note2err;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'><span \
style='font-size:10.0pt;font-family:"Courier \
New";color:black;background:white'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic