Tôi nên học phương ngữ nào của Lisp? [đóng cửa]


89

Tôi biết có một vài phương ngữ khác nhau của Lisp. Quyết định rằng 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 để 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ó cái nào trong số chúng "hoàn chỉnh" hơn, như trong, được tài liệu hóa và hỗ trợ tốt hơn không? Ưu và nhược điểm của phương ngữ này là gì?



Tôi đã tìm kiếm về điều đó trước khi hỏi điều này nhưng bản chất của câu hỏi đã phát triển khi tôi nhập nó. Tôi sẽ đảm bảo không phát minh 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ì?
cjs

2
Tôi nghĩ, những gì anh ấy đang cố gắng nói là: Khi tôi lần đầu tiên hình thành câu hỏi của mình trong đầu, nó hoàn toàn khác với câu hỏi hiện tại và việc xem xét các câu hỏi trong tìm kiếm liên quan không tiết lộ câu hỏi nào phù hợp với những gì anh ấy muốn hỏi. Nhưng vào thời điểm anh ấy gõ câu hỏi, nó đã thay đổi và do đó đã xuất hiện trên SO ở dạng hiện tại, vốn đã được hỏi trước đây.
J. Polfer

Câu trả lời:


77

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

  1. Kế hoạch. Có lẽ là sạch nhất trong tất cả các phương ngữ. Đây không phải là nghi ngờ tại sao The Little Schemer được dịch từ LISP thành Scheme. Đặc điểm kỹ thuậ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ữ và đặc tả thư viện đẹp nhất mà tôi từng đọc, cũng như là ngôn ngữ ngắn nhất mà toàn diện một cách hợp lý. Các PLT Scheme (nay Racket) nền tảng bao gồm một phiên dịch khá tốt 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.

  2. Lisp chung. Có lẽ là biến thể di động và toàn diện nhất, đâ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 xác định các thư viện mở rộng và nhiều thư viện khác nữa có sẵn, 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 có thể và một số trình biên dịch rất tốt. Nhược điểm bao gồm một số vấn đề 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 các hàm), không sạch sẽ và đơn giản (như trường hợp của bất kỳ thứ gì phải có phần mở rộng và làm cho các thỏa hiệp cần thiết cho các ứng dụng lớn trong thế giới thực), không có macro hợp vệ sinh và nhấn mạnh đệ quy ít hơn nhiều so với Scheme.

  3. Áo choàng.Điều này chạy trên JVM, có thể giúp nó có chỗ đứng ngay tại đó 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 rõ ràng 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ào đó nếu TCO được thêm vào JVM). Các macro, mặc dù không hợp vệ sinh, nhưng có một số tính năng giúp bạn tránh bị 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, đồng thời ít có nguy cơ vô tình làm như vậy hơn trong CL. Bạn có thể dễ dàng truy cập vào tất cả các thư viện Java; đó có lẽ 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ấ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ị theo 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 để xử lý lập trình đồng thời và song song. Có vẻ như Clojure có thể sử dụng được 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 làm và không làm khi bạn đang học.

  4. Emacs Lisp. Về mặt LISP, đây không phải là một trong những ví dụ tốt hơn hiện có. Một trong những lỗi lớn nhất của nó là phạm vi động, nhưng cũng có 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 mà bạn có thể học để cải thiện việc sử dụng trình chỉnh sửa của mình. Tuy nhiên, bạn thực sự học được bao nhiêu khi học Emacs Lisp, ngoài cách mở rộng Emacs, đố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ị như hàm bậc cao thực sự được sử dụng trong Emacs Lisp như thế nào.

Cập nhật 2018

Đã gần một thập kỷ kể từ khi tôi viết bài đăng này và họ ngôn ngữ Lisp hiện đang có được sức hút đáng kể trong nhận thức của các lập trình viên nói chung. Phần lớn điều này dường như liên quan đến Clojure, không chỉ trở thành một phương ngữ riêng biệt của Lisp theo đúng nghĩa của nó, giới thiệu nhiều ý tưởng hay của riêng nó, mà còn có một phiên bản gần giống hệt nhắm mục tiêu JavaScript và đã truyền cảm hứng cho nhiều Lisp 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, trước tiên nhắm đến 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.)

Thay đổi lớn mà điều này mang lại trong quá trình ra quyết định của bạn là bạn cũng nên xem xét bất kỳ ngôn ngữ nào giống như 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 , Go hoặc thậm chí C ++ trên vi điều khiển .


3
Có không gian tên riêng biệt không phải là một vấn đề, 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 trong Scheme, vì vậy cuộc tranh luận thay Lisp-5 chống lại Lisp-6. Ngoài sự tiện lợi mà tôi có thể gọi là danh sách "danh sách" và "xe hơi" trong CL, hệ thống macro của nó thực tế và hữu ích hơn rất nhiều, bởi vì trình biên dịch không dễ làm nhầm lẫn mọi thứ.
Svante

Clojure không có tính năng tối ưu hóa cuộc gọi đuôi và nó không thể, bởi vì mã bytecode của JVM không hỗ trợ nó. Tất cả những gì nó có là một dạng đặc biệt "định kỳ" tự tái lập hàm hiện tại.
Svante

