2009-07-17 33 views
16

Tôi đã có một yêu cầu khá đơn giản trong chương trình Đề án của mình để thực hiện nhiều hơn hơn một tuyên bố, trong điều kiện đúng của 'if'. . Vì vậy, tôi viết mã của tôi, một cái gì đó như thế này:Về "Nếu .." trong Đề án (sơ đồ)

(if (= 1 1) 
((expression1) (expression2)) ; these 2 expressions are to be 
           ; executed when the condition is true 
    (expression3)) 

Rõ ràng, ở trên không làm việc, kể từ khi tôi có vô tình tạo một thủ tụC# với # luận. Vì vậy, để hoàn thành công việc của tôi, tôi chỉ cần đặt các biểu thức ở trên vào một hàm mới và gọi nó từ đó, thay cho biểu thức1, expression2. Nó hoạt động.

Vì vậy, quan điểm của tôi ở đây là: có bất kỳ cấu trúc có điều kiện nào khác mà có thể hỗ trợ yêu cầu của tôi ở đây không?

Trả lời

22

Trong MIT-Scheme, mà không phải là rất khác nhau, bạn có thể sử dụng begin:

(if (= 1 1) 
    (begin expression1 expression2) 
    expression3) 

Hoặc sử dụng Cond:

(cond ((= 1 1) expression1 expression2) 
     (else expression3)) 
+0

Lưu ý rằng biểu thức thứ hai thực sự giống như lần đầu tiên: (cond ...) functi trên có một tiềm ẩn (bắt đầu ...) trong mỗi điều kiện nó kiểm tra, vì vậy chúng có thể giống nhau. –

1

Bạn có thể sử dụng COND, hoặc đặt các biểu thức vào một cái gì đó như PROGN trong Lisp (Tôi không chắc chắn nó được gọi như thế nào trong PLT Scheme. chỉnh sửa: nó được gọi là BEGIN).

COND trông như thế này trong Đề án:

(cond [(= 1 1) 
     (expression1) 
     (expression2)] 
     [else 
     (expression3)]) 
1

bạn có thể sử dụng (bắt đầu ...) để có được những gì bạn muốn trong nhánh thực sự của câu lệnh if của bạn. Xem here

2

(begin ...) là cách bạn đánh giá nhiều biểu thức và trả lại biểu thức cuối cùng. Nhiều cấu trúc khác hoạt động như các khối "ẩn" begin (chúng cho phép nhiều biểu thức giống như khối begin nhưng bạn không cần phải nói begin), giống như phần thân của một mệnh đề cond, phần thân của một đối tượng là define cho hàm, phần thân a lambda, phần thân của let, v.v. bạn có thể đã sử dụng nó mà không nhận ra nó. Nhưng đối với if, điều đó là không thể trong cú pháp bởi vì có hai biểu thức (một cho đúng và một cho sai) bên cạnh nhau, và do đó cho phép nhiều biểu thức sẽ làm cho nó mơ hồ. Vì vậy, bạn phải sử dụng cấu trúc rõ ràng begin.

0

Sử dụng một tuyên bố if với hơn hai trường hợp liên quan đến làm tổ, ví dụ:

(if (test-1)    ; "if" 
    (expression-1) 
    (if (test-2)   ; "else-if" 
     (expression-2) 
     (expression-3))) ; "else" 

Sử dụng cond có vẻ là cách ưa thích để thể hiện báo cáo có điều kiện vì nó là dễ dàng hơn để đọc hơn là một loạt các lồng if s và bạn cũng có thể thực hiện nhiều câu lệnh mà không cần phải sử dụng mệnh đề begin:

(cond ((test-1) 
     (expression-1)) 
     ((test-2) 
     (expression-2) 
     (expression-3)) 
     (else 
     (default-expression)))