<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent? in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650464#M195037</link>
    <description>&lt;P&gt;Thank you FreelanceReinhard for pointing out my error!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Nonetheless, my point still stands with counting to 1 by tenths:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;99   data _null_;
100    sum = 0;
101    one = 1;
102    do i = 1 to 12;
103      sum = sum + 1/10;
104      if sum = one then
105         put 'got to ' one '(' one hex16. '), '
106              sum= '(hex16: ' sum hex16. ')';
107      else put 'still not ' one '(hex16:' one hex16. '), '
108               sum= '(hex16: ' sum hex16. ')'
109               ;
110    end;
111  run;

still not 1 (hex16:3FF0000000000000), sum=0.1 (hex16: 3FB999999999999A)
still not 1 (hex16:3FF0000000000000), sum=0.2 (hex16: 3FC999999999999A)
still not 1 (hex16:3FF0000000000000), sum=0.3 (hex16: 3FD3333333333334)
still not 1 (hex16:3FF0000000000000), sum=0.4 (hex16: 3FD999999999999A)
still not 1 (hex16:3FF0000000000000), sum=0.5 (hex16: 3FE0000000000000)
still not 1 (hex16:3FF0000000000000), sum=0.6 (hex16: 3FE3333333333333)
still not 1 (hex16:3FF0000000000000), sum=0.7 (hex16: 3FE6666666666666)
still not 1 (hex16:3FF0000000000000), sum=0.8 (hex16: 3FE9999999999999)
still not 1 (hex16:3FF0000000000000), sum=0.9 (hex16: 3FECCCCCCCCCCCCC)
&lt;FONT color="#000000"&gt;still not 1 (hex16:&lt;FONT color="#FF0000"&gt;3FF0000000000000&lt;/FONT&gt;), sum=1 (hex16: &lt;FONT color="#FF0000"&gt;3FEFFFFFFFFFFFFF&lt;/FONT&gt;)&lt;/FONT&gt;      &lt;FONT color="#FF0000"&gt;&lt;STRONG&gt;&amp;lt;=== eeeerrp !!&lt;/STRONG&gt;&lt;/FONT&gt;
still not 1 (hex16:3FF0000000000000), sum=1.1 (hex16: 3FF1999999999999)
still not 1 (hex16:3FF0000000000000), sum=1.2 (hex16: 3FF3333333333333)
&lt;/PRE&gt;
&lt;P&gt;&lt;EM&gt;(Hopefully I'm better at counting to 1 by tenths, compared with thirds &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/EM&gt;&lt;/P&gt;</description>
    <pubDate>Mon, 25 May 2020 15:04:40 GMT</pubDate>
    <dc:creator>GGO</dc:creator>
    <dc:date>2020-05-25T15:04:40Z</dc:date>
    <item>
      <title>NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650187#M194983</link>
      <description>&lt;P&gt;%SYSFUNC( &lt;EM&gt;DATA-STEP-FUNC(_null_string_) &lt;/EM&gt;) behavior seems inconsistent to me.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Any explanation?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Useful References:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://go.documentation.sas.com/?cdcId=pgmsascdc&amp;amp;cdcVersion=9.4_3.5&amp;amp;docsetId=mcrolref&amp;amp;docsetTarget=p1o13d7wb2zfcnn19s5ssl2zdxvi.htm&amp;amp;locale=en#p042zwonm5lxybn1fg1sfdszirpw" target="_self"&gt;%SYSFUNC() doc&lt;/A&gt; - Note the note that "an empty argument position &lt;STRONG&gt;will not generate a NULL argument, but a zero length argument.&lt;/STRONG&gt;"&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://communities.sas.com/t5/SAS-Programming/prxchange-within-sysfunc/m-p/40953/highlight/true#M8388" target="_self"&gt;This prior (but 2010!) detailed explanation of %SYSFUNC()&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;More below, after demo code&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Demo code:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro test_null_string_handling(str);
  %if %length(%sysfunc(TRIMN(&amp;amp;str))) &amp;gt; 0 %then
      %put TRIMN() TEST - NON-ZERO STRING LENGTH. String is [&amp;amp;str];
  %else %put TRIMN() TEST - ZERO STRING LENGTH. String is [&amp;amp;str];

  %if %length(%sysfunc(STRIP(&amp;amp;str))) &amp;gt; 0 %then
      %put STRIP() TEST - NON-ZERO STRING LENGTH. String is [&amp;amp;str];
  %else %put STRIP() TEST - ZERO STRING LENGTH. String is [&amp;amp;str];

  %if %length(%sysfunc(COMPRESS(&amp;amp;str,,s))) &amp;gt; 0 %then
      %put COMPRESS() TEST - NON-ZERO STRING LENGTH. String is [&amp;amp;str];
  %else %put COMPRESS() TEST - ZERO STRING LENGTH. String is [&amp;amp;str];

  %if %sysfunc(PRXMATCH(m/\S/i,&amp;amp;str)) &amp;gt; 0 %then
      %put PRXMATCH() TEST - NON-ZERO STRING LENGTH. String is [&amp;amp;str];
  %else %put PRXMATCH() TEST - ZERO STRING LENGTH. String is [&amp;amp;str];
%mend test_null_string_handling;


%test_null_string_handling(%str())
%test_null_string_handling(%str( ))
%test_null_string_handling(one)
%test_null_string_handling( )&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Log result:&lt;/P&gt;
&lt;PRE&gt;TRIMN() TEST - ZERO STRING LENGTH. String is []
STRIP() TEST - ZERO STRING LENGTH. String is []
COMPRESS() TEST - ZERO STRING LENGTH. String is []
PRXMATCH() TEST - ZERO STRING LENGTH. String is []
319  %test_null_string_handling(%str( ))
TRIMN() TEST - ZERO STRING LENGTH. String is [ ]
STRIP() TEST - ZERO STRING LENGTH. String is [ ]
COMPRESS() TEST - ZERO STRING LENGTH. String is [ ]
PRXMATCH() TEST - ZERO STRING LENGTH. String is [ ]
320  %test_null_string_handling(one)
TRIMN() TEST - NON-ZERO STRING LENGTH. String is [one]
STRIP() TEST - NON-ZERO STRING LENGTH. String is [one]
COMPRESS() TEST - NON-ZERO STRING LENGTH. String is [one]
PRXMATCH() TEST - NON-ZERO STRING LENGTH. String is [one]
321  %test_null_string_handling( )
&lt;FONT color="#FF0000"&gt;ERROR: The function TRIMN referenced by the %SYSFUNC or %QSYSFUNC macro function has too few arguments.&lt;/FONT&gt;
TRIMN() TEST - ZERO STRING LENGTH. String is []
&lt;FONT color="#FF0000"&gt;ERROR: The function STRIP referenced by the %SYSFUNC or %QSYSFUNC macro function has too few arguments.&lt;/FONT&gt;
STRIP() TEST - ZERO STRING LENGTH. String is []
COMPRESS() TEST - ZERO STRING LENGTH. String is []
PRXMATCH() TEST - ZERO STRING LENGTH. String is []
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;QUESTION:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Why do TRIMN() and STRIP() choke on a null string and throw an ERROR, but COMPRESS() and PRXMATCH() do not?&lt;/LI&gt;
&lt;LI&gt;How should we know whether a DATA STEP function in %SYSFUNC() handles null strings, and for which arguments?&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;I'm missing something fundamental. Thanks for any help figuring out what that is &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A few further details from the doc pages of these 4 functions:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://go.documentation.sas.com/?cdcId=pgmsascdc&amp;amp;cdcVersion=9.4_3.5&amp;amp;docsetId=lefunctionsref&amp;amp;docsetTarget=p0fn8wnffjgx33n1smsu5a6d00rs.htm&amp;amp;locale=en" target="_self"&gt;TRIMN&lt;/A&gt;: "TRIMN returns a string with a length of zero for a blank string."&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://go.documentation.sas.com/?cdcId=pgmsascdc&amp;amp;cdcVersion=9.4_3.5&amp;amp;docsetId=lefunctionsref&amp;amp;docsetTarget=n0xk6tl87f4b4qn1sp1ywen1ntan.htm&amp;amp;locale=en" target="_self"&gt;STRIP&lt;/A&gt;: "For strings that are blank, the STRIP and TRIMN functions return a string with a length of zero" - Note that in the test, above, TRIM() also throws the ERROR.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://go.documentation.sas.com/?cdcId=pgmsascdc&amp;amp;cdcVersion=9.4_3.5&amp;amp;docsetId=lefunctionsref&amp;amp;docsetTarget=n0fcshr0ir3h73n1b845c4aq58hz.htm&amp;amp;locale=en" target="_self"&gt;COMPRESS&lt;/A&gt;: "COMPRESS function allows null arguments."&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://go.documentation.sas.com/?cdcId=pgmsascdc&amp;amp;cdcVersion=9.4_3.5&amp;amp;docsetId=lefunctionsref&amp;amp;docsetTarget=n0bj9p4401w3n9n1gmv6tf**bleep**9m.htm&amp;amp;locale=en" target="_self"&gt;PRXMATCH&lt;/A&gt;: &lt;STRONG&gt;No mention&lt;/STRONG&gt; of null or blank arguments. But it does not choke on them.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Thanks!&lt;/P&gt;</description>
      <pubDate>Sun, 24 May 2020 15:02:44 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650187#M194983</guid>
      <dc:creator>GGO</dc:creator>
      <dc:date>2020-05-24T15:02:44Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650201#M194989</link>
      <description>&lt;P&gt;I am not sure what you think you are testing.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Remember that once the macro variables are resolved it just like you typed the code without the macro variables. So that first test is nonsensical.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%sysfunc(trimn())&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Why would call TRIMN() with NO input?&amp;nbsp; &amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 24 May 2020 18:14:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650201#M194989</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2020-05-24T18:14:16Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650203#M194990</link>
      <description>&lt;P&gt;%SYSFUNC() has a lot of trouble because it is doing a lot more work than the data step compiler. In a data step the compiler knows what type of value it is dealing with.&amp;nbsp; In macro world everything thing is a string. And many data step functions (like the CAT series) can use both numeric an character inputs for the same argument.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As to your test with empty strings you should be able to use macro quoting to prevent at some of those errors. At least then %SYSFUNC() is getting something instead of nothing at all.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let x=;
%put |%sysfunc(trimn(&amp;amp;x))|;
%put |%sysfunc(trimn(%superq(x)))|;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;PS For a review of methods to test of empty strings see this classic paper by Chung and our own&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/15410"&gt;@data_null__&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.sas.com/resources/papers/proceedings09/022-2009.pdf" target="_blank"&gt;https://support.sas.com/resources/papers/proceedings09/022-2009.pdf&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Sun, 24 May 2020 18:33:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650203#M194990</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2020-05-24T18:33:22Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650206#M194991</link>
      <description>&lt;P&gt;Macro code is dynamic&lt;/P&gt;</description>
      <pubDate>Sun, 24 May 2020 18:51:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650206#M194991</guid>
      <dc:creator>GGO</dc:creator>
      <dc:date>2020-05-24T18:51:05Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650209#M194992</link>
      <description>Understood, Tom, and thanks for digging in.&lt;BR /&gt;&lt;BR /&gt;Macro code is intended to handle dynamic inputs. If a particular usage reduces to a trivial input (a null string), why should some DATA STEP functions breeze right through these, while others throw errors?&lt;BR /&gt;&lt;BR /&gt;I'm trying to understand this fundamental difference in DATA STEP functions, so that I can know when extra defensive programming is needed in macro - e.g., to avoid passing NULL STRINGS to DATA STEP functions.&lt;BR /&gt;&lt;BR /&gt;Thanks!</description>
      <pubDate>Sun, 24 May 2020 18:54:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650209#M194992</guid>
      <dc:creator>GGO</dc:creator>
      <dc:date>2020-05-24T18:54:09Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650212#M194995</link>
      <description>&lt;P&gt;I think the explanation is that you do not call COMPRESS and PRXMATCH with the wrong number of arguments. You call COMPRESS(&amp;amp;str,,s), which becomes COMPRESS(,,s). %SYSFUNC sees 3 arguments delimited by commas, two empty ones and one non-empty.&amp;nbsp; Similar for PRXMATCH, the call becomes&amp;nbsp;PRXMATCH(m/\S/i,), the comma makes %SYSFUNC see two arguments, one of which is an empty string.&lt;/P&gt;</description>
      <pubDate>Sun, 24 May 2020 19:34:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650212#M194995</guid>
      <dc:creator>s_lassen</dc:creator>
      <dc:date>2020-05-24T19:34:27Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650221#M195000</link>
      <description>&lt;P&gt;I agree with&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/76464"&gt;@s_lassen&lt;/a&gt;&amp;nbsp;; functions called by %SYSFUNC need at least one argument, even if the value of the argument is null.&amp;nbsp; The argument cannot be empty.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In the DATA step language, all of the below error, because the function call has no arguments:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data _null_ ;
  x=trimn() ;
  x=upcase() ;
  x=strip() ;
  x=compress() ;
run ;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;If you want to pass a null value to a function in the DATA step language, you can do it like:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data _null_ ;
  x=trimn("") ;
  x=upcase("") ;
  x=strip("") ;
  x=compress("") ;
run ;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;In the macro language calling a function via %SYSFUNC, all of the below error, because the function call has no arguments:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%put %sysfunc(trimn()) ;
%put %sysfunc(upcase()) ;
%put %sysfunc(strip()) ;
%put %sysfunc(compress()) ;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;If you want to pass a null value to a macro language function called via %SYSFUNC, you can do it like:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%put %sysfunc(trimn(%str())) ;
%put %sysfunc(upcase(%str())) ;
%put %sysfunc(strip(%str())) ;
%put %sysfunc(compress(%str())) ;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;I see the above as consistent.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As for the %SYSFUNC docs, I'm not sure how to understand the bit you quote: "&lt;SPAN&gt;In particular, an empty argument position will not generate a NULL argument, but a zero length argument." I'm not sure what they are meaning for the difference between a null argument and a zero length argument.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Note that the error message caused by an empty function argument is coming from %SYSFUNC, not from the called function.&amp;nbsp; And if you read the documentation for %SYSFUNC, it defines the arguments to the function as "&lt;/SPAN&gt;&lt;SPAN style="font-family: inherit; font-size: 16px;"&gt;&lt;STRONG&gt;one or more&lt;/STRONG&gt; arguments used by&lt;/SPAN&gt;&lt;SPAN style="font-family: inherit; font-size: 16px;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM class="xisDoc-definedTerm" style="font-family: inherit; font-size: 16px;"&gt;function&lt;/EM&gt;&lt;SPAN style="font-family: inherit; font-size: 16px;"&gt;."&amp;nbsp; So basically, %SYSFUNC must have &lt;STRONG&gt;something&lt;/STRONG&gt; to pass to the function, it does not allow zero arguments.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;For functions like COMPRESS, which accept an optional comma as a delimiter for multiple arguments, you can even pass just the comma:&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;47   %put &amp;gt;&amp;gt;%sysfunc(compress(,))&amp;lt;&amp;lt; ;
&amp;gt;&amp;gt;&amp;lt;&amp;lt;
&lt;/PRE&gt;
&lt;P&gt;&lt;SPAN&gt;In that case, I think %SYSFUNC is happy because it sees the comma so it has something it can pass to compress.&amp;nbsp; Then compress is happy, because it gets the comma, and says&amp;nbsp; "oh, I got passed two null arguments, and I'm good with that."&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Sun, 24 May 2020 21:38:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650221#M195000</guid>
      <dc:creator>Quentin</dc:creator>
      <dc:date>2020-05-24T21:38:27Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650223#M195001</link>
      <description>&lt;P&gt;&lt;FONT color="#008000"&gt;&lt;STRONG&gt;&lt;EM&gt;corrected, based on final, comprehensive insights. -GGO&lt;/EM&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks to all for these insights. I still do not yet see a&amp;nbsp; suitable explanation. My original test calls all have the right number of arguments. Some arguments are simply NULL STRINGS.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This makes it more explicit, but the results are the same:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro test_null_string_handling(str=);
  %if %length(%sysfunc(TRIMN(&amp;amp;str))) &amp;gt; 0 %then
      %put TRIMN() TEST - NON-ZERO STRING LENGTH. String is [&amp;amp;str];
  %else %put TRIMN() TEST - ZERO STRING LENGTH. String is [&amp;amp;str];

  %if %length(%sysfunc(STRIP(&amp;amp;str))) &amp;gt; 0 %then
      %put STRIP() TEST - NON-ZERO STRING LENGTH. String is [&amp;amp;str];
  %else %put STRIP() TEST - ZERO STRING LENGTH. String is [&amp;amp;str];

  %if %length(%sysfunc(COMPRESS(&amp;amp;str,,s))) &amp;gt; 0 %then
      %put COMPRESS() TEST - NON-ZERO STRING LENGTH. String is [&amp;amp;str];
  %else %put COMPRESS() TEST - ZERO STRING LENGTH. String is [&amp;amp;str];

  %if %sysfunc(PRXMATCH(m/\S/i,&amp;amp;str)) &amp;gt; 0 %then
      %put PRXMATCH() TEST - NON-ZERO STRING LENGTH. String is [&amp;amp;str];
  %else %put PRXMATCH() TEST - ZERO STRING LENGTH. String is [&amp;amp;str];
%mend test_null_string_handling;

%test_null_string_handling(str=%str())
%test_null_string_handling(str=%str( ))
%test_null_string_handling(str=one)
%test_null_string_handling
%*;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;Same results&lt;/STRONG&gt;&lt;/P&gt;
&lt;PRE&gt;73   %test_null_string_handling(str=%str())
TRIMN() TEST - ZERO STRING LENGTH. String is []
STRIP() TEST - ZERO STRING LENGTH. String is []
COMPRESS() TEST - ZERO STRING LENGTH. String is []
PRXMATCH() TEST - ZERO STRING LENGTH. String is []
74   %test_null_string_handling(str=%str( ))
TRIMN() TEST - ZERO STRING LENGTH. String is [ ]
STRIP() TEST - ZERO STRING LENGTH. String is [ ]
COMPRESS() TEST - ZERO STRING LENGTH. String is [ ]
PRXMATCH() TEST - ZERO STRING LENGTH. String is [ ]
75   %test_null_string_handling(str=one)
TRIMN() TEST - NON-ZERO STRING LENGTH. String is [one]
STRIP() TEST - NON-ZERO STRING LENGTH. String is [one]
COMPRESS() TEST - NON-ZERO STRING LENGTH. String is [one]
PRXMATCH() TEST - NON-ZERO STRING LENGTH. String is [one]
76   %test_null_string_handling
77   %*;
&lt;FONT color="#FF0000"&gt;ERROR: The function TRIMN referenced by the %SYSFUNC or %QSYSFUNC macro function has too few arguments.&lt;/FONT&gt;
TRIMN() TEST - ZERO STRING LENGTH. String is []
&lt;FONT color="#FF0000"&gt;ERROR: The function STRIP referenced by the %SYSFUNC or %QSYSFUNC macro function has too few arguments.&lt;/FONT&gt;
STRIP() TEST - ZERO STRING LENGTH. String is []
COMPRESS() TEST - ZERO STRING LENGTH. String is []
PRXMATCH() TEST - ZERO STRING LENGTH. String is []&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;These are DIFFERENT errors, not the same error:&lt;/STRONG&gt;&lt;/P&gt;
&lt;PRE&gt;%put %sysfunc(trimn()) ;     /* right number of arguments - NULL STRING ERROR */
%put %sysfunc(upcase()) ;    /* right number of arguments - NULL STRING ERROR */
%put %sysfunc(strip()) ;     /* right number of arguments - NULL STRING ERROR */
%put %sysfunc(compress()) ;  /* &lt;FONT color="#008000"&gt;ONE argument is acceptable&lt;/FONT&gt; - NULL STRING ERROR */&lt;/PRE&gt;
&lt;P&gt;By comparison to TRIMN() and STRIP() - and UPCASE() is apparently another that can't handle NULL STRINGS, &lt;STRONG&gt;COMPRESS() and some others handle the right number of NULL STRING arguments just&lt;/STRONG&gt; fine:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%put %sysfunc(compress(,)) ; /*&lt;FONT color="#008000"&gt; COMMA-DELIM ARGUMENTS&lt;/FONT&gt; - no null string error */&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;A fine result from COMPRESS()&lt;/STRONG&gt; - a null string WITHOUT ANY ERROR.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;92 %put [%sysfunc(compress(,))] ; /* &lt;FONT color="#008000"&gt;COMMA-DELIM ARGUMENTS&lt;/FONT&gt; - no null string error */ []&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;My conclusion remains that DATA STEP functions are not consistent in how they respond to NULL STRINGS when used in %SYSFUNC().&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 17:01:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650223#M195001</guid>
      <dc:creator>GGO</dc:creator>
      <dc:date>2020-05-25T17:01:18Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650228#M195003</link>
      <description>&lt;P&gt;Please re-read&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/19879"&gt;@Quentin&lt;/a&gt;&amp;nbsp;' s answer as I think you did not fully grasp what it was saying.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;That being said I wouldn't bother too much about inconsistencies in SAS syntax. It has a lot of them.&amp;nbsp; But the on one thing that it does do well is maintain backwards compatibility. That is why 30 year old program written for SAS version 6 or earlier can mainly run without errors or even modifications.&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 00:08:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650228#M195003</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2020-05-25T00:08:15Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650232#M195006</link>
      <description>&lt;P&gt;Favoring backwards compatibility over fixing bugs has turned into a huge liability for SAS. Some bold decisions could have assured its future strong position in analytics. Even Excel knows that 1/3 + 1/3 + 1/3 = 1. &lt;STRIKE&gt;SAS still does not. (I've read all of the detailed excuses about numeric precision and representation. None explains why all other tech can count to 1 by thirds.)&lt;/STRIKE&gt;&lt;FONT color="#008000"&gt;&lt;EM&gt; Fixed thanks to FreelanceReinhard, below.&lt;/EM&gt;&lt;/FONT&gt;&lt;STRIKE&gt;&lt;BR /&gt;&lt;/STRIKE&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;145  data _null_;
146    sum = 0;
147    one = 1;
148    do i = 1 to 4;
149      sum = sum + 1/3;
150      if sum = one then
151         put 'got to ' one '(' one hex16. '), '
152              sum= '(hex16: ' sum hex16. ')';
153      else put 'still not ' one '(hex16:' one hex16. '), '
154               sum= '(hex16: ' sum hex16. ')'
155               ;
156    end;
157  run;

still not 1 (hex16:3FF0000000000000), sum=0.3333333333 (hex16: 3FD5555555555555)
still not 1 (hex16:3FF0000000000000), sum=0.6666666667 (hex16: 3FE5555555555555)
got to 1 (3FF0000000000000), sum=1 (hex16: 3FF0000000000000)      &lt;FONT color="#339966"&gt;&amp;lt;== right !&lt;/FONT&gt;
still not 1 (hex16:3FF0000000000000), sum=1.3333333333 (hex16: 3FF5555555555555)

&lt;STRONG&gt;&lt;FONT color="#339966"&gt;FIXED - thanks to FreelanceReinhard, below. Thanks!&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#008000"&gt;FreelanceReinhard, below, is correct! &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#008000"&gt;But my point still stands, below, regarding SAS' inability to count to 10 by tenths. Which Excel and the rest can accomplish.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If Apple had favored bwc over improvement and innovation, we'd still have floppy drives and wired headphone jacks everywhere.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If Google had favored bwc over improved concepts and innovation, we still just have Excel and Word (and Libre immitations).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Tech shouldn't be shackled by past mistakes and past conventions. Python/R make some bold moves between versions. How much has loss of bwc held them back? ( And they can both count to 1 by thirds &lt;span class="lia-unicode-emoji" title=":winking_face:"&gt;😉&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 15:10:47 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650232#M195006</guid>
      <dc:creator>GGO</dc:creator>
      <dc:date>2020-05-25T15:10:47Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650233#M195007</link>
      <description>I understood Quentin's explanation. It does not explain the inconsistencies. In Macro, a null string is a valid argument. %SYSFUNC knows that for some functions.&lt;BR /&gt;&lt;BR /&gt;I think the common failure/bug may be for single-argument functions. %SYSFUNC simply does not acknowledge the open-paren and close-paren as delimiters - only the comma that separates more than one argument. So it could be that this bug only affects single-argument DATA STEP functions. &lt;BR /&gt;&lt;BR /&gt;Just a guess, considering all the insights provided here.</description>
      <pubDate>Mon, 25 May 2020 01:07:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650233#M195007</guid>
      <dc:creator>GGO</dc:creator>
      <dc:date>2020-05-25T01:07:36Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650264#M195009</link>
      <description>&lt;P&gt;This makes the cost of backward compatibility more explicit.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Why in the world should SAS double-down for decades on different internal representation for real numbers (including integers) and separately for integers? At least that's what this looks like to me:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#008000"&gt;&lt;EM&gt;Fixed thanks to FreelanceReinhard, above.&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;171  data _null_;
172    sum = 0;
173    &lt;STRONG&gt;one = 1;&lt;/STRONG&gt;
174    do i = 1 to 11;
175      &lt;STRONG&gt;sum = sum + 1/10;&lt;/STRONG&gt;
176      if sum = one then
177         put 'got to ' one '(' one hex16. '), '
178              sum= '(hex16: ' sum hex16. ')';
179      else put 'still not ' one '(hex16: ' one hex16. '), '
180               sum= '(hex16: ' sum hex16. ')'
181               ;
182    end;
183  run;

still not 1 (hex16: 3FF0000000000000), sum=0.1 (hex16: 3FB999999999999A)
still not 1 (hex16: 3FF0000000000000), sum=0.2 (hex16: 3FC999999999999A)
still not 1 (hex16: 3FF0000000000000), sum=0.3 (hex16: 3FD3333333333334)
still not 1 (hex16: 3FF0000000000000), sum=0.4 (hex16: 3FD999999999999A)
still not 1 (hex16: 3FF0000000000000), sum=0.5 (hex16: 3FE0000000000000)
still not 1 (hex16: 3FF0000000000000), sum=0.6 (hex16: 3FE3333333333333)
still not 1 (hex16: 3FF0000000000000), sum=0.7 (hex16: 3FE6666666666666)
still not 1 (hex16: 3FF0000000000000), sum=0.8 (hex16: 3FE9999999999999)
still not 1 (hex16: 3FF0000000000000), sum=0.9 (hex16: 3FECCCCCCCCCCCCC)
&lt;STRONG&gt;still not 1&lt;/STRONG&gt; (hex16: &lt;FONT color="#FF0000"&gt;3FF0000000000000&lt;/FONT&gt;), &lt;STRONG&gt;sum=1&lt;/STRONG&gt; (hex16: &lt;FONT color="#FF0000"&gt;3FEFFFFFFFFFFFFF&lt;/FONT&gt;)   &lt;FONT color="#FF0000"&gt;&amp;lt;=== eeerrp !!&lt;/FONT&gt;
still not 1 (hex16: 3FF0000000000000), sum=1.1 (hex16: 3FF1999999999999)
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;CODE class=" language-sas"&gt;
&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;Excuses abound. None seem satisfying.&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 15:19:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650264#M195009</guid>
      <dc:creator>GGO</dc:creator>
      <dc:date>2020-05-25T15:19:55Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650268#M195010</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/67073"&gt;@GGO&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;I understood Quentin's explanation. It does not explain the inconsistencies. In Macro, a null string is a valid argument. %SYSFUNC knows that for some functions.&lt;BR /&gt;&lt;BR /&gt;I think the common failure/bug may be for single-argument functions. %SYSFUNC simply does not acknowledge the open-paren and close-paren as delimiters - only the comma that separates more than one argument. So it could be that this bug only affects single-argument DATA STEP functions. &lt;BR /&gt;&lt;BR /&gt;Just a guess, considering all the insights provided here.&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;But you are are the one that is asking for inconsistency.&amp;nbsp; You want SAS to treat this function call&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%sysfunc(trimn())&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;differently just because you used macro code to generate the function call.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/19879"&gt;@Quentin&lt;/a&gt;&amp;nbsp;explained give %sysfunc() &lt;STRONG&gt;something&lt;/STRONG&gt; as an argument to the function you are asking it to call.&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;1972  %let x=%str();
1973  %put |%sysfunc(trimn(&amp;amp;x))|;
||
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Then it doesn't cause an error because you called a function, TRIMN(), that requires at least one argument without passing it anything.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 03:33:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650268#M195010</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2020-05-25T03:33:27Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650337#M195013</link>
      <description>&lt;P&gt;I can't get my head around a NULL STRING not being a valid argument.&lt;BR /&gt;&lt;BR /&gt;For COMPRESS() and PRXMATCH() two NULL STRINGS are valid arguments.&lt;BR /&gt;&lt;BR /&gt;Why isn't one NULL STRING also a valid argument?&lt;BR /&gt;That to me would be more consistent.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Perhaps the inconsistency that bother me is that %SYSFUNC() DATA STEP functions recognize a comma (,) are delimiting two NULL STRINGS. Yet single-argument calls fail to recognize the open/close parens as delimiting a single NULL STRING.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;That for me is the fundamental inconsistency, for which I see no explanation:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;ONE null argument - ERROR!&lt;/LI&gt;
&lt;LI&gt;TWO or more null strings - BACK IN BUSINESS!&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;That for me is fundamentally inconsistent. But at least it gives me a rule of thumb for recognizing situations that require %length() checks or similar. That's what I was after.&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 03:57:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650337#M195013</guid>
      <dc:creator>GGO</dc:creator>
      <dc:date>2020-05-25T03:57:36Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650431#M195021</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/67073"&gt;@GGO&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;(...) Even Excel knows that 1/3 + 1/3 + 1/3 = 1. SAS still does not. (...)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;1    data _null_;
2      sum = 0;
3      do i = 1 to 3;
4        sum = sum + 1/3;
5        if sum = 3 then put 'got to 3 ' sum=;
6        else put 'not quite yet ' sum=;
7      end;
8    run;

not quite yet sum=0.3333333333
not quite yet sum=0.6666666667
not quite yet sum=1                &lt;FONT color="#FF0000"&gt;/* eeeeerrp */&lt;/FONT&gt;&lt;/PRE&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;It &lt;EM&gt;does&lt;/EM&gt;. You seem to assume that the sum should be 3?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Admittedly, the cumulative sum, if continued far enough, would miss 2 (and most, but not all integers &amp;gt;=5; assuming a Windows platform)&lt;FONT face="helvetica"&gt;:&lt;/FONT&gt;&lt;/P&gt;
&lt;PRE&gt;1    data _null_;
2    do i = 1 to &lt;STRONG&gt;&lt;FONT size="4"&gt;9&lt;/FONT&gt;&lt;/STRONG&gt;;
3      sum + 1/3;
4      round_sum=round(sum,1e-9);
5      if mod(i,3)=0 then put sum= (sum round_sum)(=hex16./)/;
6    end;
7    run;

sum=1 sum=3FF0000000000000
round_sum=3FF0000000000000

sum=2 sum=3FFFFFFFFFFFFFFF
round_sum=4000000000000000

sum=3 sum=4008000000000000
round_sum=4008000000000000&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/67073"&gt;@GGO&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;(...) Why in the world should SAS double-down for decades on different internal representation for real numbers (including integers) and separately for integers?&amp;nbsp;(...)&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This is not the case. SAS uses the same internal &lt;A href="https://documentation.sas.com/?docsetId=lepg&amp;amp;docsetTarget=p0dv87zb3bnse6n1mqo360be70qr.htm&amp;amp;docsetVersion=9.4&amp;amp;locale=en#n0iq9gfqb0oexvn1p3bh0na21jnx" target="_blank" rel="noopener"&gt;floating-point representation&lt;/A&gt; for integers as for any other numbers.&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 10:51:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650431#M195021</guid>
      <dc:creator>FreelanceReinh</dc:creator>
      <dc:date>2020-05-25T10:51:20Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650452#M195032</link>
      <description>&lt;P&gt;I have no idea how SAS has implemented %SYSFUNC() but here is a model that make some sense for the behavior you are seeing.&amp;nbsp; %SYSFUNC() has a list somewhere of each function it can call and how many required arguments the function has.&amp;nbsp; When it is checking the syntax it receives it compares the number of values it has inside of its () to that number.&amp;nbsp; &amp;nbsp;Note this is probably done AFTER the previous rounds of macro processor scanning has replaced all of the macro variable and macro function references.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;TRIMN() requires at least one argument. As you can see if you try this code in a data step.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;x = trimn();&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;So when you call it without any values you get an error because the number of values does not match. Again, it does not matter whether you do it by just typing this&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let x=%sysfunc(trimn());&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Or get there via a more complicated route, like:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let y=;
%let x=%sysfunc(trimn(&amp;amp;y));&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;you still get the value count error.&amp;nbsp; It doesn't really matter, at this point, whether the value being passed is an empty string or not, because no value is being passed at all and that is all that is being checked.&amp;nbsp; So when you pass it a macro quoted empty string, using %str() perhaps, now when %SYSFUNC() is counting values it see that macro quoted string as a value to pass.&amp;nbsp; Again it doesn't really care if the number of characters in the value is zero or not, that is for the data step function to deal with, it just cares that there are the right number of values for the number of required arguments.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;When you call compress with just a comma between the parentheses then %SYSFUNC() has something it can test to see if the count of values provided match the count of arguments needed.&amp;nbsp; Since a comma separates values the presence of N commas means there are N+1 values provided.&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 14:31:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650452#M195032</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2020-05-25T14:31:01Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650456#M195034</link>
      <description>&lt;P&gt;As background, I found this thread I started three years ago, where I was complaining that %SYSFUNC won't pass a null argument to a function with the argument list is empty.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://communities.sas.com/t5/SAS-Programming/SYSFUNC-and-null-arguments/m-p/412077#M100760" target="_blank"&gt;https://communities.sas.com/t5/SAS-Programming/SYSFUNC-and-null-arguments/m-p/412077#M100760&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;So I'm definitely not an apologist for SAS; I wish %SYSFUNC behaved like you want it to.&lt;/P&gt;
&lt;P&gt;But, I do think it's consistent.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In the DATA step, when a function accepts arguments, if you do not pass an argument, it errors:&lt;/P&gt;
&lt;PRE&gt;17   data _null_ ;
18     x=compress() ;
         --------
         71
ERROR 71-185: The COMPRESS function call does not have enough arguments.

19   run ;
&lt;/PRE&gt;
&lt;P&gt;Clearly the compiler sees the above as passing zero arguments, rather than passing a single null argument.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;But if you pass a comma, it does not error:&lt;/P&gt;
&lt;PRE&gt;20   data _null_ ;
21     x=compress(,) ;
22   run ;
&lt;/PRE&gt;
&lt;P&gt;And the above is interpreted (I believe) as passing two null arguments to compress.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We can see the same with tranwrd passing no arguments:&lt;/P&gt;
&lt;PRE&gt;76   data _null_ ;
77     x=tranwrd() ;
         -------
         71
ERROR 71-185: The TRANWRD function call does not have enough arguments.

78   run ;
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And tranwrd passing three arguments that are null:&lt;/P&gt;
&lt;PRE&gt;79   data _null_ ;
80     x=tranwrd(,,) ;
                 -
                 159
ERROR 159-185: Null parameters for TRANWRD are invalid.

81   run ;
&lt;/PRE&gt;
&lt;P&gt;Note that above shows the DATA step compiler actually throws a different error message for "not enough arguments" than it does for "null parameters".&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In my testing, the DATA step seems consistent. If a function accepts arguments:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;An empty argument list will error rather than pass a null value as the argument.&lt;/LI&gt;
&lt;LI&gt;If you use a comma in the list it will pass null value(s) as the argument(s)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;When you call a DATA step function via %SYSFUNC, the behavior is consistent.&lt;/P&gt;
&lt;PRE&gt;184  %put %sysfunc(compress()) ;
ERROR: The function COMPRESS referenced by the %SYSFUNC or %QSYSFUNC macro function has too few
       arguments.
185  %put %sysfunc(compress(,)) ;
186  %put %sysfunc(compress(,,)) ;
187  %put %sysfunc(compress(,,,)) ;
ERROR: The function COMPRESS referenced by the %SYSFUNC or %QSYSFUNC macro function has too many
       arguments.
&lt;/PRE&gt;
&lt;PRE&gt;188  %put %sysfunc(tranwrd()) ;
ERROR: The function TRANWRD referenced by the %SYSFUNC or %QSYSFUNC macro function has too few
       arguments.
189  %put %sysfunc(tranwrd(,)) ;
ERROR: The function TRANWRD referenced by the %SYSFUNC or %QSYSFUNC macro function has too few
       arguments.
190  %put %sysfunc(tranwrd(,,)) ;
191  %put %sysfunc(tranwrd(,,,)) ;
ERROR: The function TRANWRD referenced by the %SYSFUNC or %QSYSFUNC macro function has too many
       arguments.
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I disagree with your statement "&lt;SPAN&gt;My original test calls all have the right number of arguments. Some arguments are simply NULL STRINGS."&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;If you code:&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro test_null_string_handling(str=);
  %put &amp;gt;&amp;gt;%sysfunc(STRIP(&amp;amp;str))&amp;lt;&amp;lt; ;
%mend test_null_string_handling;
%test_null_string_handling()&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;SPAN&gt;It is true that the local macro variable STR will have a null value, but this does not mean that you pass a null value to STRIP().&amp;nbsp; The macro processor will resolve &amp;amp;STR to null, and STRIP will have an empty argument list, which is not allowed.&amp;nbsp; Just the same as if you coded:&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro test_null_string_handling(str=);
  %put &amp;gt;&amp;gt;%sysfunc(STRIP())&amp;lt;&amp;lt; ;
%mend test_null_string_handling;
%test_null_string_handling()&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 14:34:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650456#M195034</guid>
      <dc:creator>Quentin</dc:creator>
      <dc:date>2020-05-25T14:34:20Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650464#M195037</link>
      <description>&lt;P&gt;Thank you FreelanceReinhard for pointing out my error!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Nonetheless, my point still stands with counting to 1 by tenths:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;99   data _null_;
100    sum = 0;
101    one = 1;
102    do i = 1 to 12;
103      sum = sum + 1/10;
104      if sum = one then
105         put 'got to ' one '(' one hex16. '), '
106              sum= '(hex16: ' sum hex16. ')';
107      else put 'still not ' one '(hex16:' one hex16. '), '
108               sum= '(hex16: ' sum hex16. ')'
109               ;
110    end;
111  run;

still not 1 (hex16:3FF0000000000000), sum=0.1 (hex16: 3FB999999999999A)
still not 1 (hex16:3FF0000000000000), sum=0.2 (hex16: 3FC999999999999A)
still not 1 (hex16:3FF0000000000000), sum=0.3 (hex16: 3FD3333333333334)
still not 1 (hex16:3FF0000000000000), sum=0.4 (hex16: 3FD999999999999A)
still not 1 (hex16:3FF0000000000000), sum=0.5 (hex16: 3FE0000000000000)
still not 1 (hex16:3FF0000000000000), sum=0.6 (hex16: 3FE3333333333333)
still not 1 (hex16:3FF0000000000000), sum=0.7 (hex16: 3FE6666666666666)
still not 1 (hex16:3FF0000000000000), sum=0.8 (hex16: 3FE9999999999999)
still not 1 (hex16:3FF0000000000000), sum=0.9 (hex16: 3FECCCCCCCCCCCCC)
&lt;FONT color="#000000"&gt;still not 1 (hex16:&lt;FONT color="#FF0000"&gt;3FF0000000000000&lt;/FONT&gt;), sum=1 (hex16: &lt;FONT color="#FF0000"&gt;3FEFFFFFFFFFFFFF&lt;/FONT&gt;)&lt;/FONT&gt;      &lt;FONT color="#FF0000"&gt;&lt;STRONG&gt;&amp;lt;=== eeeerrp !!&lt;/STRONG&gt;&lt;/FONT&gt;
still not 1 (hex16:3FF0000000000000), sum=1.1 (hex16: 3FF1999999999999)
still not 1 (hex16:3FF0000000000000), sum=1.2 (hex16: 3FF3333333333333)
&lt;/PRE&gt;
&lt;P&gt;&lt;EM&gt;(Hopefully I'm better at counting to 1 by tenths, compared with thirds &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 15:04:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650464#M195037</guid>
      <dc:creator>GGO</dc:creator>
      <dc:date>2020-05-25T15:04:40Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650474#M195039</link>
      <description>&lt;P&gt;You seem to think that Excel and Python are doing numeric precision "right" and SAS is doing it "wrong".&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;But they're all doing floating point arithmetic, with the associated limitations.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This Microsoft blog post explains why in Excel the equation&amp;nbsp;&lt;SPAN&gt;=1*(.5-.4-.1)&amp;nbsp; may not evaluate to 0:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;A href="https://www.microsoft.com/en-us/microsoft-365/blog/2008/04/10/understanding-floating-point-precision-aka-why-does-excel-give-me-seemingly-wrong-answers/" target="_blank"&gt;https://www.microsoft.com/en-us/microsoft-365/blog/2008/04/10/understanding-floating-point-precision-aka-why-does-excel-give-me-seemingly-wrong-answers/&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;And the python docs explain why evaluating .1 + .1 + .1 == .3 returns false.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;A href="https://docs.python.org/3/tutorial/floatingpoint.html" target="_blank"&gt;https://docs.python.org/3/tutorial/floatingpoint.html&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 15:34:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650474#M195039</guid>
      <dc:creator>Quentin</dc:creator>
      <dc:date>2020-05-25T15:34:43Z</dc:date>
    </item>
    <item>
      <title>Re: NULL STRINGS and DATA STEP functions in %SYSFUNC() - Why is behavior not consistent?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650480#M195043</link>
      <description>&lt;P&gt;I have understood and do see your points, Quentin. And I very much appreciate your perspective and insights.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;But in several details, we will simply disagree.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1 - DATA STEP and %SYSFUNC macro (text-generation) world are different, and have their own sets of rules.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;In DATA STEP, a blank CHAR has length 1.&lt;/LI&gt;
&lt;LI&gt;In macro world, a blank string has %length 0. This fundamental disconnect definitely contributes to SAS' inconsistencies.&lt;/LI&gt;
&lt;LI&gt;%SYSFUNC() should bring DATA STEP functions into the macro (text-gen) world. To me, this means that %SYSFUNC() should translate the DATA STEP blank-char concept into a zero-length NULL STRING.&lt;/LI&gt;
&lt;LI&gt;This has been and remains my main point: &lt;STRONG&gt;%SYSFUNC() fails to do this most fundamental translation into the macro (text-gen) world &lt;EM&gt;consistently&lt;/EM&gt;&lt;/STRONG&gt; - OK for multiple arguments; ERROR for single arguments. I see no explanation for this (details follow).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;2 - %SYSFUNC() apparently demands a comma to delimit arguments. It does not recognize the open/close parens as delimiting a single argument. This to me is a design failure, and I struggle to alter that assessment.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://go.documentation.sas.com/?cdcId=pgmsascdc&amp;amp;cdcVersion=9.4_3.5&amp;amp;docsetId=mcrolref&amp;amp;docsetTarget=p1psyvu3yvzk0nn12mdj1b0l1k3x.htm&amp;amp;locale=en" target="_self"&gt;See this documentation&lt;/A&gt;: "All arguments in SAS language functions within %SYSFUNC must be separated by commas."&lt;/LI&gt;
&lt;LI&gt;That's the fundamental design flaw. How in the world are you supposed to separate a single argument with a comma?! Not possible - so design oversight.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The open/close parens of the function call should be sufficient to delimit a single argument, including the NULL argument, which otherwise works fine for 2+ NULL arguments.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;%SYSFUNC()'s focus on the comma has blinded it to the open/close delimiters.&lt;/LI&gt;
&lt;LI&gt;NULL arguments are fine in the macro (text-gen) world. %SYSFUNC() simply does not make the translation from DATA STEP to Macro world, and I think this stems from the open/close-parens-as-delimiters issue.&lt;/LI&gt;
&lt;LI&gt;Yes, I expect that we will disagree on this point &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT color="#008000"&gt;&lt;EM&gt;( I have no issue with TRANWRD() and TRANSTRN() - function documentation clearly states when blank (null) arguments are valid - or not. )&lt;/EM&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;FONT color="#000000"&gt;3 - By comparison, I do consider STRIP() flawed and inconsistent with the macro world.&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color="#000000"&gt;Taking your example, I see no difference between a NULL STRING (str=), and an EXPLICIT NULL STRING (str=%str()). &lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT color="#000000"&gt;Both arguments are NULL STRINGS - strings with length zero. &lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT color="#000000"&gt;The EXPLICIT NULL STRING simply helps %SYSFUNC() get over its fundamental failure to recognize a NULL STRING simply based on the open/close-paren delimiters:&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro test_null_string_handling(str=);
  %put &amp;gt;&amp;gt;%sysfunc(STRIP(&amp;amp;str))&amp;lt;&amp;lt; ;
%mend test_null_string_handling;

%test_null_string_handling
%*;
%test_null_string_handling(str=%str())      /* &amp;lt;== NULL STRING ASSIST, to overcome %SYSFUNC() design flaw */
%*;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;FONT color="#000000"&gt;With the assist, despite any macro-quoting tokens/symbols, the DATA STEP function STRIP() nonetheless receives a NULL STRING.&lt;BR /&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#000000"&gt;The results - the assist of %str() eases %SYSFUNC() over its design flaw:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;FONT color="#000000"&gt;323  %test_null_string_handling
324  %*;
&lt;FONT color="#FF0000"&gt;ERROR: The function STRIP referenced by the %SYSFUNC or %QSYSFUNC macro function has too few arguments.&lt;/FONT&gt;
&amp;gt;&amp;gt;&amp;lt;&amp;lt;
325  %test_null_string_handling(str=%str())     &lt;FONT color="#008000"&gt;/* &amp;lt;== NULL STRING ASSIST, to overcome %SYSFUNC() design flaw */&lt;/FONT&gt;
&amp;gt;&amp;gt;&amp;lt;&amp;lt;
326  %*;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;FONT color="#000000"&gt;&lt;STRONG&gt;4 - %SYSFUNC() simply cannot recognize otherwise valid single-null-string-arguments.&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color="#000000"&gt;That's a %SYSFUNC() design flaw.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;Yes, I expect that we will disagree on this point, as well &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This has been a very helpful, and at times very frustrating thread for me. I thank all who have contributed. Such frustration, for me, is a mark of insight and learning. This is what you have all given to me.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you!&lt;/P&gt;</description>
      <pubDate>Mon, 25 May 2020 17:05:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/NULL-STRINGS-and-DATA-STEP-functions-in-SYSFUNC-Why-is-behavior/m-p/650480#M195043</guid>
      <dc:creator>GGO</dc:creator>
      <dc:date>2020-05-25T17:05:42Z</dc:date>
    </item>
  </channel>
</rss>

