Мне нужно выполнить метапрограммирование на большой базе кода 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];