Như đã được chỉ ra trong phạm vi post gần đây không hoạt động như mong đợi bên trong Mô-đun.Tại sao Mathematica phá vỡ các quy tắc phạm vi bình thường trong Mô-đun?
Một ví dụ từ chủ đề đó là:
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*2 z*)
Nhưng sau hoạt động gần như mong đợi.
Module[{expr},
expr = 2 z;
[email protected]@{f[z_], expr};
f[7]]
(*14*)
Xem xét thiết kế ngôn ngữ nào khiến wolfram chọn chức năng này?
Chỉnh sửa: Xem nhận xét đầu tiên của Jefromi Tôi đã thay đổi z từ biến cục bộ thành không và quên thay đổi đầu ra. Nó không ảnh hưởng đến vấn đề.
Chỉnh sửa2: Điểm của Michael Pilat có vẻ là Khối và Mô-đun có các chức năng khác nhau. Tôi nghĩ rằng tôi hiểu quan điểm của anh ấy, nhưng tôi nghĩ rằng đó là trực giao với câu hỏi của tôi. Đây là bản cập nhật.
tôi có thể sử dụng đoạn mã sau vào cấp độ toàn cầu trong một máy tính xách tay:
expr = 2 z;
f[z_] = expr;
f[7]
(*output: 14*)
Nhưng khi tôi đặt khối mã tương tự thành một Module và làm expr địa phương nó tạo ra một đầu ra khác nhau.
Clear[f];
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*output: 2z*)
Nếu bạn theo dõi ở trên Mô-đun gọi bạn thấy rằng Set [f [z_], expr] được viết lại thành [f [z $ _, expr]. Bây giờ chuyển đổi z-> z $ này xảy ra trên cả lhs và rhs của Set. Tuy nhiên nó xảy ra trước khi expr được đánh giá, điều này gây ra một kết quả khác nhau sau đó sẽ thu được ở mức toàn cầu.
Biến đổi z-> z $ dường như chỉ xảy ra khi các vần có biểu tượng cục bộ cho cuộc gọi Mô-đun.
Tại sao Mathematica chọn thay đổi cú pháp này trong cuộc gọi Mô-đun? Sự cân bằng thiết kế ngôn ngữ/triển khai thực hiện ở đây đã đưa ra quyết định này.
Bạn đang sử dụng phiên bản toán học nào? Đầu tiên có thực sự cung cấp cho bạn z địa phương của mô-đun ('z $ 1776') thay vì chỉ' 2z' (đó là những gì tôi nhận được, sử dụng phiên bản 6.0.0). – Cascabel
Hoặc là z cục bộ được tạo bởi kết hợp mẫu? – Cascabel
Từ Trace, Mathematica quyết định rằng vì có một biến cục bộ trên RHS của tập, nó sẽ sử dụng biến cục bộ cho mẫu ('f [z $ _] = expr $ 64'). Trong tất cả các trường hợp khác tôi có thể nghĩ đến, khi RHS không chứa biến cục bộ, nó sử dụng 'f [z_] = ...'. Có lẽ có một số trường hợp đánh giá hợp lý trong đó hành vi này có ý nghĩa, nhưng tôi chắc chắn không thể nghĩ về nó. 1, và tôi hy vọng ai đó quản lý để trả lời. – Cascabel