3
Curt: Tôi cho rằng Clojure là tiện ích di động nhất vì nó chạy trên máy ảo Java.
justinhj

1
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), nơi bạn sẽ không chạy chương trình máy tính để bàn / máy chủ chưa sửa đổi, elisp chắc chắn chạy trên nhiều CPU và nền tảng hơn JVM.
cjs

1
Tôi rất không đồng ý. Đệ quy có xu hướng tạo ra mã a) tinh khiết hơn, b) dễ xác minh hơn, c) có nhiều khả năng đúng hơn. Chi tiết hơn: a) nó có xu hướng ít chạm vào ít biến bên ngoài hàm hơn; b) một bằng chứng quy nạp có xu hướng tự nhiên loại bỏ hàm đệ quy, trong khi với các vòng lặp, bạn cần kiểm tra các bất biến của vòng lặp, v.v.; c) độ tin cậy đến từ a) và bạn có xu hướng bị đẩy vào mã theo cách tự nhiên khiến bạn phải làm (có lẽ không chính thức) bằng chứng quy nạp của b).
cjs

22

Tôi có thể nói Scheme, chỉ vì Little Schemer , đây là một trong những cuốn sách thú vị nhưng cực kỳ khó đọc mà tôi từng thử đọc.


15
Đừng quên SICP! mitpress.mit.edu/sicp . Đây là một cách đọc kinh điển.
Joris Timmermans

7
Có hai hoặc ba ấn bản của The Little Lisper trước khi The Little Schemer ra mắt dưới dạng bản dịch của chúng.
cjs

9

Tôi có thể giới thiệu Common Lisp trên SBCL . Sự kết hợp này diễn ra nhanh chóng, mạnh mẽ, thuần thục và được ghi chép đầy đủ.


8

Ngoài ra, Clojure ngày nay đang nhận được rất nhiều sự chia sẻ và vì lý do chính đáng. Cấu trúc dữ liệu tuyệt vời, hỗ trợ đồng thời rất tốt (khiến Scheme và CL phải xấu hổ về mặt này) và một cộng đồng tuyệt vời. Nó cũng tương đối đơn giản, CL ít nhất cũng phức tạp như C ++.

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


Điều này dường như ngụ ý rằng cả CL hoặc Scheme đều không phải là "thực tế vô cùng", trong khi chúng khá thực tế. Đặc biệt là tiêu chuẩn CL được sinh ra từ những cân nhắc thực tế.
Leslie P. Polzer

2
Bối cảnh ngôn ngữ lập trình đã thay đổi kể 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 kể từ thời điểm đó. Thế giới đang tiến về phía trước và theo như tôi có thể nói thì CL vẫn đang đứng yên. Tôi thích CL. Nếu không có nó, một ngôn ngữ rất có thể không phải là một lựa chọn thực tế.
dnolen

4
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ơ sở đã trở nên mạnh mẽ 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

5

Tôi thích CL hơn, 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
Nói về CL, tôi muốn giới thiệu ClozureCL hoặc SBCL. Cả hai đều là mã nguồn mở, được ghi chép đầy đủ, hoàn thiện, đa nền tảng và cung cấp chức năng quan trọng không theo tiêu chuẩn như đa luồng.
Daniel Dickison

5

Tôi đã học Đề án trong 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 các nguyên tắc cơ bản của lập trình hàm. Có thể bạn chọn phiên bản LISP nào không quan trọng, miễn là bạn hiểu được cốt lõi của tính hữu dụng của nó - phép tính lambda không trạng thái.

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


3

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 sở thích cho Scheme hoặc Common Lisp, nhưng cả hai đều có đủ sự khác biệt mà tốt nhất là bạn nên xử lý mọi thứ ngoài kia.

Ví dụ, Scheme có những liên tục và thật tốt khi tìm hiểu về những thứ trong Scheme, mặc dù chúng có thể được triển khai trong Common Lisp.

Tìm hiểu sự khác biệt giữa phạm vi từ vựng và phạm vi động là rất quan trọng, và nếu bạn học cả Common Lisp và elisp, bạn sẽ tìm thấy ý nghĩa của cả hai.


0

LFE (Lisp có hương vị Erlang) sẽ rất hay. Bạn có thể có cú pháp lisp trên máy ảo Erlang.


0

Bắt đầu là một loại câu hỏi "tải" nhưng OP có lẽ không biết về nó. Nói chung, những người nói ngọng Common và Scheme cũng giống như "người" PC và máy tính Apple, chúng không trộn lẫn. Cái nào tốt nhất có lẽ không phù hợp bằng cái nào "hiệu quả" với bạn. Thực sự, không có quá nhiều khác biệt. Có thể sở thích cái này hơn cái kia có thể bị ảnh hưởng bởi cái nào bạn học trước. (Đối với tôi, một danh sách trống không nên là "không có gì", được biết đến trong CL là NIL, và điều đó khiến tôi trở thành Người liệt kê chung.) Tôi thích sự tích hợp của SBCL với Slime bằng cách sử dụng EMACS, nhưng SBCL không dành cho tất cả mọi người. Có điều, SBCL rất nghiêm ngặt. Nếu bạn chỉ muốn "giải trí", GNU clisp rất dễ dàng và có sẵn cho hầu hết mọi nền tảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.