Ответ 1
В данном случае вы можете использовать что-то вроде следующего:
Clear[getCFormNoPowers];
getCFormNoPowers[expr_] :=
Module[{times},
Apply[Function[code, Hold[CForm[code]], HoldAll],
Hold[#] &[expr /. x_Symbol^y_Integer /; y > 1 :>
times @@ Table[x, {y}]] /. times -> Times]];
Например,
In[52]:= getCFormNoPowers[2 hgt^2 k1inv^3 mx0 wid^2+hgt^2 k1inv^3 wid^3]
Out[52]= Hold[2*mx0*(hgt*hgt)*(wid*wid)*(k1inv*k1inv*k1inv) +
hgt*hgt*(k1inv*k1inv*k1inv)* (wid*wid*wid)]
Результат завернут в Hold
, чтобы его оценка не вернулась к Power
-s. Вы можете преобразовать его в
строка в любое время, используя что-то вроде ToString[[email protected]@result]
. Или вы можете манипулировать дальше.
Edit:
в качестве альтернативы вы можете сделать это:
Clear[getCFormNoPowers];
getCFormNoPowers[expr_] :=
Block[{Times},
SetAttributes[Times, {Flat, OneIdentity}];
Apply[Function[code, Hold[CForm[code]], HoldAll],
Hold[#] &[expr /. x_Symbol^y_Integer /; y > 1 :> Times @@ Table[x, {y}]]]];
который также сохранит первоначальный порядок ваших условий и избавится от лишних круглых скобок, поэтому этот, по-видимому, соответствует вашим спецификациям.
Как правило, вы можете взглянуть на новые возможности "символического генерации C" версии 8. Сопоставление кода с символическими выражениями C может быть более надежным. Таким образом, вам не нужно постоянно беспокоиться об оценке, и вы можете использовать новую функциональность для создания целых программ на C в конце.
Изменить 2:
Чтобы проиллюстрировать, как проблема может быть решена с помощью SymbolicC:
Needs["SymbolicC`"];
Clear[getCFormNoPowersSymC];
getCFormNoPowersSymC[expr_] :=
Block[{Times},
SetAttributes[Times, {Flat, Orderless}];
ToCCodeString[
expr /. x_Symbol^y_Integer /; y > 1 :> Times @@ Table[x, {y}] //.
HoldPattern[(op : (Times | Plus))[args__]] :> COperator[op, {args}]]];
In[53]:= getCFormNoPowersSymC[2 hgt^2 k1inv^3 mx0 wid^2+hgt^2 k1inv^3 wid^3]
Out[53]= 2 * hgt * hgt * k1inv * k1inv * k1inv * mx0 * wid * wid +
hgt * hgt * k1inv * k1inv * k1inv * wid * wid * wid
Этот метод имеет несколько преимуществ. Возможно, две основные из них являются способностью к компоновке (можно разложить такие выражения в их символической форме, построив более крупные блоки кода из более мелких) и тот факт, что не нужно много думать об оценке (мне не нужны были какие-либо трюки с Hold
здесь).