Nó thực sự phụ thuộc vào những gì bạn có nghĩa là cơ bản.
Nếu bạn đang thực sự hỏi "nếu có một showstopper kỹ thuật mà sẽ ngăn chặn để thực hiện tính năng này", sau đó tôi sẽ nói câu trả lời là không . Bạn đang nói về desugaring, và bạn đang đi đúng hướng ở đây. Tất cả những gì cần làm là cơ bản khâu vài trường hợp phân tách thành một hàm duy nhất, và điều này có thể được thực hiện như là một bước tiền xử lý (điều này chỉ đòi hỏi kiến thức cú pháp, không cần kiến thức ngữ nghĩa).Nhưng đối với điều này thậm chí có ý nghĩa, tôi sẽ xác định một vài quy tắc:
- Chữ ký hàm là bắt buộc (trong Haskell, ví dụ, tùy chọn này sẽ là tùy chọn cho dù bạn đang xác định hàm cùng một lúc hoặc trong một số phần). Chúng tôi có thể cố gắng sắp xếp để sống mà không có chữ ký và cố gắng để trích xuất nó từ các phần khác nhau, nhưng thiếu thông tin loại sẽ nhanh chóng đến để byte chúng tôi. Một đối số đơn giản hơn là nếu chúng ta cố gắng suy ra một chữ ký ngầm, chúng ta cũng có thể làm điều đó cho tất cả các phương thức. Nhưng sự thật là có những lý do rất tốt để có chữ ký rõ ràng trong scala và tôi không thể tưởng tượng để thay đổi điều đó.
- Tất cả các phần phải được xác định trong cùng một phạm vi. Để bắt đầu, chúng phải được khai báo trong cùng một tệp vì mỗi tệp nguồn được biên dịch riêng biệt và do đó một bộ tiền xử lý đơn giản sẽ không đủ để thực hiện tính năng này. Thứ hai, chúng tôi vẫn kết thúc với một phương pháp duy nhất cuối cùng, vì vậy nó chỉ tự nhiên để có tất cả các phần trong cùng một phạm vi.
- quá tải là không thể cho các phương pháp như vậy (nếu không chúng tôi sẽ cần phải lặp lại chữ ký cho mỗi phần chỉ để Preprocessor biết đó là một phần thuộc về mà quá tải)
- Linh kiện được thêm vào (khâu) đến tạo
match
trong thứ tự mà chúng được khai báo
Vì vậy, đây là cách nó có thể trông giống như:
def reverse[T](lst: List[T]): List[T] // Exactly like an abstract def (provides the signature)
// .... some unrelated code here...
def reverse(Nil) = Nil
// .... another bit of unrelated code here...
def reverse(x :: xs) = reverse(xs) ++ List(x)
Mà có thể được trivially chuyển thành:
def reverse[T](list: List[T]): List[T] = lst match {
case Nil => Nil
case x :: xs => reverse(xs) ++ List(x)
}
// .... some unrelated code here...
// .... another bit of unrelated code here...
Dễ dàng thấy rằng phép biến đổi trên rất cơ học và có thể thực hiện bằng cách thao tác nguồn AST (AST được tạo ra bởi ngữ pháp được sửa đổi một chút chấp nhận cấu trúc mới này) và biến nó thành AST mục tiêu (AST được tạo ra bởi ngữ pháp scala chuẩn). Sau đó, chúng tôi có thể biên dịch kết quả như bình thường.
Vì vậy, có bạn đi, với một vài quy tắc đơn giản, chúng tôi có thể triển khai bộ tiền xử lý thực hiện tất cả công việc để triển khai tính năng mới này.
Nếu bởi cơ bản bạn đang yêu cầu "là có bất cứ điều gì mà sẽ làm cho tính năng này ra khỏi nơi", sau đó nó có thể lập luận rằng điều này không cảm thấy rất scala. Nhưng nhiều hơn đến điểm, nó không mang lại nhiều đến bàn. Tác giả Scala thực sự có xu hướng hướng ngôn ngữ đơn giản hơn (như các tính năng ít tích hợp hơn, cố gắng di chuyển một số tính năng tích hợp vào thư viện) và thêm cú pháp mới không thực sự dễ đọc hơn so với mục tiêu đơn giản hóa.
Nguồn
2013-02-11 10:48:31
Bạn không muốn viết nó như thế này, vì đây là một 'đảo ngược' khá không hiệu quả. – Ingo
@ Tức là nó chỉ là một ví dụ (và tôi đã thêm tuyên bố từ chối trách nhiệm về độ âm của mã), tôi có thể viết giai thừa như một ví dụ và nó sẽ khá hiệu quả. Hay bạn ám chỉ điều gì khác? –
Đối với tôi, hai cái nhìn khá giống nhau ngoại trừ Scala đòi hỏi các đối số phải được chú thích kiểu, là kết quả của giống lai OOP/Functional (so với Hindley-Milner trong SML). Vì vậy, tôi không chính xác những gì bạn muốn xem (ngoài việc thay đổi cú pháp của Scala, như 'def' ->' fun', 'Nil' ->' [] ') –