2009-03-14 32 views
6

Tôi có một ký ức mờ nhạt của việc có thể viết một câu lệnh if trong một số ngôn ngữ như thế này:Nếu báo cáo

if (foobar == ("this" || "that")) 

Thay vì:

if (foobar == "this" || foobar == "that") 

Sau đó là tiết hơn, và do đó ít về mặt thẩm mỹ hấp dẫn đối với tôi.

Quy ước cũ có được hỗ trợ bằng bất kỳ ngôn ngữ chính nào không? Có một lý do tại sao điều này không được hỗ trợ rộng rãi?

+0

bạn * có thể * viết rằng trong c hoặc C++ .. nó chỉ không làm những gì bạn muốn nó quá;). –

Trả lời

4

Ngôn ngữ lập trình Icon có tính năng này.

Qua việc sử dụng máy phát điện, bạn có thể làm

if i = (0 | 1) then write("0 or 1") 

mà thành công nếu i = 0 hoặc i = 1. Bạn thậm chí có thể làm:

if (i | j | k) = (0 | 1) then write("0 or 1") 

mà thành công nếu có của tôi, j, hoặc k bằng 0 hoặc 1.

Ý tưởng cơ bản đằng sau điều này là mỗi chuỗi (1|2|3..) tạo ra một trình tạo sẽ trả về từng giá trị cho đến khi hết giá trị. Khi bạn sử dụng một máy phát điện trong một boolean sitation như thế này, giá trị sẽ được yêu cầu từ máy phát điện cho đến khi so sánh thành công. Khi bạn kết hợp hai máy phát điện ở hai bên của so sánh, tất cả các kết hợp có thể sẽ được cố gắng cho đến khi một thành công. (Thay vì trả về false, toán tử bình đẳng "thất bại" nếu các giá trị không bằng nhau.)

2

tôi dường như nhớ lại Pascal đã có một tuyên bố in như trong:

if x in (foo, bar) then 
    ... 

Là tại sao nó không được hỗ trợ rộng rãi hơn, nhịp đập tôi. Nó có vẻ giống như một đoạn đường cú pháp khá đẹp.

+0

Cùng một điều hoạt động trong Python cũng như –

+0

Cú pháp trong Pascal được sử dụng tập hợp, mà phải là một loại tích phân. Không có phiên bản nào của Pascal mà tôi biết về các bộ chuỗi được hỗ trợ. –

+0

Dường như tôi nhớ lại Ada cũng hỗ trợ điều này, có lẽ nó không xử lý các chuỗi. –

2

Nơi duy nhất tôi nhớ lại bằng cú pháp đó là COBOL, cách đây khoảng 25 năm.

Tôi nghi ngờ lý do nó không được hỗ trợ rộng rãi là vì nó dẫn đến sự mơ hồ mà trình biên dịch không thể giải quyết. Trong trường hợp cụ thể của bạn, nó không phải là một vấn đề cụ thể bởi vì "điều này" và "đó" là các chuỗi, mà toán tử OR có điều kiện không có ý nghĩa. Nhưng xem xét đoạn này, bằng một ngôn ngữ như C, nơi mà các kết quả của một điều kiện là một giá trị Boolean 0 hoặc 1:

int a = 22; 
int b = 99; 
int rslt = SomeFunction(); 
if (rslt == (a || b)) 

Tại thời điểm này trình biên dịch không thể đáng tin cậy xác định những gì bạn muốn. Bạn có ý định này:

if (rslt == a || rslt == b) 

hoặc, bạn đã có ý định:

if ((rslt == 0 && a == 0 && b == 0) || (rslt == 1 && a == 1 && b == 1)) 

Bạn có thể hạn chế các loại mà cú pháp như vậy có thể được sử dụng, nhưng sau đó bạn đang chồng chất ngoại lệ trên đầu trang của những gì lý tưởng phải là một cú pháp trực giao. Điều đó sẽ gây nhầm lẫn cho người dùng và làm phức tạp trình biên dịch.

Nó cũng buộc các biểu thức được đánh giá khác nhau trong điều kiện hơn trong các câu lệnh gán. Điều đó, quá, chắc chắn sẽ làm phức tạp trình biên dịch.

Nó chắc chắn có thể được thực hiện để làm việc, nhưng tôi nghĩ rằng nó sẽ yêu cầu cú pháp mới với các biểu tượng quá tải, và tất cả cho một lợi ích có vấn đề.

0

Toán tử || là toán tử nhị phân có hai toán hạng và trả về một giá trị duy nhất. Do cách thức biểu thức được đánh giá bằng hầu hết các ngôn ngữ chính, nên không thể sử dụng cú pháp đó để kiểm tra xem một giá trị có bằng một trong một tập hợp các giá trị hay không. Đó là lý do tại sao nó không được hỗ trợ trong hầu hết các ngôn ngữ chính.

Cú pháp in mà @ 1800 THÔNG TIN đã đăng, tuy nhiên, được hỗ trợ bởi nhiều ngôn ngữ. Nếu ngôn ngữ của bạn không được hỗ trợ, bạn có thể chỉ cần tạo một hàm có tên là in() hoặc in_array() có hai đối số, một giá trị và một mảng và trả về true nếu mảng chứa giá trị đó. (Ví dụ: PHP có chức năng in_array() được tích hợp sẵn.)

1

Ngôn ngữ soạn thảo tương tác (văn bản phiêu lưu) Inform hỗ trợ nó bằng toán tử 'hoặc' (khác với logic thông thường hoặc được viết '| | '):

if (qty==2 or 3) 
    print "some"; 
else 
    print "many"; 

có một lý do tại sao điều này không được hỗ trợ rộng rãi?

Đó là một trường hợp đặc biệt đặc biệt; nó không rõ ràng những gì nó làm trong bất cứ điều gì khác nhưng biểu hiện ví dụ đơn giản.

if (n or 8==m+(1 or 2) or 7) // plausible 
if (qty<4 or 5) // huh? 
a= "cat" or "dog" // er 

Các ‘nếu giá trị trong (sequence)’ ký hiệu có sẵn trong Python và ngôn ngữ kịch bản hiện đại khác đã có thể thực hiện trên niche này cho tốt bây giờ.

+0

Hợp lý hoặc được viết '&&'? Methinks bạn có biểu tượng của bạn sai, thưa ông. –

+0

ahem. Bạn nói đúng, ngay cả Thông báo cũng không phải là hư hỏng! – bobince

0

Trong Python bạn có thể viết như thế này

if(foobar in ('this', 'that', 'and something else')) 

('này', 'mà', 'và cái gì khác') - đó là một loại danh sách.

Vì vậy, tôi nghĩ rằng trong bất kỳ ngôn ngữ oop bạn có thể tạo lớp riêng bạn:

MyClass(object): 

    List values 

    def in(value): 
    return search_value_in_values(value) 

và viết một cái gì đó như thế này:

if(new MyClass('this', 'that', 'and something else').in(foobar))