Hầu hết các ngôn ngữ lập trình (cả ngôn ngữ được gõ động và tĩnh) đều có từ khóa và / hoặc cú pháp đặc biệt trông khác nhiều so với khai báo biến để khai báo hàm. Tôi thấy các chức năng giống như khai báo một thực thể có tên khác:
Ví dụ trong Python:
x = 2
y = addOne(x)
def addOne(number):
return number + 1
Tại sao không:
x = 2
y = addOne(x)
addOne = (number) =>
return number + 1
Tương tự, trong một ngôn ngữ như Java:
int x = 2;
int y = addOne(x);
int addOne(int x) {
return x + 1;
}
Tại sao không:
int x = 2;
int y = addOne(x);
(int => int) addOne = (x) => {
return x + 1;
}
Cú pháp này có vẻ tự nhiên hơn khi khai báo một cái gì đó (có thể là một hàm hoặc một biến) và một từ khóa ít hơn như def
hoặc function
trong một số ngôn ngữ. Và, IMO, nó phù hợp hơn (tôi nhìn vào cùng một vị trí để hiểu loại biến hoặc hàm) và có thể làm cho trình phân tích cú pháp / ngữ pháp đơn giản hơn một chút để viết.
Tôi biết rất ít ngôn ngữ sử dụng ý tưởng này (CoffeeScript, Haskell) nhưng hầu hết các ngôn ngữ phổ biến đều có cú pháp đặc biệt cho các hàm (Java, C ++, Python, JavaScript, C #, PHP, Ruby).
Ngay cả trong Scala, hỗ trợ cả hai cách (và có kiểu suy luận), việc viết phổ biến hơn:
def addOne(x: Int) = x + 1
Thay vì:
val addOne = (x: Int) => x + 1
IMO, ít nhất trong Scala, đây có lẽ là phiên bản dễ hiểu nhất nhưng thành ngữ này hiếm khi được theo sau:
val x: Int = 1
val y: Int = addOne(x)
val addOne: (Int => Int) = x => x + 1
Tôi đang làm việc với ngôn ngữ đồ chơi của riêng mình và tôi tự hỏi liệu có bất kỳ cạm bẫy nào không nếu tôi thiết kế ngôn ngữ của mình theo cách như vậy và nếu có bất kỳ lý do lịch sử hoặc kỹ thuật nào thì mô hình này không được theo dõi rộng rãi?
(int => int) addOne = (x) => {
thì "đặc biệt" và "phức tạp" hơn nhiều so với int addOne(int) {
...