Clojure có gì tuyệt vời? [đóng cửa]


40

Gần đây tôi đã xem Clojure và tôi tình cờ thấy bài đăng này trên Stackoverflow chỉ ra một số dự án tuân theo các thực tiễn tốt nhất và mã Clojure tốt nói chung. Tôi muốn tìm hiểu về ngôn ngữ sau khi đọc một số hướng dẫn cơ bản vì vậy tôi đã xem qua một số dự án "thế giới thực".

Sau khi xem ClojureScriptCompojure (hai dự án "tốt" đã nói ở trên), tôi chỉ cảm thấy Clojure là một trò đùa. Tôi không hiểu tại sao ai đó lại chọn Clojure hơn, Ruby hoặc Python, hai ngôn ngữ mà tôi yêu thích và có cú pháp rõ ràng như vậy và rất dễ nhận trong khi Clojure sử dụng rất nhiều dấu ngoặc đơn và ký hiệu ở mọi nơi mà nó phá hỏng khả năng đọc tôi.

Tôi nghĩ rằng Ruby và Python rất đẹp, dễ đọc và thanh lịch. Chúng rất dễ đọc ngay cả đối với những người không biết ngôn ngữ bên ngoài. Tuy nhiên, Clojure mờ đục đối với tôi và tôi cảm thấy mình phải biết từng chi tiết nhỏ về việc triển khai ngôn ngữ để có thể hiểu bất kỳ mã nào.

Vì vậy, xin vui lòng, soi sáng cho tôi!

  • Clojure có gì hay?
  • Tối thiểu tuyệt đối mà tôi nên biết về ngôn ngữ để đánh giá cao nó là gì?

14
I don't understand why someone would pick Clojure over say, Ruby or Python- nó chạy trên jvm và có thể sử dụng toàn bộ thư viện java. ... have such a clean syntaxcó thể nói, lisp như các ngôn ngữ chức năng có cú pháp và cấu trúc rất rõ ràng, nó chỉ là một ngôn ngữ mà hầu hết mọi người không sử dụng.

22
Tên của nó là gợi cảm.
lập trình viên

4
Bất kỳ thiếu niên nào sống trong tầng hầm đều có thể nhặt Python và Ruby trong vài tháng. Nếu đó là tất cả những gì họ muốn sử dụng, thì họ sẽ không bao giờ ra khỏi tầng hầm. Tôi không nói rằng ai đó đã thực hiện phát triển Python chuyên nghiệp trong nhiều năm là một người ít nói hơn so với người viết nhúng C, nhưng nếu Python và Ruby là tất cả những gì họ biết và tất cả những gì họ muốn biết, thì có gì đó thật đáng nghi. Nhân tiện, tôi đã mất hơn 6 năm sau khi tốt nghiệp để khám phá và đánh giá cao lập trình chức năng và Lisps. Phản ứng đầu tiên của tôi với Scheme là một cú giật đầu gối.
Công việc

4
"Có thể nói, ngôn ngữ chức năng không thể thiếu có cấu trúc và cú pháp rất rõ ràng, nó chỉ là một ngôn ngữ mà hầu hết mọi người chưa từng sử dụng.": Tôi có rất ít kinh nghiệm với Lisp và tôi mới bắt đầu đọc cuốn sách "Thực hành chung Lisp". Cho đến nay, tôi không gặp phải bất kỳ vấn đề nào với cú pháp; IMHO những huyền thoại về cú pháp giống Lisp trở nên ít đọc hơn chỉ là FUD.
Giorgio

4
Tôi bắt đầu nhìn vào Clojure gần đây (nhưng tôi có kinh nghiệm trước đó với Haskell và Scala, vì vậy cú pháp không gây sốc như vậy). Tôi thực sự tìm thấy nó đáng ngạc nhiên có thể đọc được. Có rất nhiều fewbiểu tượng bên ngoài dấu ngoặc đơn so với nhiều ngôn ngữ và hầu như không có từ dành riêng. Lý do bạn thấy nó không thể đọc được là vì đó là một mô hình hoàn toàn mới và hoạt động theo một cách khác về cơ bản so với ngôn ngữ Hướng đối tượng điển hình. Cung cấp cho nó một thời gian và sức mạnh thông qua.
KChaloux

Câu trả lời:


47

