#wolfram-mathematica #mathematica-frontend
#wolfram-mathematica #mathematica-интерфейс
Вопрос:
Есть ли способ создать записную книжку, в которой каждая инициализация Cell
будет автоматически сохраняться в своем собственном .m-файле с произвольным именем?
P.S. Вопрос связан с программой Mathematica, разработанной Wolfram Research Inc. Речь идет не о математике.
Комментарии:
1. Я не знаю ответа, но просто любопытно: зачем вы хотите это сделать?
2. Я не думаю, что это можно сделать. Вероятно, вы могли бы написать ячейку инициализации, которая оценивает код и записывает его в уникальный файл, но я думаю, что это произойдет только при оценке ячейки инициализации, а не при каждом сохранении файла.
3. @belisarius Причина в том, что я разрабатываю приложение, предназначенное для использования подчиненных ядер через MathLink. Мне нужен отдельный файл инициализации для этого ядра. И я чувствую себя очень комфортно, когда весь мой код находится в одной записной книжке.
4. И я думаю, что есть лучшие / более надежные способы генерации пакетов, чем через механизм сохранения ячеек инициализации из старых времен. (Workbench, текстовые редакторы и New > Pacakge в сочетании с инструкциями Get работают хорошо, в зависимости от поставленной задачи.)
5. Я думаю, что механизм автоматического сохранения надежен, если вы редактируете только записную книжку. Неизменно, хотя кажется, что затем я хотел отредактировать соответствующий .m-файл, в этот момент в коде возникает расхождение. Вероятно, вы могли бы использовать Put или Export для создания файла .m для подчиненных ядер и создать кнопку для сохранения файла. Это было бы немного сложнее вручную, чем хотелось бы, но кнопку можно поместить в ячейку раздела, группирующую код, или в пользовательскую закрепленную ячейку для записной книжки разработчика…
Ответ №1:
Я не уверен, что следующий подход вас удовлетворит: однажды я хотел создать способ создания компактных записных книжек, содержащих только ячейки инициализации, найденные в моей записной книжке для разработчиков; следующий код записывает ячейки инициализации текущей записной книжки в одну новую записную книжку и автоматически сохраняет m-файл в качестве побочного эффекта, но его можно легко адаптировать для создания отдельной записной книжки и m-файла для каждой ячейки инициализации.
In[162]:= nbToExtract = SelectedNotebook[]
In[163]:=
extractInitializationCells[nb_] :=
Block[{nbNew = CreateDocument[], count = 0},
(SelectionMove[nb, Next, Cell];
While[NotebookRead[nb] =!= {}, (If[InitializationCell /.
Options[NotebookSelection[nb], InitializationCell],
(count ;
NotebookWrite[nbNew, NotebookRead[nb]]), {}]; SelectionMove[nb, Next, Cell])];
Print[ToString[count] <> " initialization cell(s) found"];
CurrentValue[nbNew, AutoGeneratedPackage] = Automatic;
NotebookSave[nbNew, fn];
NotebookClose[nbNew];
Clear[nbNew](* just in case *))]
extractInitializationCells[nbToExtract]
При этом извлекаются только ячейки инициализации под ячейкой, в которой вызывается функция extractInitializationCells
. И я бы согласился с предыдущими предостережениями об использовании механизма автоматической генерации пакетов. Кроме того, CurrentValue
не защищен на неопределенный срок от обратной несовместимости, но на данный момент он пережил несколько основных версий Mathematica.
Комментарии:
1. О, и идея @BrettChampion о кнопке или подобном была бы необходима для этого подхода; это не было бы автоматическим при сохранении. Вероятно, есть способ изменить интерфейс, чтобы запускать это при каждом сохранении. Я бы не знал, как это сделать.