2010-11-04 54 views
4

內置的Mathematica命令Save[file, symbol]使用FullDefinition[]來查找定義symbol和所有的輔助定義。如何在不保存附屬定義的情況下在Mathematica中保存與符號關聯的[]定義?

例如,命令

a:=b 
c:=2a+b 
Save[ToFileName[NotebookDirectory[],"test.dat"],c] 

產生含

c := 2*a + b 
a := b 

我有一個計劃了很多美化MakeBoxes類型定義,我做想要的文件TEST.DAT當我保存[]許多單獨的結果時將被保存。

就上面這個簡單的例子而言,我不想將a := b定義保存到文件中。有沒有人知道一個簡單的方法來實現這一點?

回答

9

根據該文件,Save使用FullDefinition什麼時你想要的是它的使用Definition。使用Block,我們可以覆蓋任何符號的全局定義,尤其是與Definition取代FullDefinition在運行Save

Block[{FullDefinition}, 
    FullDefinition = Definition; 
    Save[filename, c] 
    ]; 
FilePrint[filename] 
DeleteFile[filename] 

神品:

c := 2*a + b 

編輯。用正確的屬性包裝東西:

SetAttributes[truncatedSave, HoldRest] 
truncatedSave[filename_, args__] := Block[{FullDefinition}, 
    FullDefinition = Definition; 
    Save[filename, args]]; 
+0

這是一個聰明的魔法!我從不使用'Block []'......我試圖用'Put'構造類似於'truncatedSave'的東西,但失敗了,儘管使用了'HoldRest',對參數的評估過早。 – Simon 2010-11-04 07:27:46

+0

@Simon:是的,儘管我花了很多時間試圖模塊化,塊化和與之間的區別,但我仍然覺得很困惑:) – Janus 2010-11-04 09:31:27

+0

對我來說,就像探索一個無限的迷宮... – 2010-11-04 14:34:19

1

我覺得

DumpSave["test1", c] 

做到這一點。

示例代碼:

a := b; 
c := 2 a + b; 
DumpSave["test1", c]; 
Clear[a, c]; 
<< test1 
?a 
?c 

_____________________ 
Global`a 
_____________________ 
Global`c 
c:=2 a+b 
+0

'DumpSave []'使用不可移植的二進制格式 - 與Save []產生的明文不同。但是你是對的,'DumpSave'不遵循它所保存的依賴關係。 – Simon 2010-11-04 06:11:23

+0

@Simon手冊中指出「只能在寫入它們的相同類型的計算機系統上讀取由DumpSave寫入的文件。」我想知道什麼是*類型的計算機系統...相同的操作系統?相同的處理器家族 – 2010-11-04 06:15:37

+0

我想象相同的處理器家族......但也許操作系統也很重要。 – Simon 2010-11-04 07:29:12

1

警告 - 警告 - 我不知道我在做什麼

剛剛發現這個瀏覽幫助系統隨機。

從未使用RunThrough ...無論如何,似乎做你想做的。

Clear["Global`*"]; 
a := b; 
c := 2 a + b; 
mathcommand = StringReplace[First[$CommandLine], "MathKernel" -> "math"]; 
outputfile = "c:\\rtout"; 
RunThrough[mathcommand <> " -noprompt", Unevaluated[Put[Definition[c], "c:\\rtout"]]] 
FilePrint[outputfile] 
Clear[a, c]; 
<< "c:\\rtout" 
DeleteFile[outputfile] 
?c 

c := 2*a + b 
_______________________________ 
Global`c 
c:=2 a+b 

編輯。作品名單上有一點保留福

Clear["Global`*"]; 

(*Trick here *) 
f[l_] := Definition @@ HoldPattern /@ [email protected]; 
SetAttributes[f, HoldFirst]; 

a := b; 
c := 2 a + b; 
d := 3 a + b; 
mathcommand = StringReplace[First[$CommandLine], "MathKernel" -> "math"]; 
outputfile = "c:\\rtout"; 

RunThrough[mathcommand <> " -noprompt",Unevaluated[Put[Evaluate[[email protected]{c, d}], "c:\\rtout"]]] 

(* test *) 

FilePrint[outputfile] 
Clear[a, c, d]; 
<< "c:\\rtout" 
DeleteFile[outputfile] 
?c 
?d 

+0

我確實想過使用'Put',但是用'RunThrough'來做這件事看起來有點兒困難。對一個符號使用'Put [Definition [c],...]'可以正常工作,但是我無法像在符號列表中使用Save []一樣工作。 – Simon 2010-11-04 07:23:44

+0

@Simon See編輯 – 2010-11-04 14:28:12

相關問題