2012-01-04 28 views
7

Câu hỏi: Có thể nhập tệp MX được lưu bằng cách sử dụng DumpSave mà không đánh giá nội dung không?Có thể nhập tệp MX mà không đánh giá nội dung không?


Hãy để tôi minh họa:

Hãy tạo một biến, data:

In[2]:= data = Range[10] 

Out[2]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 

Nó có thể được xuất khẩu sang nhập khẩu từ MX mà không thực hiện bất kỳ định nghĩa:

In[3]:= [email protected][data, "MX"] 

Out[3]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 

Nhưng nếu chúng ta sử dụng DumpSave?

In[4]:= DumpSave["data.mx", data] 

Out[4]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} 

(Và rõ ràng data)

In[5]:= Clear[data] 

On tái nhập, không có gì được trả về:

In[6]:= Import["data.mx", {"MX", "HeldExpression"}] 

Nhưng biến data trở thành định nghĩa một lần nữa, như thể chúng tôi đã sử dụng Get.

In[7]:= data 

Out[7]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 

tôi dự kiến ​​sẽ có để có được một cái gì đó giống như Hold[data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}], ví dụ: một cái gì đó tương tự như những gì sẽ được ghi vào một tập tin .m khi sử dụng Save.


Có lẽ đó là kỹ thuật không thể tránh được những định nghĩa được thực hiện vì DumpSaveGet trực tiếp thao tác các nhà nước hạt nhân thay vì viết và đọc một định nghĩa evaluatable như Save không? Đây chỉ là một phỏng đoán.


(chỉnh sửa) xin lưu ý: Tôi không cố gắng để tiết kiệm trong một cách mà có thể được nhập khẩu "tổ chức". Tôi có thể làm điều đó bằng cách sử dụng Export. Tôi đang tìm cách nhập tệp DumpSave d MX trước đó.


trả lời Có vẻ nó là không thể làm được điều này trừ khi file MX đã được lưu vào đặc biệt cho phép nó.

Trả lời

7

Sự hiểu biết của tôi là logic của tệp .mx là một nghịch đảo: khi bạn tải tệp .mx, định nghĩa (DownValues và các loại khác) cho biểu tượng được tạo ở mức thấp nhất để giá trị được gán trực tiếp đến các vị trí bộ nhớ trong, bằng cách truyền bộ đánh giá chính. Đây là lý do tại sao tải các tệp .mx quá nhanh. Có vẻ như bạn không thể có cả hai - kỳ vọng của bạn tương ứng với mã ký hiệu cấp cao hơn. Tuy nhiên, bạn có thể đóng gói dữ liệu của mình bằng cách sử dụng các biểu tượng trong một số ngữ cảnh, như các xử lý cho dữ liệu đó.

Vì vậy, tôi không thấy vấn đề thực sự ở đây, vì bạn luôn có thể truy vấn DownValues và các ký hiệu ...Values khác và trích xuất r.h.các mặt của các quy tắc trong hình thức chưa được đánh giá (có một số trường hợp bệnh lý mà DownValues không tái tạo lại hoàn toàn các định nghĩa ban đầu được lưu trữ trong chúng, nhưng chúng có nghĩa là không, và không quan trọng lắm). Bạn có thể xác định giao diện nhất định, cho phép bạn trích xuất dữ liệu của mình thông qua một vài hàm (ký hiệu), trong khi dữ liệu có thể sử dụng nhiều ký hiệu hơn bên dưới bìa, sẽ ẩn đằng sau những biểu tượng đó.

EDIT

Nếu bạn kiểm soát việc sử dụng ban đầu của DumpSave, đây là một minh hoạ của một khả năng - bạn có thể tạo ra một tùy chỉnh dumpSave -like chức năng. Đây là những chức năng helper để chuẩn bị thông tin về biểu tượng:

ClearAll[dress]; 
dress[prop_] := 
    Function[s, With[{pr = prop[s]}, Hold[prop[s] = pr]], HoldAll] 

ClearAll[getHeldProperties]; 
getHeldProperties[HoldComplete[s_Symbol]] := 
Thread[ 
    Through[(dress /@ { 
     DownValues, UpValues, OwnValues, 
     SubValues, DefaultValues, NValues, 
     FormatValues, Options, Messages, 
     Attributes 
     })[Unevaluated[s]]], 
    Hold]; 

