Tại sao Lisp hữu ích? [đóng cửa]


64

Lisp rõ ràng là một lợi thế cho các AI thứ, nhưng nó không xuất hiện với tôi rằng Lisp là nhanh hơn bất kỳ Java, C #, hoặc thậm chí C. Tôi không phải là một bậc thầy về Lisp, nhưng tôi thấy nó vô cùng khó khăn để hiểu được lợi thế người ta sẽ có được bằng văn bản phần mềm kinh doanh trong Lisp.

Tuy nhiên, nó được coi là ngôn ngữ của hacker.

Tại sao Paul Graham ủng hộ Lisp? Tại sao Phần mềm ITA chọn Lisp hơn các ngôn ngữ cấp cao khác? Nó có giá trị gì đối với các ngôn ngữ này?


20
Dòng "Tôi không nghĩ Lisp nhanh hơn Java, C # hoặc như một vấn đề thực tế nhanh hơn C" có phần khó hiểu. C thường được coi là tiêu chuẩn cho "mã nhanh vì bạn đang lập trình gần với kim loại" - đó là tiêu chuẩn để đánh bại mọi thứ. Bây giờ, Java và các ngôn ngữ GC'd khác có thể đánh bại nó trong một số ngữ cảnh, ví dụ như tốc độ phân bổ / dọn dẹp bộ nhớ. Nhưng, dù sao thì câu này có vẻ hơi ngược.
Michael H.

2
Lisp là một ngôn ngữ cấp cao hơn những ngôn ngữ bạn đã đề cập, do đó thường chậm hơn.
segfault

5
@Bo Tian: "ngôn ngữ cấp cao hơn" cần một định nghĩa rõ ràng. Ngay cả khi nó có một, điều này nghe có vẻ như không phải là trình tự. (cảm ơn @Mark)
Mike Dunlavey

5
@BoTian "cấp cao hơn" không bằng "chậm" theo mặc định.

24
Lisp tồn tại để cho thấy mọi nhà thiết kế ngôn ngữ khác đã sai như thế nào.

Câu trả lời:


78

Có một vài lý do tôi đang làm việc để trở thành người có năng lực với Common Lisp.

  1. Mã đồng tính. Điều này cho phép mã tự sửa đổi cấu trúc.
  2. Các macro nhận biết cú pháp. Họ cho phép viết lại mã soạn sẵn.
  3. Chủ nghĩa thực dụng. Lisp thông thường được thiết kế để hoàn thành công việc của các chuyên gia làm việc. Hầu hết các ngôn ngữ chức năng không, như một quy luật.
  4. Uyển chuyển. Nó có thể làm rất nhiều thứ khác nhau, tất cả đều ở tốc độ hợp lý.
  5. Chiến tranh. Thế giới thực lộn xộn . Mã hóa thực dụng kết thúc việc phải sử dụng hoặc phát minh ra các cấu trúc lộn xộn. Lisp thông thường có đủ tính chiến tranh để có thể hoàn thành công việc.

Có thể cho rằng lý do thực sự duy nhất để lựa chọn chống lại Common Lisp là các thư viện tiêu chuẩn đã được ghi ngày.

Tôi sẽ đi ra ngoài và nói rằng trong trường hợp chung, cú pháp không phải là một vấn đề đối với một nhân viên phần mềm chuyên nghiệp.


8
Cú pháp có thể là một vấn đề nếu nó ảnh hưởng đáng kể đến khả năng đọc hoặc khả năng ghi. Tôi không nghĩ đó là trường hợp của Lisp. Một trình soạn thảo tốt hoặc IDE có thể làm nổi bật cú pháp đủ tốt và kết hợp paren để không phải là một vấn đề lớn.
Matt Olenik

4
Ngoài ra, tôi chỉ sử dụng Lisp một chút (Lisp thông thường) và cảm giác chung tôi nhận được là # 2 là lợi ích lớn nhất đối với Lisp. Có thể tôi đang suy nghĩ sai, nhưng tôi không nghĩ rằng mình đã từng gặp phải tình huống phải tự sửa đổi mã. Nếu bạn có một lý do cụ thể để sử dụng nó, thì có, nhưng nếu không thì các macro có vẻ như là tính năng sát thủ thực sự. Chỉnh sửa: Trên thực tế, đây là những tính năng tương tự.
Matt Olenik

3
@Matt: Đúng. FWIW, gần đây tôi đã gặp Nemerle, một ngôn ngữ thử nghiệm CLR của C # với các macro. netterle.org . Nó đáng để chọc vào một số điểm tôi nghĩ, chỉ để trải nghiệm.
Paul Nathan

