Две ячейки инициализации в одной записной книжке, каждая из которых автоматически сохраняется в отдельном .m-файле?

#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 о кнопке или подобном была бы необходима для этого подхода; это не было бы автоматическим при сохранении. Вероятно, есть способ изменить интерфейс, чтобы запускать это при каждом сохранении. Я бы не знал, как это сделать.