Có hai trường hợp khác nhau để xem xét, tùy thuộc vào cú pháp ngôn ngữ của bạn. Nếu ngôn ngữ của bạn sử dụng dấu ngoặc đơn để biểu thị ứng dụng chức năng (ví dụ f(2+1)
) thì quyền ưu tiên là không liên quan. Hàm nên được đẩy lên ngăn xếp và bật ra sau (ví dụ ở trên, kết quả là 2 1 + f
). Ngoài ra, bạn có thể coi hàm là một giá trị và xuất nó ngay lập tức và xuất ra một hoạt động gọi hàm sau dấu ngoặc đơn (nếu không được xử lý giống như bất kỳ dấu ngoặc đơn nào khác), ví dụ f 2 1 + $
, $
hoạt động gọi hàm là gì.
Tuy nhiên, nếu ngôn ngữ của bạn không sử dụng dấu ngoặc đơn để biểu thị lời gọi hàm, mà thay vào đó, đặt đối số trực tiếp sau hàm mà không có dấu câu đặc biệt nào (ví dụ f 2 + 1
), như trường hợp của ví dụ Wikipedia, thì mọi thứ phức tạp hơn một chút. Lưu ý rằng biểu thức tôi vừa đưa ra một ví dụ không rõ ràng: f được áp dụng cho 2 và 1 được thêm vào kết quả hay chúng ta thêm 2 và 1 với nhau và sau đó gọi f với kết quả?
Một lần nữa, có hai cách tiếp cận. Bạn có thể chỉ cần đẩy hàm vào ngăn xếp toán tử khi bạn gặp nó và gán cho nó bất cứ thứ gì bạn muốn. Đây là cách tiếp cận đơn giản nhất, và rõ ràng là những gì ví dụ được trích dẫn đã làm. Có những vấn đề thực tế, tuy nhiên. Thứ nhất, làm thế nào để bạn xác định một chức năng? Nếu bạn có một bộ hữu hạn thì thật dễ dàng, nhưng nếu bạn có các hàm do người dùng xác định, điều này có nghĩa là trình phân tích cú pháp của bạn cần phản hồi quá mức vào môi trường của bạn, điều này có thể trở nên lộn xộn nhanh chóng. Và làm thế nào để bạn xử lý các chức năng với nhiều đối số?
Cảm giác của tôi là đối với kiểu cú pháp này, sử dụng các hàm làm các giá trị được xử lý bởi một toán tử ứng dụng hàm có ý nghĩa hơn nhiều. Sau đó, bạn có thể chỉ cần tiêm toán tử ứng dụng bất cứ khi nào bạn đọc một giá trị và điều cuối cùng bạn đọc cũng là một giá trị, vì vậy bạn không cần bất kỳ cách đặc biệt nào để biết định danh nào là hàm. Bạn cũng có thể làm việc với các biểu thức trả về các hàm (khó hoặc không thể với kiểu hoạt động của hàm). Và điều này có nghĩa là bạn có thể sử dụng currying để xử lý nhiều hàm đối số, đây là một sự đơn giản hóa lớn so với việc cố gắng xử lý chúng trực tiếp.
Điều duy nhất bạn cần quyết định sau đó là ưu tiên của ứng dụng chức năng là gì. Sự lựa chọn tùy thuộc vào bạn, nhưng trong mọi ngôn ngữ tôi đã sử dụng hoạt động như thế này, nó đã là toán tử ràng buộc mạnh nhất trong ngôn ngữ và đã được kết hợp đúng. (Biến thể thú vị duy nhất là Haskell, cũng như có phiên bản ràng buộc mạnh được mô tả, cũng có một từ đồng nghĩa với ký hiệu $
là toán tử ràng buộc yếu nhất trong ngôn ngữ, cho phép các biểu thức muốn f 2 + 1
áp dụng f đến 2 và f $ 2 + 1
áp dụng nó cho toàn bộ phần còn lại của biểu thức)
sin( max( 2 3) / 3 * 3.1415)