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.get
và Array.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)
và (e : s :> t)
- để tạo thành hợp chất mẫu nhãn:
fun ~(x:int) ..
và 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à )
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)
.
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. –
@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. ** –
@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 ở đó. –