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

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

P.S. Вопрос связан с программой Mathematica, разработанной Wolfram Research Inc. Речь идет не о математике или математике.


person Alexey Popkov    schedule 08.04.2011    source источник
comment
Я не знаю ответа, но просто любопытно: почему вы хотите это сделать?   -  person Dr. belisarius    schedule 08.04.2011
comment
Я не думаю, что это можно сделать. Вероятно, вы могли бы написать ячейку инициализации, которая оценивала бы код и записывала его в уникальный файл, но я думаю, что это произойдет только при оценке ячейки инициализации, а не при каждом сохранении файла.   -  person Brett Champion    schedule 08.04.2011
comment
@belisarius Причина в том, что я разрабатываю приложение, предназначенное для использования подчиненных ядер через MathLink. Мне нужен отдельный файл инициализации для этих ядер. И мне очень удобно хранить весь мой код в одном блокноте.   -  person Alexey Popkov    schedule 08.04.2011
comment
И я думаю, что есть лучшие/более надежные способы генерировать пакеты, чем с помощью механизма инициализации-сохранения ячеек из старых дней. (Workbench, текстовые редакторы и New › Pacakge в сочетании с операторами Get работают хорошо, в зависимости от поставленной задачи.)   -  person Brett Champion    schedule 08.04.2011
comment
@Brett В каком смысле механизм сохранения ячеек инициализации ненадежен?   -  person Alexey Popkov    schedule 08.04.2011
comment
Я думаю, что механизм автосохранения надежен, если вы только когда-либо редактируете блокнот. Однако неизменно кажется, что затем я хотел отредактировать соответствующий файл .m, и в этот момент в коде возникло расхождение. Вероятно, вы могли бы использовать Put или Export для создания файла .m для подчиненных ядер и создать кнопку для сохранения файла. Это было бы немного более ручным, чем хотелось бы, но кнопку можно было бы поместить в ячейку Раздела, группирующую код, или в пользовательскую закрепленную ячейку для блокнота разработки...   -  person Brett Champion    schedule 08.04.2011
comment
Алексей, вы бы сочли предложение Бретта в комментарии выше решением? Вам нужна помощь в реализации?   -  person Mr.Wizard    schedule 11.04.2011
comment
Метод Бретта интересен, и я был бы признателен за рабочую реализацию. Зная, что на самом деле файл инициализации используется только при запуске ведомого ядра, было бы неплохо иметь функцию, которая автосохраняет (если она изменена с последнего автосохранения) текущую версию ячейки в .m-файл перед запуском ядро. Кнопка заодно была бы и полезной.   -  person Alexey Popkov    schedule 11.04.2011
comment
Но на данный момент я вижу другую, возможно, даже лучшую альтернативу, хотя не уверен, что это надежный способ: передавать на лету текущее содержимое ячейки с выражениями инициализации для подчиненных ядер каждому из них при его запуске. Я немного сомневаюсь в совместимости версии BoxForm: я работаю с ведомыми ядрами Mathematica 5.2. Но мы могли бы преобразовать ячейку в InputForm на лету.   -  person Alexey Popkov    schedule 11.04.2011
comment
Алексей, обязательно используйте функцию @name, когда отвечаете кому-то, кроме автора темы (в данном случае вам). Только сейчас увидел ваши ответы.   -  person Mr.Wizard    schedule 16.04.2011


Ответы (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.

person fairflow    schedule 14.02.2013
comment
О, и для этого подхода потребуется идея @BrettChampion о кнопке или подобном; это не будет автоматически при сохранении. Вероятно, есть способ изменить внешний интерфейс, чтобы запускать это при каждом сохранении. Я бы не знал, как это сделать. - person fairflow; 14.02.2013