2
"Chủ nghĩa thực dụng. CL được thiết kế để hoàn thành công việc của các chuyên gia làm việc. Hầu hết các ngôn ngữ chức năng không phải là một quy tắc.": Tôi không đồng ý với tuyên bố này. Tôi rất quan tâm đến Lisp và cố gắng dành thời gian để tìm hiểu nó. Nhưng tôi thấy các ngôn ngữ FP khác cũng rất hiệu quả để "hoàn thành công việc", ít nhất đây là kinh nghiệm của tôi với Scala và Haskell cho đến nay.
Giorgio

1
"CL được thiết kế để hoàn thành công việc bởi các chuyên gia làm việc. Hầu hết các ngôn ngữ chức năng không phải là một quy tắc.": Bạn có thể giải thích về điều này không? Đặc biệt là về phần thứ hai của câu. Bạn có thể kể tên một vài ví dụ?
Giorgio

23

Tôi thích Lisp vì nó

  • cách thống nhất, đơn giản và thanh lịch để thể hiện cả mã và dữ liệu.
  • Quan điểm độc đáo, mang lại cho tôi 80 điểm IQ quan trọng trong việc giải quyết các vấn đề khó khăn (với mẹo đội mũ cho Alan Kay)
  • môi trường phát triển cực kỳ nhanh nhẹn, tương tác và đàm thoại
  • sức mạnh chưa từng có để tạo và thao túng trừu tượng

Lập trình là chiến đấu phức tạp. Trừu tượng là công cụ hiệu quả duy nhất để chống lại sự phức tạp ngày càng tăng (với kích thước hộp sọ rất hạn chế và không đổi của chúng tôi). Quản lý trừu tượng với Lisp giống như có một vị thần với mong muốn n + 1.


5
+1 cho "Lập trình là chiến đấu với sự phức tạp. Trừu tượng là công cụ hiệu quả duy nhất để chống lại sự phức tạp ngày càng tăng (với kích thước hộp sọ rất hạn chế và không đổi của chúng tôi)." (Tôi ước tôi có thể cho +10.)
Giorgio

"Môi trường phát triển đàm thoại, tương tác và cực kỳ nhanh nhẹn" là gì?
qed

6
Không nên là (+ 1 n)mong muốn, hay thậm chí tốt hơn thực tế khôn ngoan (incf n)?
Reb.Cabin

21

Tôi tin rằng câu trả lời Lisp chính xác là nhiều ngôn ngữ hơn. Một cái gì đó như: "Nếu bạn phải hỏi, bạn chưa sẵn sàng."

Sau đó, nếu có ai thắc mắc thêm, câu trả lời đúng là "có" nếu đó là / hoặc câu hỏi hoặc "Bạn chưa sẵn sàng".


5
Paul Graham trích dẫn Louis Armstrong: xông Nếu bạn phải hỏi nhạc jazz là gì, bạn sẽ không bao giờ biết. Hãy
Jason Baker

25
+1. Mặc dù đôi khi những cụm từ như "Nếu bạn phải hỏi, bạn chưa sẵn sàng" khiến tôi nghĩ rằng người nói đơn giản như vậy không thể giải thích
superM

5
@superM Các ngôn ngữ chức năng giống Lisp và Lisp có thuộc tính mà một khi chúng học chúng, người ta không thể giải thích chúng nữa!
esoterik

18

Tôi nghĩ rằng lợi thế Lisp trong lĩnh vực trí tuệ nhân tạo (AI) mà mọi người đề cập đến có phần là một tai nạn lịch sử ... Lisp bắt đầu / trong AI, nhưng đó là ngôn ngữ có mục đích chung.

Tôi tin rằng tốc độ thực thi không phải là khía cạnh quan trọng duy nhất của ngôn ngữ (mặc dù tôi đã làm một lần). Tuy nhiên, một trong những khía cạnh tôi thích về Lisp là đối với tôi, nó kết hợp Python và C trong một. Tôi có thể bắt đầu viết mã mà không cần khai báo và nguyên mẫu ngay lập tức và rất nhanh chóng (thời gian chạy và REPL rất quan trọng cho việc này). Sau khi tôi có một cái gì đó đang chạy, tôi thêm các khai báo kiểu và "tối ưu hóa" mã của mình, từng chút một. Thật kỳ diệu khi nhấn một phím trong SLIME và xem ngôn ngữ máy được tạo cho chức năng mà tôi quan tâm. Trong Python, không có khai báo kiểu nào, vì vậy tôi không thể tăng tốc hơn, nhưng trong C, mọi thứ được thực hiện nhanh chóng là đau đớn hơn nhiều. Lisp rất hữu ích trong trường hợp này.

