vermaseren / form

The FORM project for symbolic manipulation of very big expressions
GNU General Public License v3.0
982 stars 118 forks source link

%e produces a bad print for long expression in C and Fortran output mode #366

Open benruijl opened 3 years ago

benruijl commented 3 years ago

The following program generates bad C output:

#-
Auto S Z;

L F = Z2 + Z3 + Z4 + Z5 + Z6 + Z7 + Z8 + Z9 + Z10 + Z11 +
      Z12 + Z13 + Z14 + Z15 + Z16 + Z17 + Z18 + Z19 + Z20 +
      Z21 + Z22 + Z23 + Z24 + Z25 + Z26 + Z27 + Z28 + Z29 +
      Z30 + Z31 + Z32 + Z33 + Z34 + Z35 + Z36 + Z37 + Z38 +
      Z39 + Z40 + Z41 + Z42 + Z43 + Z44 + Z45 + Z46 + Z47 +
      Z48 + Z49 + Z50 + Z51 + Z52 + Z53 + Z54 + Z55 + Z56 +
      Z57 + Z58 + Z59 + Z60 + Z61 + Z62 + Z63 + Z64 + Z65 +
      Z66 + Z67 + Z68 + Z69 + Z70 + Z71 + Z72 + Z73 + Z74 +
      Z75 + Z76 + Z77 + Z78 + Z79 + Z80 + Z81 + Z82 + Z83 +
      Z84 + Z85 + Z86 + Z87 + Z88 + Z89 + Z90 + Z91 + Z92 +
      Z93 + Z94 + Z95 + Z96 + Z97 + Z98 + Z99 + Z100 + Z101 +
      Z102 + Z103 + Z104 + Z105 + Z106 + Z107 + Z108 + Z109 +
      Z110 + Z111 + Z112 + Z113 + Z114 + Z115 + Z116 + Z117 +
      Z118 + Z119 + Z120 + Z121 + Z122 + Z123 + Z124 + Z125 +
      Z126 + Z127 + Z128 + Z129 + Z130 + Z131 + Z132 + Z133 +
      Z134 + Z135 + Z136 + Z137 + Z138 + Z139 + Z140 + Z141 +
      Z142 + Z143 + Z144 + Z145 + Z146 + Z147 + Z148 + Z149 +
      Z150 + Z151 + Z152 + Z153 + Z154 + Z155 + Z156 + Z157;
.sort

Format C;

#write "%e",F

.end
Z157 + Z156 + Z155 + Z154 + Z153 + Z152 + Z151 + Z150 + Z149 + Z148 + 
      Z147 + Z146 + Z145 + Z144 + Z143 + Z142 + Z141 + Z140 + Z139 + 
      Z138 + Z137 + Z136 + Z135 + Z134 + Z133 + Z132 + Z131 + Z130 + 
      Z129 + Z128 + Z127 + Z126 + Z125 + Z124 + Z123 + Z122 + Z121 + 
      Z120 + Z119 + Z118 + Z117 + Z116 + Z115 + Z114 + Z113 + Z112 + 
      Z111 + Z110 + Z109 + Z108 + Z107 + Z106 + Z105 + Z104 + Z103 + 
      Z102 + Z101 + Z100 + Z99 + Z98 + Z97 + Z96 + Z95 + Z94 + Z93 + 
      Z92 + Z91 + Z90 + Z89 + Z88 + Z87 + Z86 + Z85 + Z84 + Z83 + Z82
       + Z81 + Z80 + Z79 + Z78 + Z77 + Z76 + Z75 + Z74 + Z73 + Z72 + 
      Z71 + Z70 + Z69 + Z68 + Z67 + Z66 + Z65 + Z64 + Z63 + Z62 + Z61
       + Z60 + Z59 + Z58 + Z57 + Z56 + Z55 + Z54 + Z53 + Z52 + Z51 + 
      Z50 + Z49 + Z48 + Z47 + Z46 + Z45 + Z44 + Z43 + Z42 + Z41 + Z40
       + Z39 + Z38 + Z37 + Z36 + Z35 + Z34 + Z33 + Z32 + Z31 + Z30 + 
      Z29 + Z28 + Z27 + Z26 + Z25 + Z24 + Z23 + Z22 + Z21 + Z20 + Z19
       + Z18 + Z17 + Z16 + Z15 + Z14 + Z13 + Z12 + Z11 + Z10 + Z9 + Z8
       + Z7;
      _ +=  + Z6 + Z5 + Z4 + Z3 + Z2;

The ; _ += should not be there.

Fortran mode does not fare better:

Z157 + Z156 + Z155 + Z154 + Z153 + Z152 + Z151 + Z150 + Z149 + Z148 + 
     & Z147 + Z146 + Z145 + Z144 + Z143 + Z142 + Z141 + Z140 + Z139 + 
     & Z138 + Z137 + Z136 + Z135 + Z134 + Z133 + Z132 + Z131 + Z130 + 
     & Z129 + Z128 + Z127 + Z126 + Z125 + Z124 + Z123 + Z122 + Z121 + 
     & Z120 + Z119 + Z118 + Z117 + Z116 + Z115 + Z114 + Z113 + Z112 + 
     & Z111 + Z110 + Z109 + Z108 + Z107 + Z106 + Z105 + Z104 + Z103 + 
     & Z102 + Z101 + Z100 + Z99 + Z98 + Z97 + Z96 + Z95 + Z94 + Z93 + 
     & Z92 + Z91 + Z90 + Z89 + Z88 + Z87 + Z86 + Z85 + Z84 + Z83 + Z82
     &  + Z81 + Z80 + Z79 + Z78 + Z77 + Z76 + Z75 + Z74 + Z73 + Z72 + 
     & Z71 + Z70 + Z69 + Z68 + Z67 + Z66 + Z65 + Z64 + Z63 + Z62 + Z61
     &  + Z60 + Z59 + Z58 + Z57 + Z56 + Z55 + Z54 + Z53 + Z52 + Z51 + 
     & Z50 + Z49 + Z48 + Z47 + Z46 + Z45 + Z44 + Z43 + Z42 + Z41 + Z40
     &  + Z39 + Z38 + Z37 + Z36 + Z35 + Z34 + Z33 + Z32 + Z31 + Z30 + 
     & Z29 + Z28 + Z27 + Z26 + Z25 + Z24 + Z23 + Z22 + Z21 + Z20 + Z19
     &  + Z18 + Z17 + Z16 + Z15 + Z14 + Z13 + Z12 + Z11 + Z10 + Z9 + Z8
     &  + Z7
      _ = _ + Z6 + Z5 + Z4 + Z3 + Z2
tueda commented 3 years ago

Perhaps FORM could give an error or warning in this case in such a way that it reminds users to set continuationlines

#:continuationlines 1M

or specify the variable name:

#write "%e",F(F)