ví dụ:

In[284]:= 
getHeldProperties[HoldComplete[data]] 

Out[284]= Hold[{DownValues[data]={},UpValues[data]={},OwnValues[data]={HoldPattern[data]:> 
{1,2,3,4,5,6,7,8,9,10}},SubValues[data]={},DefaultValues[data]={}, 
NValues[data]={},FormatValues[data]={},Options[data]={},Messages[data]={}, 
Attributes[data]={}}] 

Bây giờ, các chức năng chính:

ClearAll[dumpSave]; 
SetAttributes[dumpSave, HoldRest]; 
dumpSave[file_String, storage_Symbol, symbs___] := 
    Module[{n = 1}, 
    Replace[ 
     Thread[HoldComplete[{symbs}]], 
     held : HoldComplete[s_] :> 
     (storage[n++] = getHeldProperties[held]), 
     {1}]; 
    DumpSave[file, storage] 
] 

Bạn về cơ bản chỉ là biểu tượng duy nhất là một lưu trữ định nghĩa chưa được đánh giá của các ký hiệu khác. Đây là cách bạn có thể sử dụng nó:

dumpSave["data.mx", storage, data, dumpSave, dress] 

Nếu bây giờ bạn xóa biểu tượng storage và tải lại các tập tin, bạn sẽ nhận thấy rằng tất cả các định nghĩa của các biểu tượng lưu khác được lưu trữ ở dạng unevaluated trong DownValues của storage. Bạn chỉ cần gọi số ReleaseHold để thực hiện các nhiệm vụ, nhưng bạn cũng có quyền truy cập vào chúng theo dạng không được đánh giá.

+0

@Szabolcs tôi đã thêm một số mã để minh họa cho câu trả lời. –

2

Trước tiên, hãy để tôi chỉ ra rằng dường như có một đối số thứ ba không có giấy tờ cho DumpSave. Tôi phát hiện ra điều này trong khi trolling cho các chức năng với MX trong chúng.

Xem cho chính mình bằng cách đánh giá ?System`Private`BuildApplicationMXFunction (khắc phục các dấu ngữ cảnh đó - đánh dấu SO ngăn sử dụng biểu tượng thông thường). Lưu ý rằng trong dòng cuối cùng của hàm, HoldAllComplete được cho làm đối số thứ ba.

Dunno nếu điều đó có được sử dụng hay không. Bất kể, đây là một giải pháp cho những gì tôi nghĩ rằng bạn đang yêu cầu.

Remove[data, assignment]; 
assignment := (data = Range[10]) 

Tùy thuộc vào nội dung bạn muốn, bạn cũng có thể thử assignment := Defer[(data = Range[10])].

Bây giờ đánh giá:

DumpSave["data.mx", assignment, HoldAllComplete] (*Also could try Unevaluated as 3rd arg *) 
Remove[data, assignment]; 
Import["data.mx", "HeldExpression"] 

Và lưu ý rằng data là undefined đến khi đánh giá assignment. Nếu bạn sử dụng phiên bản Defer của assignment, data một lần nữa sẽ không được xác định và nhiệm vụ sẽ trả lại (theo nghĩa đen) data = Range[10] Bạn có thể sử dụng [email protected]@assignment để đánh giá và khôi phục bài tập ban đầu cho data.

(Bây giờ là thời gian để đọc câu trả lời Leonid và xem tôi như thế nào câm !!): D

+0

Nếu bạn đính kèm mã nội tuyến trong backticks đôi (\ '\') sau đó bạn cab bao gồm một backtick duy nhất trong đó. Xem chỉnh sửa của tôi cho câu trả lời của bạn. – Szabolcs

+0

@Szabolcs Cảm ơn. Nghĩ rằng tôi đã thử điều đó.Đôi khi, bản xem trước tức thời có vẻ không ổn định. Một vấn đề khác là khoảng cách trước và sau mã nội tuyến. Nếu bạn đặt một khoảng trắng (giống như một cái bình thường sẽ làm), nó sẽ xuất hiện sắp chữ như hai dấu cách. Để lại không có không gian và có vẻ như nó phải. Tôi sử dụng một số trình duyệt khác nhau, nhưng Chrome hầu hết thời gian. – telefunkenvf14

Các vấn đề liên quan