Talk:Permutations with repetitions: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎REXX implementation limits: added comments about various releases of Regina REXX. -- ~~~~)
(→‎REXX implementation limits: added another variant of REXX version 2. -- ~~~~)
Line 40: Line 40:
::::::::::: -- [[User:Gerard Schildberger|Gerard Schildberger]] ([[User talk:Gerard Schildberger|talk]]) 20:52, 12 May 2013 (UTC)
::::::::::: -- [[User:Gerard Schildberger|Gerard Schildberger]] ([[User talk:Gerard Schildberger|talk]]) 20:52, 12 May 2013 (UTC)


-----
----

==another variant of the 2nd REXX version==
This REXX version:
* simplifies many statements
* minimizes the length of the INTERPRET statement
* eliminates the SELECT statements
* eliminates a DO loop
* uses both kinds of quotes strings to make it easier to peruse
* moves a couple of statements out of the INTERPRET clause
* uses a positive (logic) instead of a negative IF statement
* eliminates an extra   ''';'''   (semicolon) from the INTERPRET clause
* eliminates the need for counting the permutations
<br>If any of these improvements could/would be of use, that's fine. &nbsp; I plan to delete this entry in a couple of weeks. -- [[User:Gerard Schildberger|Gerard Schildberger]] ([[User talk:Gerard Schildberger|talk]]) 04:32, 13 May 2013 (UTC)
<lang rexx>/*REXX*/ parse arg n m s names
if n='' then n=3
if m='' then m=2
if datatype(s,'N') then s=left('',s)

do k=1 to n
if names='' then e.k=k
else parse var names e.k names
end /*k*/
a=''
do i=1 to m; a=a'do d'i"=1 to n;"; end /*i*/
a=a'z=e.d1'
do j=2 to m; a=a"||s||e.d"j; end /*j*/

a=a';say z'copies(";end",m)
if m==0 then do; say '1 permutation, a "null".'; exit; end
interpret a
say n**m 'permutations'</lang>

Revision as of 04:32, 13 May 2013

REXX implementation limits

Most REXX interpreters have implementation limits on the length of a REXX clause.

For Regina REXX, it depends on the release level.

For Regina REXX 3.3,   3.4,   3.5, REXX gives a SYNTAX error:

Error 12 running "C:\xxxxxx.REX", line 29: [Clause > 1024 characters]

For Regina REXX 3.6,   3.7, REXX "crashes" somewhere less than a statement length of 1932,
I haven't pursued this to find the exact byte count.

{By crashing, I mean Microsoft Windows displays a small error "window":

Regina Rexx Launcher (x86) has encountered a problem
and needs to close.   We are sorry for the inconvenience.
(more boilerplate follows).

For what's it worth, I believe REXX should raise the SYNTAX condition.

[The reason I mention the older versions of Regina REXX is that Regina REXX 3.3 uses less
virtual memory for those REXX programs which use a lot of stemmed variables (possibly a
memory leak), so the use of the older Regina release is forced in lieu of a fix.

For PC/REXX and Personal REXX, it depends on what the RXISA (SET environmental variable).
These two REXXes either give:

Error 11 on line 29 of c:\xxxxxx.REX" Control stack full


Memory full: symbol
Error 5 on line 29 of C:\xxxxxx.REX: Machine resources exhausted

somewhere between 568 and 597 bytes.

It should be noted that most people use the maximum for the RXISA   (which is 40K).

As far as I can tell, R4 and ROO have no (real) limitation for the length of an INTERPRET instruction,
and that is probably true of CMS REXX and TSO REXX   (it's been too long since I used those
two flavors of REXX).

-- Gerard Schildberger (talk) 20:52, 12 May 2013 (UTC)

another variant of the 2nd REXX version

This REXX version:

  • simplifies many statements
  • minimizes the length of the INTERPRET statement
  • eliminates the SELECT statements
  • eliminates a DO loop
  • uses both kinds of quotes strings to make it easier to peruse
  • moves a couple of statements out of the INTERPRET clause
  • uses a positive (logic) instead of a negative IF statement
  • eliminates an extra   ;   (semicolon) from the INTERPRET clause
  • eliminates the need for counting the permutations


If any of these improvements could/would be of use, that's fine.   I plan to delete this entry in a couple of weeks. -- Gerard Schildberger (talk) 04:32, 13 May 2013 (UTC) <lang rexx>/*REXX*/ parse arg n m s names if n= then n=3 if m= then m=2 if datatype(s,'N') then s=left(,s)

       do k=1 to n
       if names=   then e.k=k
                     else parse var names e.k names
       end   /*k*/

a=

                   do i=1 to m;   a=a'do d'i"=1 to n;";   end  /*i*/

a=a'z=e.d1'

                   do j=2 to m;   a=a"||s||e.d"j;         end  /*j*/

a=a';say z'copies(";end",m) if m==0 then do; say '1 permutation, a "null".'; exit; end interpret a say n**m 'permutations'</lang>