2009-10-24 63 views
27

Tôi bị hoang mang bởi tất cả các hàm Mathematica tích hợp nhằm ngăn chặn việc đánh giá theo một cách nào đó: Unevaluated, Defer, Hold và hơn nửa tá biểu mẫu Hold*. Tài liệu Mathematica chỉ giải thích từng chức năng một cách đơn giản mà không giải thích tại sao bạn chọn cái này hay cái kia. Bất cứ ai có thể cung cấp một lời giải thích mạch lạc của tất cả các chức năng này? Toàn bộ mọi thứ có vẻ như một mớ hỗn độn phức tạp với tôi. Liên quan đến tất cả các macro Lisp có thể là một nơi tốt để bắt đầu.Mathematica: Unevaluated vs Defer vs Hold vs HoldForm vs HoldAllComplete vs etc etc

Hầu hết ngôn ngữ Mathematica đều được thiết kế rất đáng kinh ngạc nhưng có vẻ như Wolfram đã tự vẽ mình thành một góc trên khía cạnh này. Hoặc tôi có thể thiếu một cái gì đó.

Trả lời

11

Đây là những cấu trúc khá phức tạp và khó có thể giải thích rõ ràng; chúng không đơn giản như các macro Lisp (hoặc, cho rằng vấn đề, mối quan hệ giữa QUOTEEVAL của Lisp). Tuy nhiên, có một cuộc thảo luận dài, tốt có sẵn ở dạng notes from Robby Villegas's 1999 talk "Unevaluated Expressions" trên trang web của Wolfram.

Defer bị bỏ qua khỏi cuộc trò chuyện đó, vì nó mới với Mathematica 6.0. Nó giống như HoldForm, ngoại trừ khi đầu ra của nó ở mặt trước (nhưng không phải là hạt nhân trần), nó bị tước đi, để lại một biểu thức có thể được sử dụng làm đầu vào. Điều này rất hữu ích nếu bạn muốn lập trình xây dựng các biểu thức mà người dùng có thể chỉnh sửa và đánh giá, nói trong bảng màu.