Phải nói rằng, tôi thích Lisp chủ yếu vì macro . Khi bạn cuối cùng đã hiểu những gì macro có thể đạt được, tôi nghĩ rằng bạn đưa ra dấu ngoặc đơn dễ dàng. Ngoài ra, các biên tập viên như Emacs tự quản lý dấu ngoặc đơn để bạn không phải làm vậy. Tuy nhiên, tôi thừa nhận rằng tôi đã không tìm thấy dấu ngoặc đơn ngay từ đầu và tôi biết một số người không thể chịu đựng được chúng. Nhưng vì toàn bộ mục đích của macro là tạo mã tại thời điểm biên dịch, mã trong Lisp sử dụng cấu trúc dữ liệu tiêu chuẩn và dấu ngoặc đơn giản là biểu diễn mã dưới dạng danh sách, cần thiết để làm cho macro đơn giản để viết.

Tôi không biết bất kỳ ngôn ngữ nào khác trong đó bạn có thể viết một ít ngôn ngữ để mô tả vấn đề của bạn tốt hơn với sự dễ dàng của Lisp. Đó là lợi thế mà Paul Graham nói về trong Beating the A Average . Đó là mô-đun cực đoan và đồng nhất. Trong Java tôi phải viết rất nhiều văn bản thô để diễn đạt một ý tưởng duy nhất. Trong Lisp tôi có thể viết một số macro tự động tạo mã đó và sau đó chỉ cần sử dụng các macro đó. Dù sao, bạn phải hiểu một số ví dụ về điều này và sau đó phán xét cho chính mình. Khi tôi "nhìn thấy" nó, tôi đã bị thổi bay và tôi vẫn nghĩ Lisp là ngôn ngữ tuyệt vời nhất cho lý do này một mình. Tôi luôn tìm kiếm các macro trong các ngôn ngữ chính để xem chúng có phù hợp với sức mạnh của macro Lisp hay không, nhưng đến nay tôi không tìm thấy bất kỳ loại nào. Forth là một thứ hai gần.

Tôi sẽ kết thúc với một vài lời chỉ trích, liên quan đến phần mềm kinh doanh:

  1. Phần mềm kinh doanh cần thư viện, và những cái tốt, và Lisp không giỏi về điều này. Tôi thường không cần chúng, nhưng khi tôi làm, tôi phải chọn từ một ít phần mềm chưa hoàn chỉnh mà một vài người sử dụng. Tôi nên góp phần sửa lỗi này, tôi đoán ...

  2. Phần mềm kinh doanh thường được xây dựng bởi các nhóm lớn người và tôi nghĩ rằng giao tiếp có thể bị cản trở bởi các macro, vì về cơ bản chúng thay đổi ngôn ngữ. Rất nhiều lập trình viên thoải mái hơn trong việc phát hiện các mẫu nhất định trong mã, ngay cả khi văn bản chương trình dài hơn và lặp đi lặp lại nhiều hơn. Tôi cho rằng tại ITA họ có một số quy tắc liên quan đến macro hoặc họ có một thư viện macro khổng lồ giúp việc cộng tác trở nên dễ dàng (hoặc đơn giản hơn, tất cả các lập trình viên đều là chuyên gia Lisp).


7
Hãy thử clojure, nó là một điều không thể thiếu trên JVM. Vì vậy, bằng cách sử dụng JVM, bạn có thể sử dụng tất cả các công cụ java.
Zachary K

@zachary: Có ít nhất 2 triển khai Lisp phổ biến trên JVM. ABCL tương đối trưởng thành.
Larry Coleman

Clojure tương thích 100% với Java (ít nhất là tôi chưa bao giờ tìm thấy bất cứ điều gì trong Java mà Clojure không thể cải thiện và theo cách mà các nhà Java không thể phàn nàn). Clojure bị ảnh hưởng nặng nề bởi thứ tốt nhất của Common Lisp và tốt nhất của FP. Với điều đó và SBCL và CLisp và Emacs, bất kỳ Lisper nào cũng nên cảm thấy như một vị vua ngày nay.
Reb.Cabin

13

Tôi không thích Lisp.

(Tôi thích nhiều khái niệm mà nó sử dụng, cách nó tạo ra các kỹ thuật mạnh mẽ có sẵn, v.v.

Nhưng tôi chưa bao giờ bị thuyết phục thực sự sử dụng nó, ((mặc dù nhiều người đã thử ) vì lợi ích của ngôn ngữ thể đạt được với các ngôn ngữ lập trình khác (một số trực tiếp, một số gián tiếp), vì vậy không đủ lợi ích để khiến tôi dành thời gian tìm hiểu nó và đưa ra cú pháp khủng khiếp.)))

Nhưng vâng, vì lý do mà một số người thích nó, hãy kiểm tra các câu hỏi Stack Overflow này:

Có lẽ có thêm một vài câu hỏi liên quan cho những người đó.