Đối với nền bạn đã đưa ra, nếu tôi có thể diễn giải:

  1. Bạn đã quen thuộc với Ruby / Python.
  2. Bạn chưa thấy những ưu điểm của Clojure.
  3. Bạn không tìm thấy cú pháp Lisp hoặc Clojure rõ ràng.

... Tôi nghĩ rằng câu trả lời tốt nhất là đọc cuốn sách Lập trình Clojure của Emerick, Carper và Grand. Cuốn sách có nhiều so sánh mã rõ ràng với Python, Ruby và Java và có các giải thích văn bản giải quyết các bộ mã hóa từ các ngôn ngữ đó. Cá nhân tôi đã đến Clojure sau khi xây dựng các dự án có quy mô tốt với Python và có một số kinh nghiệm về Lisp; đọc cuốn sách đó đã giúp thuyết phục tôi bắt đầu sử dụng Clojure không chỉ trong các dự án phụ mà còn cho các mục đích chuyên nghiệp.

Để giải quyết trực tiếp hai câu hỏi của bạn:

  1. Clojure có gì hay? Rất nhiều câu trả lời trên trang web này và các nơi khác, ví dụ: xem https://www.quora.com/Why-would-someone-learn-Clojure
  2. Tối thiểu tuyệt đối mà tôi nên biết về ngôn ngữ để đánh giá cao nó là gì? Tôi khuyên bạn nên biết những ý tưởng lớn đằng sau thiết kế của Clojure, như được nêu rõ trong cả Lập trình ClojureNiềm vui của sách Clojure , và trong các cuộc nói chuyện của Rich Hickey, đặc biệt. Cuộc nói chuyện Đơn giản dễ dàng . Khi bạn biết những gì / tại sao bạn có thể bắt đầu hiểu cách thức khi đọc mã Clojure, đặc biệt. làm thế nào để thay đổi suy nghĩ của bạn từ các lớp, đối tượng, trạng thái / đột biến thành "chỉ các hàm và dữ liệu" (các hàm bậc cao hơn, bản đồ / bộ / trình tự, các loại).

Gợi ý bổ sung: Sự thanh lịch và sức mạnh của Lisp một phần từ cú pháp tối giản và hoàn toàn nhất quán của nó. Thật dễ dàng hơn để đánh giá cao điều đó với một trình soạn thảo tốt, ví dụ như Emacs với chế độ clojure và ParEdit. Khi bạn quen thuộc hơn với nó, cú pháp sẽ biến mất và bạn sẽ "thấy" ngữ nghĩa, ý định và trừu tượng ngắn gọn. Thứ hai, đừng bắt đầu bằng cách đọc nguồn cho ClojureScript hoặc Compojure, những thứ đó quá nhiều cùng một lúc; thử một số vấn đề của 4clojure.org và so sánh các giải pháp với các lập trình viên hàng đầu ở đó. Nếu bạn thấy 4 - 6 giải pháp khác, chắc chắn sẽ có người viết ra một giải pháp kiểu FP thực sự, cô đọng mà bạn có thể so sánh với một giải pháp kiểu mệnh lệnh phức tạp, vụng về và phức tạp không cần thiết.


20

Phương ngữ Lisp có một phân khúc độc đáo do cú pháp đơn giản của chúng. Cú pháp đơn giản này làm cho lập trình meta thông qua việc sử dụng các macro rất đơn giản. Điều này cho phép bạn lập mô hình ngôn ngữ phù hợp với miền vấn đề của bạn thay vì mô hình hóa để phù hợp với miền vấn đề của bạn với ngôn ngữ của bạn. Thật tuyệt khi bạn quay đầu lại và điều đó cho phép bạn thực hiện nhiều việc một cách dễ dàng, điều rất khó trong các ngôn ngữ khác.

Nhược điểm là vì mỗi chương trình Lisp về cơ bản xác định ngôn ngữ riêng của nó, bạn thực sự cần nắm vững mọi thứ để hiểu những gì đang diễn ra.

Bây giờ, để trả lời câu hỏi của bạn ...

  1. Clojure là một phương ngữ Lisp hiện đại chạy trong JVM / CLR. Điều này giúp dễ dàng tận dụng sức mạnh của Lisp trong cơ sở hạ tầng hiện có.

  2. Điều cần thiết là phải hiểu cách sử dụng macro để xây dựng Lisp vào miền vấn đề của bạn để đánh giá cao việc sử dụng macro. Tôi thực sự chỉ hiểu điều này sau khi thực hiện thời gian chạy Lisp, khi tôi thấy rằng phần lớn các tính năng ngôn ngữ cốt lõi có thể dễ dàng được thực hiện trong chính Lisp. Phải mất một dự án có quy mô công bằng để có được điều này.

