[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> </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(&src,</span><span \
style='font-size:11.0pt;font-family:"Courier \
New";color:purple;background:white'>"%upcase(&&var&x)"</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(&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(&src,__baftemp__i), addrlong(&methodvar), \
vlength(&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(&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(&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> </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 &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> </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> </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> </o:p></p></div><div><div><p class=MsoNormal> %else \
%if %length(&&var&x)>0 %then %do;<o:p></o:p></p></div><div><p \
class=MsoNormal> \
__baftemp__i=nameditem(&src,"%upcase(&&var&x)"); /* index \
*/<o:p></o:p></p></div><div><p class=MsoNormal> if \
itemtype(&src,__baftemp__i)='C' then<o:p></o:p></p></div><div><p \
class=MsoNormal> call pokelong(getitemc(&src,__baftemp__i), \
addrlong(&methodvar));<o:p></o:p></p></div><div><p class=MsoNormal> \
else if getitemn(&src,__baftemp__i)=. then call \
missing(&methodvar);<o:p></o:p></p></div><div><p class=MsoNormal> \
else call pokelong(getitemn(&src,__baftemp__i), \
addrlong(&methodvar));<o:p></o:p></p></div><div><p class=MsoNormal> \
/*<o:p></o:p></p></div><div><p class=MsoNormal> if \
itemtype(&src,__baftemp__i)='C' then \
&methodvar=getitemc(&src,__baftemp__i);<o:p></o:p></p></div><div><p \
class=MsoNormal> else \
&methodvar=getitemn(&src,__baftemp__i);<o:p></o:p></p></div><div><p \
class=MsoNormal> */<o:p></o:p></p></div><div><p class=MsoNormal> \
%end;<o:p></o:p></p></div></div></div><div><p \
class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>On 30 June 2017 at \
16:51, Allan Bowe <<a href="mailto:allnbowe@gmail.com" \
target="_blank">allnbowe@gmail.com</a>> 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. Also, after reviewing this insightful (and \
hilarious) paper from the Hash Man himself - <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> </o:p></p></div><div><p class=MsoNormal>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:<o:p></o:p></p></div><div><p \
class=MsoNormal><o:p> </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 <<<< 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> </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> </o:p></p></div><blockquote \
style='margin-left:30.0pt;margin-right:0in'><div><div><p class=MsoNormal> \
__baftemp__i=nameditem(&src,"%upcase(&&var&x)"); /* \
index */<o:p></o:p></p></div></div><div><div><p class=MsoNormal> if \
itemtype(&src,__baftemp__i)='C' then<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal> call pokelong(getitemc(&src,__baftemp__i), \
addrlong(&methodvar));<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal> else call pokelong(getitemn(&src,__baftemp__i), \
addrlong(&methodvar),8,2);<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal> /*<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal> if itemtype(&src,__baftemp__i)='C' then \
&methodvar=getitemc(&src,__baftemp__i);<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal> else \
&methodvar=getitemn(&src,__baftemp__i);<o:p></o:p></p></div></div><div><div><p \
class=MsoNormal> */<o:p></o:p></p></div></div></blockquote><div><p \
class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>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?<o:p></o:p></p></div><div><p class=MsoNormal><span \
style='color:#888888'><o:p> </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> </o:p></p><div><p class=MsoNormal>On 29 June 2017 at \
19:09, Fried Egg <<a href="mailto:fried.egg@verizon.net" \
target="_blank">fried.egg@verizon.net</a>> 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'> </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'> </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'> </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'> </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'> 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'> \
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic