Sau vài tháng tìm hiểu và chơi với Lisp, cả CL và một chút Clojure, tôi vẫn không thấy một lý do thuyết phục nào để viết bất cứ điều gì trong đó thay vì C #.
Tôi thực sự muốn một số lý do thuyết phục, hoặc để ai đó chỉ ra rằng tôi đang thiếu một cái gì đó thực sự lớn .
Những điểm mạnh của Lisp (theo nghiên cứu của tôi):
- Nhỏ gọn, ký hiệu biểu cảm - Hơn cả C #, vâng ... nhưng tôi dường như cũng có thể diễn đạt những ý tưởng đó trong C #.
- Hỗ trợ ngầm cho lập trình chức năng - C # với các phương thức mở rộng LINQ:
- mapcar = .Chọn (lambda)
- mapcan = .Select (lambda) .Aggregate ((a, b) => a.Union (b))
- xe / đầu tiên = .Đầu tiên ()
- cdr / rest = .Skip (1) .... vv
- Lambda và hỗ trợ chức năng bậc cao hơn - C # có điều này và cú pháp được cho là đơn giản hơn:
- "(lambda (x) (cơ thể))" so với "x => (cơ thể)"
- "# (" Với "%", "% 1", "% 2" rất hay trong Clojure
- Công văn phương thức được tách ra khỏi các đối tượng - C # có điều này thông qua các phương thức mở rộng
- Công văn đa phương thức - C # không có bản gốc này, nhưng tôi có thể thực hiện nó như một cuộc gọi chức năng trong vài giờ
- Mã là Dữ liệu (và Macro) - Có thể tôi chưa "nhận" macro, nhưng tôi chưa thấy một ví dụ duy nhất trong đó ý tưởng về macro không thể được thực hiện như một hàm; nó không thay đổi "ngôn ngữ", nhưng tôi không chắc đó là một thế mạnh
- DSL - Chỉ có thể thực hiện thông qua thành phần chức năng ... nhưng nó hoạt động
- Lập trình "khám phá" chưa được khám phá - cho các cấu trúc / lớp, tính năng tự động và "đối tượng" của C # hoạt động khá tốt và bạn có thể dễ dàng leo thang thành kiểu gõ mạnh hơn khi bạn đi cùng
- Chạy trên phần cứng không phải Windows - Vâng, vậy? Ngoài đại học, tôi chỉ biết một người không chạy Windows ở nhà hoặc ít nhất là VM của Windows trên * nix / Mac. (Sau đó, một lần nữa, có lẽ điều này quan trọng hơn tôi nghĩ và tôi vừa bị tẩy não ...)
- REPL cho thiết kế từ dưới lên - Ok, tôi thừa nhận điều này thực sự rất hay và tôi nhớ nó trong C #.
Những điều tôi đang thiếu ở Lisp (do sự kết hợp của C #, .NET, Visual Studio, Resharper):
- Không gian tên. Ngay cả với các phương thức tĩnh, tôi thích buộc chúng vào một "lớp" để phân loại bối cảnh của chúng (Clojure dường như có điều này, CL dường như không.)
- Biên dịch tuyệt vời và hỗ trợ thời gian thiết kế
- hệ thống loại cho phép tôi xác định "tính chính xác" của các cơ sở dữ liệu mà tôi đi qua
- bất cứ điều gì sai chính tả được gạch chân thời gian thực; Tôi không phải đợi cho đến khi chạy
- cải tiến mã (chẳng hạn như sử dụng cách tiếp cận FP thay vì bắt buộc) được tự động đề xuất
- Các công cụ phát triển GUI: WinForms và WPF (Tôi biết Clojure có quyền truy cập vào các thư viện GUI của Java, nhưng chúng hoàn toàn xa lạ với tôi.)
- Các công cụ gỡ lỗi GUI: breakpoint, step-in, step-over, value tests (text, xml, custom), watch, debug-by-thread, breakpoint có điều kiện, cửa sổ ngăn xếp cuộc gọi với khả năng nhảy tới mã ở mọi cấp độ trong ngăn xếp
- (Công bằng mà nói, phần còn lại của tôi với Emacs + Slime dường như cung cấp một số điều này, nhưng tôi là một phần của cách tiếp cận dựa trên VS GUI)
Tôi thực sự thích sự cường điệu xung quanh Lisp và tôi đã cho nó một cơ hội.
Nhưng có điều gì tôi có thể làm ở Lisp mà tôi không thể làm tốt trong C # không? Nó có thể dài dòng hơn một chút trong C #, nhưng tôi cũng đã tự động hoàn tất.
Tôi đang thiếu gì? Tại sao tôi nên sử dụng Clojure / CL?
AND
hoặc OR
như một hàm. Nó có thể được thực hiện (được đưa ra LAMBDA
, cũng là một macro) nhưng tôi không thấy một cách rõ ràng để làm điều đó sẽ không hoàn toàn hút.