2013-02-18 36 views
6

Trong lược đồ là ngôn ngữ lập trình hàm, không có câu lệnh gán. Nhưng trong một tuyên bố letĐề án cho phép

(let ((x 2)) 
    (+ x 3)) 

Bạn đang chuyển nhượng 2-x, vậy tại sao không này vi phạm nguyên tắc là không có câu lệnh gán trong lập trình chức năng?

Trả lời

11

Câu lệnh "Lược đồ là ngôn ngữ lập trình chức năng" không chính xác. Trong Đề án, một kiểu lập trình chức năng được khuyến khích, nhưng không bị ép buộc. Trong thực tế, bạn có thể sử dụng set! (một câu lệnh gán!) Cho việc thay đổi giá trị của bất kỳ biến:

(define x 10) 
(set! x (+ x 3)) 
x 
=> 13 

Về báo cáo kết quả let của câu hỏi, hãy nhớ rằng một biểu thức như thế này một:

(let ((x 10)) 
    (+ x 3)) 
=> 13 

... nó chỉ là cú pháp đường, và dưới mui xe nó thực hiện như thế này:

((lambda (x) 
    (+ x 3)) 
10) 
=> 13 

Chú ý rằng một.210 thực hiện một lần single assignments trên các biến của nó, vì vậy nó không vi phạm bất kỳ nguyên tắc lập trình hoàn toàn chức năng cho mỗi gia nhập, sau đây có thể được khẳng định của một biểu thức let:

Một đánh giá của một biểu thức không có một tác dụng phụ nếu nó không thay đổi trạng thái quan sát của máy, và tạo ra cùng một giá trị cho cùng một đầu vào

Ngoài ra, trích dẫn từ Wikipedia:

Các ngôn ngữ chức năng không ổn định cung cấp cả việc gán đơn cũng như gán đúng (mặc dù việc gán đúng thường được sử dụng với tần suất ít hơn so với các ngôn ngữ lập trình bắt buộc). Ví dụ, trong Đề án, cả hai nhiệm vụ duy nhất (với let) và phân công đúng (với set!) có thể được sử dụng trên tất cả các biến, và nguyên thủy chuyên ngành được cung cấp để cập nhật phá hoại bên trong danh sách, vectơ, dây vv

+1

Một ngôn ngữ lập trình chức năng khuyến khích và cung cấp các tính năng nhưng không nhất thiết phải thực thi lập trình chức năng. – ThePiercingPrince

Các vấn đề liên quan