Câu hỏi Tôi nên học phương ngữ nào của Lisp? [đã đóng]


Tôi biết có một vài phương ngữ khác nhau của Lisp. Sau khi quyết định rằng việc học Lisp sẽ là một trải nghiệm trí tuệ mới, tôi muốn biết phương ngữ Lisp nào để học và tại sao.

Có cái nào phổ biến hơn những cái khác không? Có ai trong số họ "hoàn thành" hơn, như trong, tài liệu và hỗ trợ tốt hơn không? Những ưu và khuyết điểm của phương ngữ này là gì?


76
2018-06-17 14:07


gốc


Bản sao: stackoverflow.com/questions/563356/which-lisp-should-i-learn - Greg Hewgill
Tôi đã thực hiện một tìm kiếm về điều đó trước khi tôi hỏi điều này nhưng bản chất của câu hỏi đã tiến hóa khi tôi đang gõ nó. Tôi sẽ đảm bảo không tái tạo lại bánh xe. - Humphrey Bogart
Vậy sự khác biệt giữa câu hỏi này và câu hỏi mà Greg đề cập ở trên là gì? - Curt J. Sampson
Tôi nghĩ, điều anh ta muốn nói là: Khi tôi lần đầu tiên xây dựng câu hỏi trong đầu, nó hoàn toàn khác với câu hỏi hiện tại, và nhìn vào các câu hỏi trong tìm kiếm liên quan không tiết lộ bất cứ điều gì phù hợp với những gì anh ta muốn hỏi. Nhưng vào thời điểm anh ta gõ câu hỏi, nó đã thay đổi và do đó đến SO trong hình thức hiện tại của nó, được yêu cầu trước đó. - J. Polfer


Các câu trả lời:


Bạn muốn tìm sự cân bằng giữa sự đơn giản và sạch sẽ, các tính năng hấp dẫn và nền tảng cho phép bạn viết phần mềm thú vị và hữu ích (cho chính mình) cũng như phục vụ như một công cụ học tập. (Điều này cuối cùng sẽ giữ cho bạn đi và học tập lâu hơn rất nhiều.) Dưới đây là một số khả năng:

  1. Kế hoạch. Có lẽ là sạch nhất của tất cả các phương ngữ. Điều này là không có nghi ngờ tại sao The Little Schemer đã được dịch từ LISP sang Đề án. Đặc tả tiêu chuẩn của Đề án thứ năm, R5RS, là một nền giáo dục tuyệt vời trong và của chính nó; nó có thể là ngôn ngữ đẹp nhất và đặc điểm kỹ thuật của thư viện mà tôi từng đọc, cũng như ngắn nhất hợp lý. Các PLT Scheme (bây giờ Racket) nền tảng bao gồm một thông dịch viên khá phong nha và trình biên dịch, là tốt cho kịch bản, và cũng có một số công cụ trực quan mà làm cho nó tuyệt vời cho việc học tập.

  2. Lisp thường gặp. Có lẽ là phiên bản di động và toàn diện nhất, điều này rất có thể là những gì bạn muốn nếu bạn muốn viết những thứ như phần mềm thương mại. Tiêu chuẩn định nghĩa các thư viện mở rộng và nhiều thư viện khác có sẵn ngoài đó, nó có CLOS, có thể sẽ dạy bạn nhiều hơn về OO hơn bất kỳ ngôn ngữ OO nào, và một số trình biên dịch rất tốt. Nhược điểm bao gồm một số mụn cóc mà Scheme không có (chẳng hạn như có một không gian tên riêng cho các biến tham chiếu đến hàm), không được sạch sẽ và đơn giản (như trường hợp với bất kỳ thứ gì phải có phần mở rộng và thỏa hiệp cần thiết đối với các ứng dụng lớn trong thế giới thực), không có các macro hợp vệ sinh và nhấn mạnh đệ quy ít hơn nhiều so với Đề án.

  3. Clojure. Điều này chạy trên JVM, mà có thể cung cấp cho nó một chân lên ngay cho các nhà phát triển Java. Nó có một vài mụn cóc (ví dụ, bạn phải yêu cầu tối ưu hóa cuộc gọi đuôi, mặc dù điều này có thể thay đổi một ngày nếu TCO được thêm vào JVM). Các macro, trong khi không hợp vệ sinh, có một số tính năng để giúp bạn tránh việc nắm bắt biến, vì vậy bạn có thể nắm bắt các biến nếu bạn thực sự muốn, trong khi chạy ít nguy cơ vô tình làm như vậy hơn trong CL. Bạn đã dễ dàng truy cập vào tất cả các thư viện Java; đó có thể là một điều tốt cho mã "thế giới thực", và khá vô nghĩa về mặt học tập. Nó có một bộ thư viện cho các cấu trúc dữ liệu liên tục và hỗ trợ cho STM, điều này làm cho nó rất thú vị từ một quan điểm đồng thời; điều này làm cho nó có lẽ là đặt cược tốt nhất của bạn nếu bạn quan tâm đến việc tìm hiểu thêm về các phương pháp mới để đối phó với lập trình đồng thời và song song. Có vẻ như Clojure có thể sử dụng cho các ứng dụng sản xuất lớn như Java, theo nghĩa là nó sẽ có khả năng thực hiện "những thứ xấu xí" bạn làm trong các ứng dụng sản xuất mà bạn không muốn và không làm khi bạn đang học.

  4. Emacs Lisp. Trong điều khoản của một LISP, đây không phải là một trong những ví dụ tốt hơn ra khỏi đó. Một trong những lỗi lớn nhất của nó là phạm vi động, nhưng có rất nhiều lỗi khác. Tuy nhiên, nếu bạn là người dùng Emacs, đây có thể là công cụ mạnh mẽ nhất bạn có thể học để cải thiện việc sử dụng trình soạn thảo. Bạn thực sự học được bao nhiêu từ việc học Emacs Lisp, ngoài cách mở rộng Emacs, tuy nhiên, đối với tôi là một câu hỏi mở; Tôi không biết các kỹ thuật thú vị thường xuyên như các chức năng bậc cao thực sự được sử dụng như thế nào trong Emacs Lisp.

