2012-03-28 27 views
11

Nhìn vào một ngữ pháp OCaml không chính thức trong this site sản xuất duy nhất mà begin xuất hiện là:là bắt đầu..thêm vào đường cú pháp OCaml?

Expression ::= begin Expression end 

và xa hơn một chút một xuống thấy:

Expression ::= ( Expression [:Type] ) 

đó, cùng với một số thay thế ngay các begin/end với (/) trong một số mã tầm thường (không ảnh hưởng đến tính đúng đắn) có vẻ như gợi ý rằng từ khóa beginend s chỉ là cú pháp. Hay tôi đang thiếu một cái gì đó?

Trả lời

27

"Đường cú pháp" gợi ý một bản dịch đơn giản nhưng không tầm thường đối với các cấu trúc khác. begin .. end không phải là cú pháp đường, nó là dư thừa với (..), bởi vì nó chính xác điều tương tự.

Nếu bạn quan tâm, ý định là các lập trình viên có thể sử dụng begin .. end để kèm theo biểu thức bắt buộc, được thực hiện cho các tác dụng phụ và (..) cho biểu thức có giá trị không đơn vị. Nhưng trình biên dịch không thực thi điều đó, các nhà thiết kế ngôn ngữ chỉ nghĩ rằng nó sẽ đẹp hơn nếu chúng được sử dụng trong thời trang này, đó là tất cả.

+3

Ai nói rằng đường cú pháp không phải là tầm thường? Điều đó có nghĩa là gì? Tôi chắc chắn sẽ phân loại đầu tiên là đường cú pháp. –

+5

@AndreasRossberg Nếu trình biên dịch OCaml dịch 'bắt đầu .. kết thúc' thành' (..) 'nội bộ, trước đây sẽ là cú pháp đường. Trình biên dịch không làm điều này trong bất kỳ ý nghĩa có ý nghĩa. Thay vào đó, cả hai cấu trúc đều được mã hóa hoàn toàn trong việc xây dựng AST. ** Không được dịch sang ngôn ngữ khác. ** –

+0

@AndreasRossberg Tôi biết về sự khác biệt về văn hóa và tất cả điều đó, nhưng tôi thấy nhận xét của bạn hơi không hiệu quả. Vì bạn đang bình luận không đồng ý, bạn có thể cố gắng giải thích quan điểm của bạn tốt hơn một chút, ví dụ, "Tại sao bạn nói rằng bạn không thể biên dịch riêng mã gốc trong Ocaml? Tất nhiên bạn có thể."? Tôi không nên, trong trường hợp cụ thể đó, phải nói với bạn để làm theo các liên kết tôi đã cung cấp hoặc lặp lại những gì được nói ở đó. –

9

Thực tế, có một số cách sử dụng dấu ngoặc đơn trong ngữ pháp OCaml cho các quy tắc ngữ pháp khác nhau, và không phải tất cả chúng có thể được sử dụng với bắt đầu..thêm. Dấu ngoặc đơn và bắt đầu..thêm có thể được sử dụng làm dấu phân cách biểu thức ngữ nghĩa miễn phí cho mục đích định hướng (như bạn đã nói, expr ::= '(' expr ')'). () cũng đại diện cho hằng số loại unit và, như một trò chơi chữ, begin end cũng được cho phép ở đó - nhưng điều cuối cùng này không được chỉ định trong sách hướng dẫn, chỉ được hỗ trợ thường xuyên bởi việc triển khai.

Nhưng ngoặc cũng có thể được sử dụng

  • để phân định mẫu: function (_::_)::_ -> ...
  • như cú pháp đường cho Array.getArray.set: t.(i)t.(i) <- e
  • cho loại chú thích (e : t) cả trong các biểu thức và mô hình (đây là không phải một trường hợp đặc biệt của các dấu phân cách định hướng vì nó không hợp lệ nếu không có dấu ngoặc đơn)
  • cho coercions subtyping: (e :> t)(e : s :> t)
  • để tạo thành hợp chất mẫu nhãn: fun ~(x:int) ..fun ?(x=10) ..
  • ở những nơi khác nhau có liên quan (coercions, chú thích, vv) trong các mô-đun, chữ ký và lớp/đối tượng bộ phận của cú pháp

Đối với không ai trong số này sử dụng có thể sử dụng thay begin..end, vì vậy nó chắc chắn sẽ không có giá trị để thay thế ( với begin) với end cách có hệ thống (trong khi ngược lại là đúng).

Xin lỗi vì câu trả lời về ngữ nghĩa, nhưng câu hỏi đã khá chính xác. Tôi không chắc chắn bắt đầu ..xử lý cuối cùng là phần thanh lịch nhất của ngữ pháp OCaml (có rất nhiều mụn cóc). Người ta có thể ước rằng họ thực sự là tương đương, nhưng sau đó có rất ít điểm nhấn mạnh vào việc viết begin x : int end thay vì (x : int).

+1

Pedantic có nghĩa là chính xác, với một ý nghĩa mạnh mẽ của _overly exact_. Câu trả lời của bạn chính xác là IMO. –

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