Điểm cộng của nó sang một bên, mặc dù rất thú vị khi lập trình, cá nhân tôi không có nhiều trường hợp tôi sẽ chuyển sang vấn đề hàng ngày. Nó là một công cụ rất tốt để học mở rộng tâm trí và sau khi học Lisp đúng cách, việc tận dụng các cơ sở lập trình meta trong các ngôn ngữ khác trở nên tự nhiên hơn nhiều.

Cú pháp đơn giản giúp máy tính dễ dàng diễn giải (cho phép các macro mạnh mẽ dễ dàng như vậy), nhưng nó khiến cho con người rất khó phân tích các biểu thức phức tạp một cách nhanh chóng.


2
Bạn đã nhìn vào bảng ánh sáng ?

4
Câu trả lời của bạn làm cho âm thanh giống như macro là cách thông thường để tiếp cận lập trình Lisp, trong khi thực tế hầu hết các vấn đề lập trình có thể được giải quyết bằng các hàm thông thường, hạng nhất. Macro được dự định chủ yếu được sử dụng để lập trình ngôn ngữ (tức là mở rộng ngôn ngữ). Xem thêm bookshelf.jp/texi/onlisp/onlisp_9.html
Robert Harvey

3
@RobertHarvey Tôi sẽ lập luận rằng nếu bạn không tận dụng lợi thế của marcos, thì có rất nhiều ngôn ngữ khác mà tôi sẽ chuyển sang cung cấp các hàm hạng nhất với cú pháp dễ đọc hơn nhiều.
bunglestink

@MichaelT có vẻ gọn gàng. Tôi thích khái niệm này.
DPM

3
@RobertHarvey Scala, JavaScript, C #, Python và Haskell đều nằm trên đỉnh đầu của tôi, theo như các ngôn ngữ có chức năng hạng nhất mà tôi sẽ xem xét cú pháp có thể phân tích cú pháp của con người nhiều hơn Lisps.
bunglestink

10

Những điểm mạnh của Clojure đã được làm nổi bật nhiều lần, và, chắc chắn, tạo nên một ngôn ngữ rất mạnh mẽ, vì vậy tôi sẽ không lặp lại chúng ở đây.

Tôi luôn yêu thích lisp, kể từ những ngày uni và tôi thực sự rất phấn khích khi tôi phát hiện ra Clojure (có lẽ cơ hội sử dụng lisp bên ngoài học viện cuối cùng!). Tuy nhiên, khi tôi bắt đầu học, một cảm giác khó chịu đã bắt đầu len vào, mặc dù tôi không thể xác định chính xác những gì tôi không thích. Trước hết tôi sẽ nói rằng mã hóa trong Common lisp rất dễ dàng và thú vị đối với tôi nhưng Clojure có một đường cong học tập dốc hơn. Clisp có một vẻ đẹp và sự thanh lịch nhất định với nó. Tôi không chắc tôi sẽ có cảm giác tương tự từ Clojure. Tôi tự hỏi nếu cảm giác đó sẽ biến mất khi tôi có thêm kinh nghiệm.

Tôi có một dự đoán khác cho sự đẩy lùi bí ẩn của tôi. Tôi nghĩ rằng nó có thể là sự linh hoạt tuyệt vời của nó. Chẳng hạn, bạn có thể có các cấu trúc nửa vectơ và nửa bản đồ và với một vài ký tự mã bạn có thể chấp nhận chúng làm tham số, tách chúng ra và xử lý chúng một cách chính xác. Vâng, nó loại bỏ tất cả các mẫu soạn sẵn, nhưng bằng cách nào đó nó không cảm thấy đúng. Giống như bạn không bao giờ biết rất rõ các quy tắc dưới tất cả các dấu ngoặc đơn, dấu hai chấm, chữ nổi, v.v. đang hoạt động.

Đối với tôi, tôi vẫn yêu thích ngôn ngữ này vì tất cả các lợi thế của nó (chủ yếu, chạy trong JVM và đơn giản hóa đồng thời, trong khi mạnh hơn và ngắn gọn hơn Java và với các lỗi thiết kế ít rõ ràng hơn) nhưng ban giám khảo vẫn không biết liệu có gì không có thể đã được cải thiện.

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.