Сохраните код Mathematica в синтаксисе `FullForm`

Мне нужно выполнить метапрограммирование на большой базе кода Mathematica (сотни тысяч строк кода), и я не хочу писать полноценный синтаксический анализатор, поэтому Мне было интересно, как лучше всего получить код из записной книжки Mathematica в легко анализируемом синтаксисе.

Можно ли экспортировать записную книжку Mathematica в синтаксисе FullForm или сохранить все определения в синтаксисе FullForm ?

Документация для ] Save говорит, что он может экспортировать только в синтаксисе InputForm , что нетривиально для синтаксического анализа.

Лучшее решение, которое у меня есть до сих пор, - это оценить записную книжку, а затем использовать DownValues ​​ для извлечения правил перезаписи с аргументами (но при этом отсутствуют определения символов) следующим образом:

DVs[_] := {}
DVs[s_Symbol] := DownValues[s]
stream = OpenWrite["FullForm.m"];
WriteString[stream, 
  DVs[Symbol[#]] & /@ Names["Global`*"] // Flatten // FullForm];
Close[stream];

Я пробовал пока существует множество подходов, но ни один из них не работает должным образом. Метапрограммирование в Mathematica кажется чрезвычайно трудным, потому что оно продолжает оценивать вещи, которые я хочу не оценивать. Например, я хотел получить строковое имя символа бесконечности, используя SymbolName [Infinity] , но Infinity оценивается как несимвол и вызов SymbolName умирает с ошибкой. Отсюда мое желание сделать метапрограммирование на более подходящем языке.

РЕДАКТИРОВАТЬ

Лучшее решение - сохранить записные книжки в виде файлов пакетов (.m) вручную, а затем перевести их, используя следующий код:

stream = OpenWrite["EverythingFullForm.m"];
WriteString[stream, Import["Everything.m", "HeldExpressions"] // FullForm];
Close[stream];

7
задан Charles 27 November 2011 в 04:56
поделиться