26
"Đưa ra cú pháp khủng khiếp". Có lẽ đã quá lâu kể từ khi tôi là một người mới chơi Lisp, nhưng sự đơn giản và đều đặn của cú pháp Lisp là một tính năng rất lớn, vì đó là điều giúp tôi có thể tự mình mở rộng Lisp. Tôi có thể thêm các trình lặp tùy chỉnh, tôi có thể thêm các cấu trúc phạm vi "with-xxx" mới tự động dọn sạch để nhà phát triển không phải, v.v. Cú pháp là một tính năng, không phải là lỗi.
Michael H.

5
Khả năng mở rộng một ngôn ngữ với chính nó không yêu cầu cú pháp giới hạn ở nửa tá ký tự. Ngoài ra: "Cú pháp là một tính năng, không phải là lỗi" ? - Tôi biết. Tôi đã không gọi nó là một lỗi.
Peter Boughton

8
Được rồi, làm thế nào để bạn có được những lợi ích của hệ thống vĩ mô? Có bao nhiêu ngôn ngữ cho phép bạn xây dựng một phần mở rộng hướng đối tượng cho chúng trong một chương ngắn hợp lý (Paul Graham, "On Lisp").
David Thornley

6
Cú pháp không khủng khiếp hơn các ngôn ngữ khác. Tôi đã thấy rằng các dấu ngoặc đơn chỉ "biến mất" một cách trực quan sau một thời gian. Với độ thụt tốt, mã dễ đọc.
Barry Brown

8
Nhưng có khả năng dễ dàng di chuyển giữa các S-exp có vẻ rất lớn ... Sau đó, về chủ đề của dấu ngoặc đơn, tôi thích câu trích dẫn sau: Dấu ngoặc đơn? Dấu ngoặc đơn gì? Tôi đã không nhận thấy bất kỳ dấu ngoặc đơn nào kể từ tháng đầu tiên lập trình Lisp. Tôi muốn hỏi những người phàn nàn về dấu ngoặc đơn ở Lisp nếu họ bị làm phiền bởi tất cả khoảng cách giữa các từ trong một tờ báo "- Ken Tilton
Cedric Martin

9

Tôi sẽ hiểu "Lisp" là " Lisp thông thường "; Tôi không nghi ngờ câu trả lời khác sẽ nói " Đề án ". (Gợi ý: Lisp là một họ ngôn ngữ.)

"Nhanh hơn" nghĩa là gì? Về thời gian thực hiện để chạy điểm chuẩn, không, nó không nhanh hơn C ( nhưng có thể ).

"Nhanh" về việc Joe Random Hacker mất bao lâu để viết chương trình làm việc hoặc sửa lỗi trong hệ thống phần mềm lớn? Gần như chắc chắn.

Đối với hacker này , tôi sử dụng nó vì tôi muốn viết mã chứ không phải soạn thảo. Tôi muốn viết một cái gì đó một lần , và không liên tục lặp lại chính mình. Và tôi muốn tương tác với chương trình trong khi tôi viết nó.


Điều đó có tuyệt vời không nếu bạn có thể viết một hàm nhỏ bên trong trình soạn thảo của mình, nó sẽ ngay lập tức làm gì đó với phần còn lại của mã của bạn? Hay bạn có thể làm điều đó rồi?
Đánh dấu C

4
@Mark: Tôi nghĩ bạn đang mô tả Emacs.
Ferruccio

@Ferruccio Tôi nghĩ rằng bạn phải chạy mã của bạn đầu tiên, mặc dù.
Đánh dấu C

2
@Mark C: Chà, bạn phải làm nổi bật khu vực và sau đó M-x eval-region(hoặc eval-buffer), nhưng đó là tất cả.
Frank Shearar

1
@MarkC: Ngoài ra, nếu bạn đang ở trong bộ đệm đầu , bạn chỉ cần viết chức năng của mình và nhấn C-j(tương đương về mặt đạo đức với mục nhập) và nó sẽ có hiệu lực ngay lập tức.
Tikhon Jelvis

7

Tôi thích Lisp vì đó là một phương tiện tuyệt vời để bày tỏ suy nghĩ của tôi. Vị ngữ cho ngôn ngữ yêu thích của tôi là "Nếu tôi có thể chọn bất cứ điều gì để diễn đạt ý tưởng, thì đó sẽ là gì?". Hiện tại nó là Lisp * ( Đề án cụ thể), đến mức tôi thấy mình viết ra các ghi chú lập trình trong đó. Như IRL , giấy và bút ghi chú. Ngay cả khi tôi đang nghĩ về các chương trình tôi cần triển khai trong PHP hoặc Ruby hoặc Python.

Đây không phải là một mẹo mà tôi đã tự dạy mình, hoặc một cái gì đó tôi làm cho độ tin cậy của mọt sách (dù sao cũng không ai được nhìn thấy bên trong cuốn sổ tay của tôi); Chỉ là Lisp rất tự nhiên đối với tôi để suy nghĩ hơn bất kỳ giải pháp thay thế nào, và bất kỳ ngôn ngữ nào cộng hưởng với bạn mà sâu sắc là một trong những điều bạn trân trọng.

