Tại sao chúng ta phải sử dụng funcall
để gọi các hàm bậc cao hơn trong Common Lisp? Ví dụ, tại sao chúng ta phải sử dụng:Tại sao chúng ta cần funcall trong Lisp?
(defun foo (test-func args)
(funcall test-func args))
thay vì đơn giản:
(defun bar (test-func args)
(test-func args))
Xuất thân từ một nền tố tụng, tôi hơi ngạc nhiên bởi rằng kể từ khi ngôn ngữ tôi hơn được sử dụng để (ví dụ như Python, C#) không cần sự khác biệt. Đặc biệt, ở cấp nguồn ít nhất, trình biên dịch C# biến đổi nó thành một cái gì đó như func.invoke()
.
Vấn đề duy nhất tôi thấy là điều này có nghĩa là chúng tôi không thể gọi chức năng toàn cầu test-func
nữa vì nó sẽ bị che khuất, nhưng đó không phải là vấn đề.
"Khó có vấn đề" là mấu chốt của vấn đề. Trong thực tế, tôi thấy khó có thể gọi funcall và sẽ bất tiện nếu tôi phải chọn tên sáng tạo/kỳ lạ cho các biến để tránh xung đột với CAR, DANH SÁCH, REST, v.v. – Xach