Bản cập nhật năm 2018

Đã gần một thập kỷ kể từ khi tôi viết bài đăng này và gia đình ngôn ngữ Lisp giờ đây dường như thu hút được sự chú ý đáng kể trong ý thức lập trình chung. Phần lớn điều này dường như có liên quan đến Clojure không chỉ trở thành phương ngữ riêng biệt của Lisp, mà còn giới thiệu nhiều ý tưởng hay của riêng nó, nhưng bây giờ cũng có phiên bản gần giống hệt JavaScript và đã truyền cảm hứng cho nhiều Lisps khác nhắm mục tiêu các nền tảng khác. Ví dụ, Hy nhắm mục tiêu CPython AST và bytecode, nhằm mục đích đầu tiên cho khả năng tương tác với Python, nhưng sử dụng ý tưởng Clojure "khi nghi ngờ". (Mặc dù từ các cam kết mới nhất, sau này có thể thay đổi một chút.)

Sự thay đổi lớn này mang lại cho quá trình ra quyết định của bạn là bạn cũng nên xem bất kỳ ngôn ngữ nào của Lisps hoặc Lisp có sẵn và tương thích với các ngôn ngữ hoặc nền tảng bạn đã sử dụng, có thể là Perl, Ruby, Erlang, Đi hoặc thậm chí C ++ trên vi điều khiển.


66
2018-06-20 02:49



Có không gian tên riêng biệt không phải là một mụn cóc, nó chỉ là một quyết định thiết kế khác nhau. Hãy nhớ rằng đã có một số không gian tên khác cũng có trong Đề án, do đó, cuộc tranh luận là khá Lisp-5 chống lại Lisp-6. Ngoài sự tiện lợi mà tôi có thể gọi một danh sách "danh sách" và một chiếc xe "xe hơi" trong CL, hệ thống macro của nó chỉ là thực tế và hữu ích hơn nhiều, bởi vì trình biên dịch không nhầm lẫn mọi thứ dễ dàng như vậy. - Svante
Clojure không có tối ưu hóa cuộc gọi đuôi, và nó không thể, bởi vì bytecode JVM không hỗ trợ nó. Tất cả nó có là một hình thức đặc biệt "tái diễn" tự tái hiện lại chức năng hiện tại. - Svante
Svante: cảm ơn lời bình luận của TCO; Tôi đã thêm một ghi chú vào bài đăng mà nhu cầu sử dụng 'recur' có thể biến mất nếu JVM thêm hỗ trợ TCO. - Curt J. Sampson
Curt: Tôi cho rằng Clojure là di động nhất vì nó chạy trên máy ảo Java. - justinhj
Tôi không biết về điều đó; nếu bạn loại trừ các thiết bị nhỏ và nhúng (chẳng hạn như điện thoại và thẻ thông minh), bạn sẽ không chạy chương trình máy tính / máy chủ chưa sửa đổi, chắc chắn chạy trên nhiều CPU và nền tảng hơn JVM. - Curt J. Sampson


Tôi sẽ nói Đề án, chỉ vì Little Schemerđó là một trong những cuốn sách cực kỳ vui nhộn nhưng cực kỳ khó mà tôi từng đọc.