* Cũng giống như một chú thích, Haskell đang thu hẹp khoảng cách khá nhanh khi tôi tìm hiểu thêm về nó.


6

Vấn đề là sức mạnh. Power = Work (chức năng chương trình) / Thời gian

"Chúng tôi đã không thể chiến thắng các lập trình viên Lisp; chúng tôi đã theo đuổi các lập trình viên C ++. Chúng tôi đã cố gắng kéo rất nhiều người trong số họ đi được một nửa đến Lisp."

- Guy Steele, đồng tác giả Java spec

Vẽ một số loại đường cong giữa C ++ và Java. Tiếp tục đi, và tại một số điểm dọc theo dòng bạn sẽ tìm thấy Lisp.


2
Vấn đề ở đây là bạn mất rất nhiều chức năng C ++ khi chuyển sang Java, nhưng hãy chọn lại nó (thường ở dạng cải tiến) khi đến Lisp.
David Thornley

@DavidT Câu hỏi SO về trích dẫn chính xác đó có liên kết đến nguồn (tìm kiếm "trích dẫn"). Các trích dẫn không nên được thực hiện nghiêm túc.
Đánh dấu C

@David: Giống như macro. Không chỉ là họ bỏ mặc họ khi đi Java (và do đó là C #) mà họ còn thiếu họ là một "đức tính". Macro thực sự tiện dụng nếu tôi xây dựng DSL trên ngôn ngữ cơ sở.
Mike Dunlavey

@Mike Dunlavey: Tôi thực sự không thích các macro trong C ++ (quái, tôi không thích chúng trong C, nhưng tôi không có nhiều sự lựa chọn ở đó). Tôi thực sự thích macro trong Common Lisp. Bạn biết đấy, tôi nghĩ vấn đề của tôi với nhận xét đó là tôi thích cả C ++ và Common Lisp hơn rất nhiều so với tôi thích Java.
David Thornley

@David: Tôi với bạn 100% về các macro trong Lisp. Trong C / C ++ họ xấu xí và dễ bị lạm dụng, nhưng đối với các loại ( phải thừa nhận là rìa ) thứ tôi làm, họ đang rất tốt hơn nhiều so với không có gì. Tất nhiên, khi tôi làm điều đó trong C ++, nó rất có thể bị coi là lạm dụng, nhưng trong Lisp, nó được coi là ấm áp như thông minh. Đi hình.
Mike Dunlavey

6

Paul Graham tự trả lời câu hỏi này trong What Made Lisp Dif .

Hãy nhớ rằng anh ấy đã sử dụng nó cho khởi nghiệp của mình vào giữa những năm 1990, vì vậy PythonRuby chưa thực sự trưởng thành vào thời điểm đó (hoặc thậm chí có thể không được sinh ra).

Lisp về cơ bản có tất cả các lợi thế của ngôn ngữ động và tôi nghĩ đối với hầu hết các ứng dụng web hiện nay, Python và Ruby khá tuyệt vời, và chúng có lợi thế về khung và tài liệu và cộng đồng sôi động.

Tính năng sát thủ có lẽ là toàn bộ chương trình được tạo thành từ các biểu thức. Điều này có nghĩa là bạn có thể sắp xếp các khối mã cho các hàm (hoặc macro ...), bởi vì một khối mã không có gì khác hơn là một biểu thức.

Python không chính xác có tính năng này; bạn phải xác định các hàm và chuyển chúng xung quanh. Ruby dường như có các khối, có lẽ nó hơi hạn chế so với những gì Lisp có thể làm (tôi không chắc).


Bài viết của Paul Graham rất thú vị bởi vì, tiết kiệm cho một vài mục, hầu hết các ngôn ngữ ngày nay dường như có các tính năng mà anh ấy liệt kê. Vì vậy, có lẽ Lisp đã trở lại hấp dẫn hơn trong những ngày đó; ngày nay nó có giá trị hơn khi ngôn ngữ giới thiệu các tính năng đó?
Andres F.

AST là cú pháp ngôn ngữ vẫn là miền của Lisp. Tôi không biết ngôn ngữ không phải ngôn ngữ mà macro có sẵn toàn bộ ngôn ngữ, trong thời gian biên dịch (Có trình biên dịch về cơ bản gọi macro cho định nghĩa macro là chương trình Lisp của chính nó. Bạn muốn thực hiện http và db trong macro trong thời gian biên dịch ?)
przemo_li

6

Tôi đã có một phản ứng đầu gối với Scheme trong quá khứ, nhưng bây giờ tôi đã sẵn sàng để cho Lisp ( Clojure , thực sự) một phát bắn.

Bạn thấy đấy, trong nhiều năm tôi đã nhặt được các bit của các ngôn ngữ như Java, C #, C ++, Python và mọi thứ không còn thách thức nữa.

Clojure có nhiều hứa hẹn, có vẻ rất sạch sẽ và có thể giải quyết nhiều vấn đề trong thế giới thực. Một trường hợp mạnh mẽ cho một ngôn ngữ sạch như Clojure là sự ra đời của máy tính đa lõi.

Yay LISP!

EDIT: Phần mềm ITA được thành lập bởi các sinh viên tốt nghiệp MIT và Scheme / Lisp là ngôn ngữ duy nhất mà nhiều sinh viên tốt nghiệp MIT đã học. Mặc dù công bằng mà nói, người ta có thể trao đổi nóng các thuật toán Lisp trên một hệ thống sản xuất đang chạy, đây là một điểm cộng rất lớn.


8
Re: Mọi thứ không còn thách thức nữa --- hãy cho Haskell đi và cho chúng tôi biết suy nghĩ của bạn. Ngoài ra, bạn luôn có thể cố gắng học một số INTERCAL để thay đổi!
Đánh dấu C

3
@Mark C, xin lỗi nhưng tôi không cảm động INTERCAL. Thách thức không phải là tiêu chí duy nhất; nó phải có khả năng giải quyết vấn đề thực sự nhanh chóng. Ít nhất Haskell được nhiều người sử dụng và yêu thích.
Công việc

Đó là trong trò đùa, tất nhiên.
Đánh dấu C

1
Cập nhật mã chạy (một cách cẩn thận!) Trên máy chủ sản xuất là một trong những niềm vui của Lisp, vâng. Python, ít nhất là khi tôi chơi với nó, đã không làm tốt điều này; bạn phải biên dịch lại thủ công tất cả các chức năng / phương thức đề cập đến các thay đổi của bạn, trong khi tất cả các triển khai Lisp chung xử lý việc đó cho bạn. Tôi sử dụng cùng một sức mạnh để phát triển: viết, kiểm tra một cái gì đó, chỉnh sửa, kiểm tra - không có vòng lặp biên dịch và bạn có thể thực hiện các bài kiểm tra tương tác của mình và biến chúng thành các bài kiểm tra đơn vị nếu bạn muốn.
Michael H.

@Job tôi quên ... PLEASE?
Đánh dấu C

6

Điều mà tôi thích ở Lisp là nó vượt qua các mô hình. Một số người sẽ nói rằng Lisp là chức năng, những người khác sẽ nói đó là khai báo, và những người khác sẽ nói đó là đa năng. Tôi nghĩ rằng tất cả những điều này bỏ lỡ điểm. Khi bạn sử dụng Lisp, mô hình không còn là một hạn chế.

Muốn có đồ vật? Bạn có thể có chúng. Muốn lập trình chức năng? Bạn có thể có nó. Muốn lập trình logic kiểu Prolog ? Viết một số macro. Muốn lập trình khai báo kiểu SQL? Cứ liều thử đi. Bạn muốn sử dụng một số mô hình chưa được phát minh? Tôi tự tin nó có thể được thực hiện ở Lisp.

Ngoài các ngôn ngữ giống như Forth , tôi vẫn chưa thấy một ngôn ngữ khác cung cấp mức độ linh hoạt này.


+1 Lập trình đa mô hình, hàng thập kỷ trước F #, điểm rất tốt.
Orbled

Tôi ước tôi có thể nâng cao điều này mười lần. Không có thìa ... không có mô hình ... Nó mô tả cảm giác của tôi về Lisp thông thường với độ chính xác cao :)
MadPhysicist

