2011-12-22 20 views
6

Thỉnh thoảng, chúng tôi muốn xem xét các hàm số System` nhất định được định nghĩa như thế nào (khi chúng được viết bằng Mathematica). Câu hỏi này là về cách tốt nhất để làm điều đó.Cách tốt nhất để đọc mã của hàm đã được xác định (đặc biệt là từ ngữ cảnh System`) là gì?

điểm cần lưu ý:

  • Trong couse ReadProtected cần phải được loại bỏ đầu tiên.

  • Nội trang thường cần phải được sử dụng ít nhất một lần trước khi chúng được tải vào hạt nhân. Một lời gọi đơn giản thường đủ cho điều này khi chúng có chức năng mở rộng (ví dụ: thông qua các tùy chọn)?

  • Information (??) cung cấp định nghĩa theo định dạng khó đọc (không có thụt đầu dòng và tất cả các tên ngữ cảnh riêng được thêm vào trước). Cách tốt nhất để loại bỏ tên ngữ cảnh là gì và lấy mã được định dạng?

    Một ý tưởng để loại bỏ các ngữ cảnh nhất định là Block[{$ContextPath = Append[$ContextPath, "SomeContext`Private`"], Information[symbol]]. Mã có thể được định dạng tự động bằng cách sử dụng Workbench. Vẫn còn một số vấn đề, ví dụ: Information không trích dẫn chuỗi, ngăn không cho mã có thể được sao chép vào Bàn làm việc.

Nói chung, tôi quan tâm đến cách mọi người làm điều này, phương pháp họ sử dụng để tạo mã nội dung dễ đọc nhất có thể.

Trường hợp sử dụng: Ví dụ, gần đây tôi đã đào vào mã số RunThrough khi tôi phát hiện ra rằng nó không hoạt động trên Windows XP (hóa ra không báo giá tên của tệp tạm thời khi đường dẫn đến chúng chứa không gian).


Cập nhật:It appears rằng có từng là một chức năng cho các định nghĩa in ấn mà không bối cảnh prepended, Developer`ContextFreeForm, nhưng nó không làm việc nữa trong các phiên bản mới hơn.

+0

Bạn có thể loại bỏ các tên bối cảnh riêng bằng cách nhập ngữ cảnh trước khi gọi '?? '. – cah

Trả lời

7

Về khá-in: sau đây là một mã rất sơ đồ được xây dựng dựa trên câu trả lời của @ Mr.Wizard để hiển thị rằng một vài quy tắc đơn giản có thể đi một chặng đường dài để cải thiện khả năng đọc của mã:

Internal`InheritedBlock[{RunThrough}, 
    Unprotect[RunThrough]; 
    ClearAttributes[RunThrough, ReadProtected]; 
    Block[{$ContextPath = Append[$ContextPath, "System`Dump`"]}, 
     With[{boxes = [email protected] DownValues[RunThrough]}, 
     CellPrint[Cell[BoxData[#], "Input"]] &[ 
      boxes /. 
      f_[left___, "\[RuleDelayed]", right___] :> 
       f[left, "\[RuleDelayed]", "\n", right] //. 
      { 
      RowBox[{left___, ";", next : Except["\n"], right___}] :> 
       RowBox[{left, ";", "\n", "\t", next, right}], 
      RowBox[{sc : ("Block" | "Module" | "With"), "[", 
       RowBox[{vars_, ",", body_}], "]"}] :> 
       RowBox[{sc, "[", RowBox[{vars, ",", "\n\t", body}], "]"}] 
      }]]]] 

Đây chắc chắn không phải là giải pháp chung (đặc biệt nó không hoạt động tốt trên mã chức năng lồng nhau sâu mà không có nhiều báo cáo), nhưng tôi chắc chắn nó có thể được cải thiện và tổng quát mà không có quá nhiều rắc rối để bao gồm nhiều trường hợp quan tâm.

+0

Điều này hoạt động rất tốt cho các mục đích thực tế trong ví dụ giới hạn này! @ Mr.Wizard Tôi tìm thấy một [visualization thú vị của M- mã chương trình] (http://taliesinb.net/quicksort-in-61-characters), tiếc là ông không đưa ra mã để sản xuất nó. – Szabolcs

+0

@ Szabolcs: Thú vị. Bạn đã thử liên hệ với tác giả chưa? –

+0

@ Mr.Wizard Có, không trả lời cho đến nay. Nhưng đó là mùa lễ. – Szabolcs

5

Câu hỏi hay, bởi vì tôi không nghĩ rằng tôi đã thấy điều này được thảo luận.

Tôi thực chất giống như bạn đã phác thảo. Bạn có thể nhận được một bản in ra hơi khác với Definition, và biết thêm thông tin với FullDefinition:

Unprotect[RunThrough]; 

ClearAttributes[RunThrough, ReadProtected] 

Block[{$ContextPath = Append[$ContextPath, "System`Dump`"]}, 
    Print @ FullDefinition @ RunThrough 
] 
+0

+1 Tôi không nhận ra rằng bạn có thể thao tác với đường dẫn ngữ cảnh để đạt được cùng một mục tiêu (trong việc loại bỏ các tên ngữ cảnh riêng được thêm vào trước đó). Tôi luôn sử dụng BeginContext.Tôi nghĩ phần còn lại của câu hỏi OPs đánh giá "làm thế nào để bạn in mã Mathematica?" Mã định dạng mã nguồn duy nhất mà tôi biết là trong trình đơn ngữ cảnh trình soạn thảo của Wolfram Workbench. – cah

+0

@cah Có một vấn đề quan trọng hơn. Hãy thử sao chép mã 'RunThrough' sang Workbench và bạn sẽ thấy nó cung cấp các lỗi cú pháp. Đó là bởi vì dấu ngoặc kép xung quanh chuỗi không được in, và điều này thậm chí có chứa một cặp vợ chồng trên chuỗi chỉ khoảng trắng. Vì vậy, điều tiếp theo là: làm thế nào để có được nguồn trên một hình thức dễ đọc? Phương thức '$ ContextPath' mà tôi đã đề cập trong câu hỏi của tôi quá nhỏ. – Szabolcs

+0

@cah Những gì 'Begin' và bạn bè làm chỉ đơn giản là sửa đổi' $ ContextPath', không có gì hơn. – Szabolcs