Tôi đang mô hình hóa một ngôn ngữ lập trình cho vui, và cú pháp bị ảnh hưởng rất nhiều bởi Scala - cụ thể là các định nghĩa hàm.
Tôi đã gặp phải một vấn đề thiết kế vì ngôn ngữ của tôi không phân biệt giữa các hàm được xác định thông qua def
cú pháp (phương thức lớp) và các hàm ẩn danh được gán cho các giá trị (được tạo bằng cách sử dụng =>
) - nó loại bỏ sự khác biệt trong cả cách thực hiện và hành vi .
Kết quả là hai định nghĩa sau có nghĩa giống nhau:
def square(x: Int) = x*x
val square = (x: Int) => x*x
Không có lý do nào để hình thức sau (gán chức năng ẩn danh ngay lập tức) được sử dụng trong mọi tình huống thông thường - đơn giản là có thể sử dụng nó thay vì def
biểu mẫu.
Việc có cú pháp trùng lặp như vậy để xác định các hàm được đặt tên có ảnh hưởng đến tính trực giao của ngôn ngữ hoặc một số khía cạnh thiết kế khác không?
Tôi thích giải pháp này vì nó cho phép các định nghĩa ngắn và trực quan về các phương thức và các hàm được đặt tên (thông qua def
) và các định nghĩa ngắn về các hàm ẩn danh (sử dụng =>
).
Chỉnh sửa: Scala không phân biệt giữa hai - vô danh chức năng là không giống như các phương pháp định nghĩa với def
trong Scala. Sự khác biệt là tương đối tinh tế - xem các bài viết tôi liên kết trước đó.
val
ký hiệu của bạn ?
fun
để xác định hàm đệ quy.
def
. Nó chỉ là một tác dụng phụ của thực tế là một hàm ẩn danh, nói (x : Int) => x + 1
là một đối tượng và các đối tượng có thể được gán cho các giá trị với val f = ...
. Các nhà thiết kế ngôn ngữ sẽ phải đi ra ngoài để không cho phép cú pháp. Nó không hoàn toàn giống như nỗ lực rõ ràng để hỗ trợ hai cú pháp khác nhau thực hiện (xấp xỉ) cùng một điều.
However, assigning existing functions
dường như đang thiếu phần cuối của câu