" Lập trình chức năng thuần túy " theo định nghĩa chính thức của nó là về ý tưởng thiết kế các máy tính có đầu ra hoàn toàn là "một chức năng của đầu vào cho máy" . Nếu bạn cung cấp cùng một đầu vào vào máy, nó sẽ tạo ra cùng một đầu ra. Mỗi đầu vào được đặt tên rõ ràng để bạn biết chính xác các phụ thuộc là gì. Một ngôn ngữ lập trình chức năng thuần túy thực thi điều này một cách nghiêm ngặt.
Tuy nhiên ... trong đường cơ sở "Rebol", bạn có thể viết những thứ như:
foo: function [value [integer!]] [
either now/date = 20-Feb-2013 [
value + 1
] [
value
]
]
Ở đây chúng ta thấy một hàm trả về đầu vào số nguyên của nó mỗi ngày nhưng hôm nay, nơi bạn nhận được giá trị cộng với một. Nó bao gồm một phụ thuộc vô hình vào ngày không được chỉ định chính thức làm đối số cho hàm. Đó là thứ khiến người Haskell và những người theo chủ nghĩa phần mềm như tôi hét lên giết người đẫm máu.
Do đó Rebol không phải là chức năng thuần túy ra khỏi hộp. (... Nhưng đọc tiếp ...)
Định nghĩa ít nghiêm ngặt hơn về lập trình hàm là khi các hàm có thể đóng vai trò là các giá trị trong ngôn ngữ. Vì vậy, bạn có thể gán một hàm cho một biến và sử dụng nó sau. Theo nghĩa đó, bạn có thể đọc các lượt thích là javascript một ngôn ngữ chức năng và thấy rằng định nghĩa xúc xắc sẽ khiến một số người nói Javascript là ngôn ngữ chức năng. Nếu bạn sẽ lỏng lẻo với định nghĩa thì đây sẽ là "chức năng":
>> foo: does [a + 10]
>> a: 20
>> print foo
== 30
(Lưu ý: DOES là sự thuận tiện để xác định hàm không có đối số, chỉ có phần thân.)
Tôi không biết rằng tôi cho rằng (hoặc JavaScript) phù hợp với những gì tôi nói chuyện sẽ gọi là lập trình chức năng. YMMV.
Nếu bạn dành bất kỳ thời gian nào cho khoa học máy tính, bạn sẽ tìm hiểu về những thứ như Turing Tarpits và khả năng tính toán và các nguyên tắc tương đương này trong đó "nếu bạn có thể kết nối X với Y thì Z sẽ là sự thật". Và giống như bạn có thể viết một triển khai Haskell bằng C, và sau đó hạn chế chỉ sử dụng các cuộc gọi C được ánh xạ vào thư viện Haskell, bạn có thể cho rằng mình đang thực hiện "lập trình chức năng" và đúng về mặt kỹ thuật.
Vì vậy, nếu bạn muốn nói Rebol có thể bị bẻ cong theo phong cách lập trình chức năng, bạn có thể là một người bi quan và nói "tốt hơn là giả vờ bạn đang làm C khi bạn thực sự sử dụng một tập hợp con ngôn ngữ hạn chế như vậy mà bạn ' đang sử dụng Haskell bằng proxy " . Thủ thuật của tay áo Rebol là cách bạn dễ dàng trượt từ mô hình "quay số" này sang mô hình khác. Viết một chút tên miền cụ thể ngôn ngữ đó xảy ra là chức năng rất dễ dàng và tự nhiên mà nó không cảm thấy như bạn đang xoắn ngôn ngữ của bạn ra khỏi doanh để làm điều đó. Khả năng tạo các ngôn ngữ cụ thể cho miền có đặc tính chức năng dẫn đến việc gắn nhãn Rebol là "mô hình trung lập" .
Nhiều người trộn lẫn Rebol với phương ngữ phổ biến nhất (phương ngữ DO) và nghĩ rằng "đó là Rebol là gì". Nhưng "bản chất" của Rebol giống với XML hơn, đó là một định dạng trao đổi dữ liệu ngẫu nhiên (được chứ không phải ngẫu nhiên) có mã được tối ưu hóa siêu tập trung vào việc xử lý nó theo một số cách nhất định. Để có một nền tảng tốt về cách nó đánh bại quần khỏi XML, hãy xem XML đã bị lỗi từ Khởi đầu bởi Carl Sassenrath của AmigaOS (và giờ là Rebol) nổi tiếng.