Rebol có phải là ngôn ngữ lập trình chức năng không?


9

Tôi tình cờ gặp Rebol và tôi đã tự hỏi về nó.

Tôi chạy vào đoạn script sau từ đây :

 use [feed questions answers][
    feed: load-xml/dom http://stackoverflow.com/feeds/tag/rebol
    questions: map-each entry feed/get-by-tag <entry> [
        find/match entry/get <id> "http://stackoverflow.com/q/"
    ]

    answers: make block! length? questions

    foreach question questions [
        question: load-xml/dom join http://stackoverflow.com/feeds/question/ question
        foreach entry next question/get-by-tag <entry> [append answers entry/tree]
    ]

    insert clear feed/find-element <entry> answers
    feed/flatten
 ]

Tất cả các hoạt động thao tác bộ sưu tập như map-eachnhắc nhở tôi về JavaScript và C # cả hai đều có khả năng chức năng.

Rebol có phải là ngôn ngữ chức năng không? Nó có hỗ trợ lập trình chức năng không? Nó sẽ phân loại như một ngôn ngữ chức năng thuần túy (PFL)?


5
Đây là câu trả lời từ người tạo ra REBOL: REBOL có phải là ngôn ngữ chức năng thuần túy không?
Greg Hewgill

1
@GregHewgill Cảm ơn bạn về tài nguyên đó. Tôi đã hỏi câu hỏi này sau khi trò chuyện trong phòng trò chuyện Rebol của StackOverflow ( chat.stackoverflow.com/transcript/message/7836761#7836761 ). Họ (Chúng tôi) đã tìm ra rằng vì không có thông tin về điều này trên các lập trình viên hoặc các trang web khác trong StackExchange, tôi nên hỏi nó ở đây để tham khảo trong tương lai. Liên kết đó rất tuyệt nhưng nó có thể được mở rộng và giải thích ở đây để nhiều người dùng không có kinh nghiệm lập trình viên Rebol có thể hiểu nó. Một câu trả lời với trích dẫn từ bài báo đó và kinh nghiệm phát triển cá nhân sẽ được đánh giá cao.
Benjamin Gruenbaum

Các thuộc tính hầu như không cải thiện kịch bản XML của Carl: bạn vẫn có siêu dữ liệu dư thừa (tên thuộc tính) và các giá trị chưa được đánh dấu (nội dung thuộc tính). Siêu dữ liệu ngầm của Rebol được cung cấp bởi các loại được xác định cẩn thận sẽ loại bỏ gánh nặng công bằng cho việc giải thích. Với XML, trước tiên bạn phải mở khóa các giá trị, sau đó giải mã chúng (ngày được xác định như thế nào trong XML, tôi sẽ kiểm tra thông số RSS hoặc Atom? Bạn có thể biểu thị định nghĩa bằng XML không?), Và sau đó có thể xác thực chúng có thể đánh giá bối cảnh của họ. ** Dự định là một bình luận để đáp lại [bình luận này] ( lập trình

Câu trả lời:


13

" 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.


1
Đó là một câu trả lời tuyệt vời nhưng tôi nghĩ rằng bài viết "Đã bị lỗi từ đầu" là khá tệ. Đầu tiên, anh ta sử dụng XML kém (mọi thứ anh ta đại diện với lồng nhau có thể được biểu diễn bằng các thuộc tính). Thứ hai, các ngôn ngữ được biểu diễn bằng một cấu trúc giống như cây giống với xml. Khi bạn phân tích một câu bạn nhận được một cây phân tích cú pháp, sẽ không công bằng khi so sánh XML chứa thông tin ngữ pháp với chuỗi có tên miền cụ thể. Cảm ơn câu trả lời :)
Benjamin Gruenbaum

2
Tôi là một Rebol n00b và như bạn đã nói, hiện tại tôi cũng đang nghĩ rằng Rebol là phương ngữ DO. Hy vọng thoát ra khỏi suy nghĩ này. :-)
KK.

1
@BenjaminGruenbaum Nếu tôi có thể chỉnh sửa trang web của Carl, hãy tin tôi, tôi sẽ làm thế. :-)
HostileFork nói không tin tưởng SE

@BenjaminGruenbaum Nhưng không phải ngôn ngữ nào cũng có thể tự do thao túng cấu trúc cây đó. Rebol là rất lisp-y về vấn đề đó.
Izkata
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.