5

"Nhanh hơn" không phải là một điều đơn giản để đo lường - nó thực sự phụ thuộc vào khía cạnh bạn đang đo điểm chuẩn. Tùy thuộc vào nhiệm vụ và việc triển khai Lisp, tốc độ có thể đạt tới C. Hãy nhìn vào loạt đá luân lưu chuẩn để tìm hiểu chi tiết. Việc triển khai SBCL của Lisp ngang bằng với Máy chủ Java 6 và nhanh hơn đáng kể so với Ruby hoặc Python.

Nhưng, tốc độ thuần túy không phải là lý do chính để chọn ngôn ngữ lập trình - nếu có, tất cả chúng ta đều sẽ lập trình bằng ngôn ngữ lắp ráp , phải không? Đối với tôi, niềm vui hàng ngày của Lisp là mã được biên dịch, nhưng tôi không phải gỡ ứng dụng xuống, biên dịch lại mọi thứ và sau đó bắt đầu chạy lại từ đầu. Thay vào đó, tôi có thể thay đổi một chức năng duy nhất và sự thay đổi đó sẽ có hiệu lực ở mọi nơi và tôi có thể thấy ngay hiệu ứng trong ứng dụng của mình. Hơn nữa, cách tiếp cận "viết, kiểm tra, viết nhiều hơn, kiểm tra nhiều hơn" rất nhanh giúp kiểm tra ngay lập tức trước khi viết mã (và sau đó bạn có thể biến các thăm dò tương tác đó thành các bài kiểm tra đơn vị sau này).

