2014-04-02 17 views
12
function A: Boolean; 
function B: Boolean; 

I (vô tình) đã viết này:Tại sao biểu thức Boolean (với các hiệu ứng phụ) không đủ như một câu lệnh?

A or B; 

Thay vì rằng:

if not A then 
    B; 

Trình biên dịch từ chối hình thức đầu tiên, tôi tò mò tại sao?

Với đánh giá ngắn mạch, cả hai sẽ làm điều tương tự, phải không?

Làm rõ: Tôi đã tự hỏi tại sao ngôn ngữ không được thiết kế để cho phép biểu thức của tôi như một tuyên bố.

+0

Thực ra, tôi rất vui vì điều này không được phép vì IMHO không thể đọc được. Câu hỏi thú vị mặc dù. – jpfollenius

+1

Bởi vì Delphi không phải là fractal của PHP được nêu ra. –

Trả lời

5

Đơn giản, vì trình biên dịch đang mong đợi một statement và cụm từ mà bạn đã cung cấp không phải là một tuyên bố.

Tham khảo documentation và bạn sẽ tìm thấy danh sách các câu lệnh hợp lệ. Không thể tìm thấy biểu thức của bạn trong danh sách đó.

Bạn đã hỏi ý kiến ​​(hiện đã bị xóa) tại sao các nhà thiết kế ngôn ngữ bầu không biểu hiện như một tuyên bố. Nhưng câu hỏi đó ngụ ý mục đích mà ở đó có thể không có. Hoàn toàn chính đáng là các nhà thiết kế đã không quyết định không làm điều này. Thay vào đó họ không bao giờ xem xét việc làm nó ở nơi đầu tiên. Các ngôn ngữ thường được thiết kế để giải quyết các vấn đề cụ thể. Nó hoàn toàn hợp lý rằng các nhà thiết kế đơn giản không bao giờ xem xét việc xử lý các biểu thức như câu lệnh.

5

Biểu mẫu đầu tiên là biểu thức đánh giá giá trị Boolean, không phải là một câu lệnh.

9

Đầu tiên là một biểu thức. Biểu thức được đánh giá. Biểu thức không có tác dụng phụ có thể nhìn thấy (như đọc hoặc viết một biến). Cả hai toán hạng của biểu thức là các hàm và các toán hạng có thể có các tác dụng phụ, nhưng để có các hiệu ứng phụ, một câu lệnh phải được thực thi.

Câu thứ hai là tuyên bố. Nó so sánh kết quả của một biểu thức và dựa trên việc đánh giá gọi một hàm khác.

Phần khó hiểu, là trong trường hợp này, Delphi cho phép chúng ta bỏ qua kết quả của một hàm và thực hiện nó như một hàm. Vì vậy, bạn mong đợi tương tự cho A or B. Nhưng điều đó không được phép. Điều này thật tuyệt vì hành vi không rõ ràng. Ví dụ: nếu bạn đã bật đánh giá lười biếng. Và A đánh giá đúng, là B được gọi là có hoặc không.

+2

Điều đáng nói là bạn chỉ có thể xây dựng một câu lệnh hợp lệ cũng sẽ thực thi không rõ ràng 'B' tùy thuộc vào đánh giá lười biếng. 'if (A hoặc B) sau đó ...' etc –

+0

"Biểu thức không có tác dụng phụ nhìn thấy được (như đọc hoặc ghi một biến)." Viết một biến * là * một hiệu ứng phụ có thể nhìn thấy! Chưa kể rằng các cuộc gọi hàm cũng là các biểu thức, tất nhiên có thể có các phản ứng phụ. – munificent

2

Tại trung tâm của nó, Delphi là Pascal. Ngôn ngữ Pascal được thiết kế bởi Nicklaus Wirth và được xuất bản vào năm 1968. Bản sao của Hướng dẫn sử dụng và Báo cáo là từ năm 1978. Nó được thiết kế với hai mục đích trong đầu, như một ngôn ngữ giảng dạy và là một ngôn ngữ dễ thực hiện trên bất kỳ máy nào . Trong đó ông đã thành công ngoạn mục.

Wirth đã quen thuộc với các ngôn ngữ khác của thời đại (bao gồm Fortran, Cobol và đặc biệt là Algol) và thực hiện một loạt các lựa chọn cẩn thận với mục đích cụ thể trong đầu. Đặc biệt, ông cẩn thận tách khái niệm 'hành động' khỏi 'giá trị'. Các 'hành động' trong Pascal là các câu lệnh trong ngôn ngữ, bao gồm cả cuộc gọi thủ tục. 'Các giá trị' bao gồm các cuộc gọi hàm. Trong điều này và một số khía cạnh khác ngôn ngữ là khá giống với Algol.

Cú pháp khai báo và sử dụng các hành động và giá trị được lưu giữ khá riêng biệt.Ngôn ngữ và các thư viện được cung cấp với nó không nói chung có 'tác dụng phụ' như vậy. Thủ tục làm mọi thứ và biểu thức tính giá trị. Ví dụ, 'đọc' là một thủ tục, không phải là một hàm, bởi vì nó lấy một giá trị và tiến bộ thông qua tệp, nhưng 'eof' là một hàm.

Phiên bản thị trường đại chúng của Pascal được Borland tạo ra vào giữa những năm 1980 và sau đó trở thành Turbo Pascal cho Windows và sau đó là Delphi. Ngôn ngữ đã thay đổi rất nhiều và không phải tất cả nó đều thuần khiết như Wirth đã thiết kế nó. Đây là một tính năng đã tồn tại.

Ngẫu nhiên, Pascal không có đánh giá ngắn mạch. Nó có bộ nhớ heap và bộ, nhưng không có đối tượng. Họ đến sau.

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