21
2018-06-17 14:11



Đừng quên SICP! mitpress.mit.edu/sicp. Đây là một cuốn sách kinh điển. - Joris Timmermans
Có hai hoặc ba phiên bản The Little Lisper trước The Little Schemer xuất hiện như một bản dịch của những người đó. - Curt J. Sampson


Tôi có thể đề nghị Common Lisp SBCL. Sự kết hợp này nhanh chóng, mạnh mẽ, trưởng thành và được ghi chép đầy đủ.


9
2018-06-18 09:06





Ngoài ra Clojure là một ngày càng tăng rất nhiều mindshare những ngày này, và vì lý do tốt. Cấu trúc dữ liệu tuyệt vời, hỗ trợ đồng thời tốt sâu sắc (đặt Đề án và CL để xấu hổ về vấn đề này), và một cộng đồng lớn. Nó cũng tương đối đơn giản, CL ít nhất cũng phức tạp như C ++.

Đây không phải là để nói rằng tôi không thích CL hoặc Đề án. Tôi đã học được Đề án với SICP. Và CL đưa tôi đến Clojure. Tất cả phụ thuộc vào mục tiêu của bạn tôi giả sử. Nếu bạn muốn tìm hiểu một Lisp đó là vô cùng thiết thực đi cho Clojure. Nếu không thì CL hoặc Scheme đều tuyệt vời.


8
2018-06-17 18:06



Điều này dường như ngụ ý rằng không phải CL hoặc Đề án là "vô cùng thực tế", trong khi họ là khá thực tế trong thực tế. Đặc biệt tiêu chuẩn CL là sinh ra ngoài những cân nhắc thực tế. - skypher
Phong cảnh ngôn ngữ lập trình đã thay đổi từ năm 1994, tôi không biết tiêu chuẩn CL sẽ thay đổi / phát triển như thế nào để phù hợp với những gì đã học được từ thời điểm đó. Thế giới đang lảo đảo về phía trước và theo như tôi có thể nói CL đang đứng yên. Tôi thích CL, Clojure có một số cách để tiếp cận sức mạnh của nó, nhưng tôi không thấy CL sẽ tiến hóa như thế nào - nếu bạn định sử dụng một ngôn ngữ tiêu chuẩn, một con đường tiến hóa phải rõ ràng. Không có nó, một ngôn ngữ rất có khả năng không phải một lựa chọn thực tế. - dnolen
CL đã phát triển và đang phát triển thông qua rất nhiều thư viện rất hữu ích. Ngôn ngữ cơ bản đã mạnh hơn vào năm 1994 so với tất cả các ngôn ngữ "hiện đại" ngày nay. - Svante


Tôi thích CL, vì tôi thích lập trình hướng đối tượng, và CLOS là hệ thống đối tượng đẹp nhất xung quanh.


5
2018-06-17 14:11



Phát biểu của CL, tôi muốn giới thiệu ClozureCL hoặc SBCL. Cả hai đều là nguồn mở, được tài liệu hóa, trưởng thành, đa nền tảng và cung cấp các chức năng không tiêu chuẩn quan trọng như đa luồng. - Daniel Dickison


tôi đã học Kế hoạch ở trường. Đó là một trải nghiệm học tập tuyệt vời và tôi sẽ không bao giờ quên những nguyên tắc cơ bản của lập trình hàm. Nó có thể không quan trọng phiên bản của LISP bạn nhận, miễn là bạn hiểu cốt lõi của tính hữu dụng của nó - tính toán lambda không trạng thái.

Đây là một bài viết thú vị về Tại sao MIT chuyển từ Scheme sang Python trong khóa học lập trình giới thiệu của nó.


5
2018-06-17 14:30





Tôi sẽ nói tất cả chúng, ít nhất là lúc đầu. Cuối cùng, bạn có thể sẽ phát triển một ưu tiên cho Scheme hoặc Common Lisp, nhưng cả hai đều có đủ sự khác biệt, tốt nhất là nên xử lý mọi thứ ở ngoài đó.

Ví dụ, lược đồ có các phần tiếp tục, và rất tốt để tìm hiểu về các sơ đồ trong Đề án, mặc dù chúng có thể được thực hiện trong Common Lisp.

Học sự khác biệt giữa phạm vi từ vựng và năng động là rất quan trọng, và nếu bạn học cả Lisp thông thường và elisp bạn sẽ đi qua các tác động của cả hai.


2
2018-06-20 01:26





LFE (Lisp Flavored Erlang) sẽ rất tuyệt. Bạn có thể có cú pháp lisp trên máy ảo Erlang.


0
2017-12-08 14:42