Hãy tưởng tượng viết email trong đó sau mỗi dòng, bạn phải nhấn một nút để biên dịch đầu ra email của bạn ra màn hình trước khi tiếp tục suy nghĩ của bạn. Đó là những gì viết bằng Java hoặc ngôn ngữ khác giống như vậy đối với tôi. Đôi khi có một lý do để làm điều đó và tôi thích Java, nhưng Lisp chỉ phản ứng nhanh hơn và hoàn thành công việc dễ dàng hơn.


Nếu tôi bắt đầu mới hôm nay, có lẽ tôi sẽ chọn Ruby - nó được thừa hưởng phần lớn bản chất Lisp, nhưng nó có các thư viện hiện đại hơn và một nhà độc tài nhân từ duy nhất thúc đẩy nó tiến về phía trước. Nhưng, đó không phải là câu hỏi mà OP đã hỏi.
Michael H.

Tôi thực sự đã chọn ruby ​​để bắt đầu, và bây giờ tôi đang cố gắng học newLisp.
philosodad

5

Tôi đang học Lisp ( newLisp ) vì một vài lý do.

Lý do số một: Lisp khiến tôi suy nghĩ khác đi, điều đó khiến tôi trở thành một lập trình viên Ruby tốt hơn.

Có vẻ rất lúng túng khi thực hiện một số cách nhất định trong Lisp, ví dụ lặp lại lồng nhau để đi qua nhiều danh sách. Vì vậy, nó buộc tôi phải sử dụng những thứ khác, như map. Ngôn ngữ yêu thích của tôi, Ruby, có cùng một phương pháp bản đồ, nhưng tôi không luôn sử dụng nó, bởi vì nó không quen thuộc: Tôi đã học cách làm mọi thứ bằng một kỹ thuật kém và khi ngôn ngữ hỗ trợ kỹ thuật đó, tôi tiếp tục sử dụng nó.

Lý do số hai: Lisp là thiết thực và có thư viện hiện đại tốt.

Có một khung web nhẹ, rất đẹp cho newLisp được gọi là chuồn chuồn . Điều này cho phép tôi sử dụng mã newLisp thay vì PHP cho một số tác vụ. Tôi không thực sự thích PHP và newLisp có vẻ thú vị hơn cho nhiệm vụ cụ thể này hơn Ruby.

Lý do thứ ba: Lisp phù hợp về mặt cú pháp và khái niệm.

Đối với tôi, đây là sự khác biệt lớn giữa Ruby và Python, tính nhất quán.


+1: "Lisp phù hợp về mặt cú pháp và khái niệm." Đây là một tính năng rất quan trọng của một ngôn ngữ. Một số ngôn ngữ được thiết kế tồi thiếu tính nhất quán, chúng giống như một tập hợp lớn các thành ngữ được sắp xếp theo thứ tự (tôi có một ngôn ngữ trong đầu, nhưng tôi sẽ không đặt tên cho nó :-)). Lisp là về mặt này rất nhất quán. Ngay khi có thời gian, tôi chắc chắn sẽ cố gắng học nó.
Giorgio

4

Bạn có thể nói "Lòng trung thành với thương hiệu" không?

Tôi bắt đầu ở Fortran. Tôi yêu nó.

Tôi chuyển sang Lisp. Lúc đầu tôi ghét nó. Sau đó, tôi học cách yêu nó, và ghét Fortran.

Sau này Pascal, C, C ++, các bộ lắp ráp khác nhau, C #. (Thật ra tôi không yêu C #.)

Tôi đoán tôi hay thay đổi?


4

Khi Lisp được tạo ra, họ bắt đầu từ toán học, không phải khoa học máy tính (chưa thực sự tồn tại). Và nhóm Lisp đã có một số điều THỰC SỰ đúng. Lisp đã có bộ sưu tập rác vào năm 1960 hoặc lâu hơn thế! Họ thực sự đã làm một công việc tuyệt vời.

Tôi nghĩ rằng bài hát Ngọn lửa vĩnh cửu bao trùm nó.


Vâng rõ ràng Lisp là ngôn ngữ đầu tiên của GC.
Đánh dấu C

2

