2011-11-05 26 views
6

Tôi đã tìm thấy câu hỏi này về các chức năng đặc biệt "hoặc" trong chương trình:Tại sao tôi không thể xác định "hoặc chức năng" trong lược đồ?

Joe Hacker tuyên bố ầm ĩ mà không có lý do hoặc trong Đề án cần phải được đặc biệt - nó chỉ có thể được xác định bởi các lập trình viên, như thế này:

(define (or x y) 
    (if x 
     #t 
     y)) 

Joe có đúng không?

Tôi không thể hiểu tại sao không nên làm điều đó.

Có thể một số chuyên gia về chương trình vui lòng giải thích nếu công trình này hoạt động và nếu không: tại sao không?

+1

Tôi không biết bạn đang sử dụng cuốn sách nào để tìm hiểu Đề án, vì vậy tôi phải đi đến [đặc tả ngôn ngữ của Đề án] (http://www.r6rs.org/final/html/r6rs/r6rs-ZH -14.html # node_sec_11.4.5). Nếu không có s, #f được trả về, nếu không, biểu thức được đánh giá từ trái sang phải cho đến khi một số trả về giá trị thực (xem mục 5.7) hoặc số cuối cùng. hoặc biểu thức trả về val mà không đánh giá các biểu thức còn lại. Trong trường hợp thứ hai, biểu thức cuối cùng được đánh giá và các giá trị của nó được trả về. " Chức năng 'hay' của Joe có hoạt động theo cách này không? –

+2

http://www.cs.washington.edu/education/courses/cse341/99wi/scheme/mini-exercises.html –

+1

Nhân tiện, nó * có thể * được định nghĩa bởi lập trình viên, nhưng không phải là một hàm đơn giản. Nó không đặc biệt cho một số giá trị đặc biệt. http://www.scheme.com/tspl4/further.html#defn:or – erjiang

Trả lời

13

Đó là vì phiên bản or đánh giá tất cả đối số của nó (vì đó là hàm), trong khi Lược đồ tiêu chuẩn or (không phải là hàm nhưng cú pháp đặc biệt) thì không. Hãy thử chạy (or #t (exit)) tại REPL của Đề án và sau đó thử cùng chức năng or của bạn.

Hành vi của tiêu chuẩn or đôi khi được gọi là short-circuited: nó chỉ đánh giá những đối số cần thiết. Điều này rất phổ biến đối với toán tử boolean nhị phân (orand) trên các ngôn ngữ lập trình. Thực tế là ortrông giống như một cuộc gọi chức năng là một tính năng của cú pháp Đề án/Lisp, nhưng có vẻ lừa dối.

+0

Đúng vậy! Cảm ơn bạn đã giải thích, điều đó đã giúp ích rất nhiều! – Edgar

1

Cho dù nó hoạt động hay không phụ thuộc vào những gì bạn muốn nó làm. Nó chắc chắn hoạt động theo nghĩa là đối với hai giá trị boolean đã cho, nó sẽ trả về kết quả mong đợi. Tuy nhiên nó sẽ không có chức năng tương đương với thông thường or vì nó không ngắn mạch, tức là định nghĩa của bạn (or #t (/ 0 0)) sẽ gây ra lỗi vì bạn đang chia 0 cho 0 trong khi sử dụng thường xuyên or nó sẽ chỉ trả lại #t và không cố gắng để đánh giá (/ 0 0) ở tất cả.

+0

Đó là nó, cảm ơn bạn! – Edgar

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