Để đánh giá một combination mà toán tử là một thủ tục phức hợp, trình thông dịch tuân theo quy trình đánh giá tương tự như đối với các combination mà toán tử đặt tên cho các thủ tục cơ sở (+ 1 2). Tức là, trình thông dịch đánh giá các phần tử của combination và áp dụng thủ tục ( là giá trị của toán tử + , – của combination) cho các đối số (là giá trị của các toán hạng của tổ hợp).
Chúng ta có thể giả định rằng cơ chế áp dụng các thủ tục nguyên thủy cho các đối số arguments đã được tích hợp sẵn trong trình thông dịch. Đối với thủ tục phức hợTo illustrate this process, let’s evaluate the combinationp, tiến trình áp dụng như sau:
Để áp dụng một thủ tục phức hợp cho các đối số, đánh giá nội dung <body> của thủ tục với mỗi tham số được thay thế bởi các đối số arguments tương ứng.
Để minh họa cho ví dụ trên, hãy đánh giá combination này:\
(f 5) f là một procedure đã được định nghĩa như trên. Chúng ta bắt đầu truy xuất thông tin phần body của f: (sum-of-squares (+ a 1) (* a 2))
Sau đó thay thế parameter băng đối số 5: (sum-of-squares (+ 5 1) (* 5 2))
Bây giờ, vấn đề giảm xuống với việc evaluation của một combination với 2 operands và một operator là sum-of-squares. Đánh giá combination này sẽ liên quan đến 3 vấn đề con. Chúng ta phải đánh giá operator sum-of-squares để procedures được áp dụng và đánh giá 2 operands để có được các arguments cho operator sum-of-squares. Procedure (+ 5 1) là 6, và 10 đối với procedure (* 5 2), và giờ ta có thể áp dụng sum-of-squares đến 2 đối số là 6 và 10.
Các giá trị này thay thế cho các parameters x và y trong body của sum-of-square, giảm biểu thức trở thành (+ (square 6) (square 10)) .
If we use the definition of square, this reduces to
Nếu chúng ta sử dụng định square đã được định nghĩa trước đó thì nó sẽ trở thành (+ (* 6 6) (* 10 10))
Biểu thức sau đó sẽ trở thành : (+ 36 100) và cuối cùng kết quả là 136
Quá trình vừa được mô tả ở trên gọi là mô hình thay thế cho áp dụng thủ tục. Nó có thể được coi là một mô hình xác định “ý nghĩa” của việc áp dụng thủ tục. Tuy nhiên có hai điểm cần nhấn mạnh:
Thứ tự áp dụng so với thứ tự thông thường
Trình thông dịch đầu tiên đánh giá toán tử và toán hạng rồi áp dụng thủ tục kết quả cho đến các đối số. Đây không phải là cách duy nhất để thực hiện đánh giá. Một mô hình đánh giá thay thế sẽ không
đánh giá các toán hạng cho đến khi cần đến giá trị của chúng. Thay vào đó, trước tiên nó sẽ thay thế các biểu thức toán hạng cho các tham số cho đến khi nó thu được một biểu thức chỉ liên quan đến các toán tử nguyên thủy và sau đó sẽ thực hiện đánh giá.
Nếu chúng ta sử dụng phương pháp này, việc đánh giá (f 5) sẽ tiến hành theo trình tự mở rộng
(sum-of-squares (+ 5 1) (* 5 2))
(+ (square (+ 5 1)) (square (* 5 2)) )
(+ (* (+ 5 1) (+ 5 1)) (* (* 5 2) (* 5 2)))
Sau đó sẽ là:
(+ (* 6 6) (* 10 10))
(+ 36 100)
136
Điều này cho ra câu trả lời tương tự như mô hình đánh giá trước , nhưng quá trình là khác nhau. Đặc biệt, các đánh giá (+5 1) và (* 5 2) mỗi cái được thực hiện hai lần ở đây, tương ứng với việc giảm
biểu thức (* x x) với x được thay thế tương ứng bằng (+ 5 1) và (* 5 2).
Phương pháp đánh giá thay thế “mở rộng hoàn toàn và sau đó thu nhỏ” này được gọi là đánh giá theo thứ tự thông thường, trái ngược với việc “đánh giá đối số và sau đó áp dụng” phương thức mà trình thông dịch thực sự sử dụng, được gọi là đánh giá thứ tự ứng dụng. Có thể chỉ ra rằng, đối với các ứng dụng thủ tục có thể được mô hình hóa bằng cách sử dụng phép thay thế (bao gồm tất cả các quy trình trong hai chương đầu ) và mang lại giá trị tối ưu, đánh giá thứ tự thông thường và thứ tự ứng dụng
tạo ra kết quả giống nhau.
Lisp sử dụng đánh giá theo thứ tự áp dụng, một phần vì hiệu quả thu được từ việc tránh đánh giá nhiều biểu thức như (+ 5 1) và (* 5 2) ở trên và quan trọng hơn là vì việc đánh giá theo thứ tự thông thường trở nên phức tạp hơn nhiều. Mặt khác, đánh giá theo thứ tự thông thường có thể là một công cụ cực kỳ có giá trị và chúng ta sẽ đầu tư tìm hiểu thêm một số tính năng của nó trong những bài viết sau.
3 thoughts on “Mô hình thay thế áp dụng cho các thủ tục.”