Một sức hút lớn là cộng đồng. Lisp đã có một trận hòa cho các nhà phát triển đầy tham vọng và sáng giá nhất kể từ khi ngôn ngữ được phát minh. Bất cứ nơi nào các nhà nghiên cứu đang cố gắng giải quyết các vấn đề chưa bao giờ được giải quyết, bạn có thể tìm thấy Lisp, như trong nghiên cứu trí tuệ nhân tạo (AI), tầm nhìn máy tính, lập kế hoạch, biểu diễn kiến ​​thức và tối ưu hóa heuristic phức tạp. Ngôn ngữ cho vay để giải quyết các vấn đề cả từ dưới lên và từ trên xuống cùng một lúc, điều này dường như giúp ích trong việc đương đầu với những thách thức khó khăn nhất.

Cú pháp mở rộng thông qua các macro có nghĩa là hiếm khi cần phải mở rộng định nghĩa ngôn ngữ. Phần lớn những gì sẽ yêu cầu một phần mở rộng ngôn ngữ trong một ngôn ngữ hạn chế hơn chỉ là một macro với Lisp. Vì vậy, các lập trình viên Lisp có thể tự do sử dụng các khái niệm ngôn ngữ mới được phát minh mà không cần một tiêu chuẩn ngôn ngữ mới và không nhất thiết phải là một hình phạt tốc độ thực sự. Ở mức độ cơ bản, các chuỗi mã soạn sẵn được thực hiện không cần thiết bằng các phần mở rộng nhỏ. Toàn bộ ý tưởng mới trong luồng điều khiển, như hợp nhất kiểu Prolog, được triển khai hiệu quả và gọn nhẹ như các phần mở rộng.

Hệ thống OOP, CLOS , thuộc một lớp riêng về tính linh hoạt. Rất khó để quay lại C ++ / Java / C # OOP thô sơ sau khi nếm thử. Các  mẫu thiết kế GoF 5 trở nên không cần thiết vì chúng có thể được thể hiện đơn giản và trực tiếp.

Ngôn ngữ này không có chủ sở hữu công ty duy nhất và không có triển khai dứt khoát duy nhất, mặc dù nó có một tiêu chuẩn ANSI với nhiều triển khai tuân thủ. Các triển khai mới chủ yếu xuất hiện sau mỗi thập kỷ và những triển khai cũ vẫn còn khá tích cực. Các chuyên gia có thể lên kế hoạch sử dụng kiến ​​thức chuyên ngành của họ trong một thời gian dài sắp tới. Điều này không gây ra một số ma sát vô chính phủ và sự phân mảnh cộng đồng, nhưng điều đó cũng có nghĩa là tấm thảm không thể được kéo ra và ngôn ngữ không thể trở nên phù hợp vì lý do chính trị của công ty hoặc dự án. Luôn luôn có nhiều triển khai thương mại và nguồn mở đang được thực hiện. Những người thực hiện tập trung nhiều hơn thường xuyên điểm chuẩn trong một hệ số gấp đôi của việc triển khai ngôn ngữ mệnh lệnh rất nhanh, được tài trợ rất nhiều.

Điểm nổi bật của thương mại hóa Lisp sớm là dấu chân bộ nhớ để chứa đựng cả các tính năng an toàn của ngôn ngữ và môi trường phát triển phần mềm tiên tiến mà chúng bao gồm, với các tính năng đáng kinh ngạc như tài liệu trực tuyến đầy đủ bao gồm cả đồ họa. Máy Lisp tượng trưng 64 MB không thể tiết kiệm chi phí so với máy trạm 8 MB Sun. Ngày nay, giá RAM đã sụp đổ và có sự quan tâm rất lớn đối với các ngôn ngữ Lisp, đặc biệt khi xem xét rằng các ngôn ngữ Java, C #, PHP chính thống ngày nay chỉ tiến bộ tối thiểu so với 30 năm trước.

Hiện tại có các ngôn ngữ hiện đại đang cạnh tranh với Lisp về tư duy với các nhà phát triển thông minh: Python, Lua , Erlang , HaskellOCaml . Nhưng không ai cung cấp cùng một sự trưởng thành, khả năng thích ứng, nhiều triển khai và tốc độ tuân thủ tiêu chuẩn.


1

Tôi không thực sự làm Lisp. Nhưng nơi tôi làm việc có các yếu tố hữu hạn với hàng triệu dòng chủ yếu là Fortran. Người mà tôi tôn trọng nhất về công cụ điện toán (mã cơ học chất lỏng tính toán ) cho rằng sự kết hợp lý tưởng là Lisp ở bên ngoài (chủ yếu vì bạn tránh các vấn đề lộn xộn với quản lý bộ nhớ) và Fortran cho các thuật toán cấp thấp (Fortran là tốt nhất để khai thác khả năng véc tơ của SSE / AVX và chúng tôi nghĩ rằng khách hàng tiềm năng này khó có thể đóng cửa).

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.