Nơi học cách sử dụng Common Lisp thực tế [đã đóng]


79

Tôi là một lập trình viên C ++ đang cố gắng học Common Lisp. Tôi đã xem một số cuốn sách như Land of Lisp và đọc nhiều bài báo trực tuyến về các đức tính khác nhau của Lisp. Tuy nhiên, tôi cần một số lời khuyên.

Hầu hết mọi thứ tôi đã đọc về Common Lisp đều liên quan đến nó tuyệt vời như thế nào và bạn có thể hoàn thành công việc với tốc độ đáng kinh ngạc như thế nào cũng như cách nó giải quyết rất nhiều vấn đề với các ngôn ngữ lập trình hiện đại cách đây 30 năm. Ngoài ra, macro tuyệt vời như thế nào và mọi mô hình lập trình (OO, hàm, dựa trên tác nhân hoặc bất cứ thứ gì, v.v.) đều có thể được sử dụng trong Lisp và cách danh sách là cấu trúc dữ liệu cuối cùng. Về cơ bản coi Lisp giống như một ngôn ngữ nghiên cứu và nói rằng nó khác biệt và mang tính cách mạng như thế nào.

Và tất cả những điều đó có lẽ đúng, nhưng vấn đề là tôi chưa thấy nhiều thứ về cách làm những việc thực tế như đọc một tệp và chia nó thành các từ và thực hiện một số xử lý trên đó. Tôi không quan tâm đến việc học Common Lisp vì lợi ích của việc học Common Lisp, nhưng vì lợi ích của việc tôi đã từng làm trong C ++ được thực hiện nhanh hơn và ít lỗi hơn.

Vì vậy, câu hỏi của tôi là tài nguyên tốt nhất (có thể là trang web, sách, bất cứ thứ gì) tập trung vào việc dạy cách sử dụng Common Lisp để thực hiện các tác vụ lập trình thông thường như

  • Cách đọc tệp
  • Cách đọc tệp, thay thế các từ trong tệp và ghi kết quả trở lại tệp
  • Lặp lại các tệp trong một thư mục và các nội dung khác của hệ thống tệp
  • Tương tác với một db SQL
  • Thực hiện liên lạc qua ổ cắm
  • Phân luồng cho những thứ như máy chủ web
  • Tạo GUI
  • Thực hiện các thao tác trên tệp nhị phân
  • Viết trình phân tích cú pháp (không phải trình thông dịch cho Lisp trong Lisp, theo tôi hiểu nó giống như 5 dòng của Lisp)
  • Tương tác với hệ điều hành (tức là những thứ được viết bằng C hoặc C ++) để thực hiện những thứ mà Lisp không thể làm được
  • Cách viết phần mở rộng Lisp trong C (điều đó có thể không?)
  • Nhúng một trình thông dịch lua (có thể không?)

Và cũng có một lưu ý ít thực tế hơn, đó là cách triển khai các cấu trúc dữ liệu phổ biến trong lisp như heap, stack, cây tìm kiếm nhị phân, v.v. Tuy nhiên, đó có thể chỉ là sử dụng các thao tác danh sách của Lisp như carcdrtheo đúng cách. Tôi không biết.

Tôi thực sự nghi ngờ rằng bất kỳ điều nào trong số này (ngoại trừ hai điều cuối cùng trong danh sách) là không thể với Lisp hoặc mọi người sẽ không yêu thích nó nhiều như vậy. Và những thứ nói trên mà tôi đã đọc đề cập đến rất nhiều phần mềm thế giới thực được viết bằng Lisp (lưu ý đến cửa hàng web Yahoo!).

Tuy nhiên, đã từng lập trình bằng ngôn ngữ mệnh lệnh ( ? ) Trước đây, tôi lo lắng sử dụng kiến ​​thức mới mà tôi có được để viết các ứng dụng trong thế giới thực. Vậy cách nhanh nhất để học viết phần mềm thực hành với Lisp là gì?

Nhân tiện, tôi đã xem Lisp chung thực tế của Peter Seibel nhưng, theo đánh giá của TOC, nó chỉ đề cập đến một số điều tôi muốn học cách sử dụng Lisp để làm.

Một câu hỏi nữa nếu tôi có thể (xin lỗi nếu đây là kết hợp hai câu hỏi thành một), tôi có thể tìm tham chiếu đến các chức năng và công cụ của Lisp ở đâu?

Và tôi thực sự muốn thích Lisp.


3
Câu hỏi hay. Bản thân tôi, là một lập trình viên C ++, đã học Lisp trong mùa hè này, chủ yếu là với những cuốn sách được đề xuất trong câu trả lời. Rất hạnh phúc cho đến bây giờ, nhưng vẫn đang theo cách của tôi thông qua các macro. Trên Lisp của Paul Graham là một viên ngọc quý thực sự. Ngoài ra, tài liệu về Emacs Lisp giúp bạn theo dõi Lisp nói chung, cũng như cho phép bạn viết các tập lệnh thực sự hữu ích từ chính trình soạn thảo.
Diego Sevilla

Hiện có một trang Tài nguyên Lisp Chung mở rộng trên trang Bắt đầu của Common Lisp trên Docs.SO.
Gustav Bertram

Hiện tại cũng có Sách dạy nấu ăn Common Lisp cập nhật . Tuy nhiên, TOC của nó vẫn chưa rộng rãi, vì vậy chúng tôi tìm kiếm các thư viện hiện đạituyệt vời trong danh sách Awesome CL . Và +1 cho "Công thức CL" của E. Weitz.
Ehvince

Câu trả lời:


94

Tôi đề xuất đọc 'Danh sách chung thực tế ', vì nó đã trả lời một số câu hỏi của bạn.

Có thể có ba đến bốn cuốn sách bạn nên đọc :

Tham chiếu Lisp chung

Sách hướng dẫn

Bây giờ, điều tiếp theo bạn nên kiểm tra là hướng dẫn sử dụng Lisp của bạn. Nó mô tả rất nhiều phần mở rộng cụ thể: mạng, luồng, ...

Tài liệu về triển khai Lisp chung:

SLIME (Lisp-IDE dựa trên Emacs) có Hướng dẫn sử dụng SLIME .

Tài liệu cho các thư viện Lisp chung:

Thư viện

Đối với thư viện sử dụng

Bây giờ xem xét một số điểm của bạn:

  • Cách đọc tệp

Xem từ điển tệp và luồng trong HyperSpec . WITH-OPEN-STREAM, READ, READ-LINE, READ-CHAR, READ-BYTE, READ-SEQUENCE, ...

  • Cách đọc tệp, thay thế các từ trong tệp và ghi kết quả trở lại tệp

Sử dụng ở trên. Xem thêm: VIẾT và liên quan.

  • Lặp lại các tệp trong một thư mục và các nội dung khác của hệ thống tệp

Xem ở trên. HƯỚNG DẪN, tên đường dẫn, ...

  • Tương tác với một db SQL

Sử dụng thư viện CLSQL chẳng hạn.

  • Thực hiện liên lạc qua ổ cắm

Xem hướng dẫn sử dụng Lisp của bạn hoặc sử dụng một trong các thư viện di động. Xem Quicklisp.

  • Phân luồng cho những thứ như máy chủ web

Xem hướng dẫn sử dụng Lisp của bạn hoặc sử dụng một trong các thư viện di động. Xem Quicklisp.

  • Tạo GUI

Phụ thuộc. Xem Quicklisp hoặc một thư viện triển khai cụ thể.

  • Thực hiện các thao tác trên tệp nhị phân

Xem Hyperspec để biết các hoạt động đối với tệp và luồng. VIẾT-BYTE, ĐỌC-BYTE. Mở luồng dưới dạng luồng nhị phân.

  • Viết trình phân tích cú pháp (không phải trình thông dịch cho Lisp trong Lisp, theo tôi hiểu nó giống như 5 dòng của Lisp)

Sử dụng một trong những công cụ hiện có cho việc đó. Nghiên cứu trình phân tích cú pháp hiện có. Có rất nhiều trình phân tích cú pháp được viết bằng Lisp, nhưng không có nhiều trong các cuốn sách về điều đó (ngoài các trình phân tích cú pháp ngôn ngữ tự nhiên, được mô tả trong tài liệu về AI).

  • Tương tác với hệ điều hành (tức là những thứ được viết bằng C hoặc C ++) để thực hiện những thứ mà Lisp không thể làm được

Phụ thuộc. Xem Quicklisp hoặc một thư viện triển khai cụ thể.

  • Cách viết phần mở rộng Lisp trong C (điều đó có thể không?)

Phụ thuộc. Xem Quicklisp hoặc một thư viện triển khai cụ thể. -> FFI

Lời khuyên cuối cùng: Đọc mã từ các tác giả khác.

Nghiên cứu mã Lisp khác. Có đủ mã Lisp rất đa dạng. Từ máy chủ web đến phần mềm sáng tác nhạc.


2
Có vẻ như rất nhiều thứ được triển khai cụ thể. Có bất cứ điều gì giống như C không phải là thực hiện cụ thể nhưng hệ điều hành cụ thể? Có vẻ như thật khó khả thi khi bắt tất cả những người muốn mã của bạn sử dụng cách triển khai bạn đã chọn. Ngoài ra, tôi không thực sự quan tâm đến AI.
NewLisper

4
@NewLisper: có rất nhiều thư viện di động. Xem Quicklisp.
Rainer Joswig

4
@NewLisper: ngay cả khi bạn không quan tâm đến AI, bạn cũng nên đọc một số tài liệu vì nó mô tả cách tiếp cận 'lập trình biểu tượng' mà Lisp đã được phát minh.
Rainer Joswig

2
@NewLisper: Đây là một câu trả lời khá đầy đủ. Lisp gần với Python hơn về cách nó liên quan đến các lệnh gọi OS & C / C ++. Việc kết hợp một FFI (giao diện chức năng ngoại) được cho là khá đơn giản. Cũng cần lưu ý rằng có vẻ như ưu thế của người dùng Common Lisp trên web dường như đang sử dụng SBCL.
Paul Nathan

2
Tôi sẽ thêm một số thư viện cụ thể: sockets: usocket; máy chủ web: hunchentoot; luồng: bordeaux-thread, chanl; Tương tác / liên kết hệ điều hành C-thứ: CFFI, UFFI.
Svante

6

Hãy xem Cliki the Common Lisp wiki nó cung cấp một danh sách các thư viện có sẵn cho Common Lisp sẽ giúp bạn hoàn thành tất cả các mục của mình.

Ngoài ra, bạn sẽ muốn xem Common Lisp Cookbook (cũng có một phiên bản cập nhật hơn ). Nó có một loạt các mã cho các tác vụ thông thường như đọc một dòng tập tin tại một thời điểm , và giao diện chức năng nước ngoài để tương tác với các thư viện viết bằng C .

Bạn có thể viết phần mở rộng cho Lisp bằng C tùy thuộc vào việc triển khai bạn đang sử dụng. Ví dụ như Emacs-Lisp cho phép bạn làm điều đó mặc dù nó không phải là Common Lisp. Thông thường những gì bạn muốn làm là viết mã trong Common Lisp và sau đó tối ưu hóa nó càng nhiều càng tốt bằng cách sử dụng các khai báo trình biên dịch Lisp khác nhau hoặc phương pháp khác mà bạn sử dụng giao diện hàm nước ngoài.

Việc phân luồng phụ thuộc vào việc bạn sử dụng cách triển khai nào, nhưng tôi nghĩ hầu hết chúng đều có luồng.

Hunchentoot là một trong những máy chủ web Lisp tốt nhất và khá dễ dàng để bắt đầu. Bạn không phải tự viết bất kỳ mã luồng nào, bạn chỉ cần viết các hàm xử lý yêu cầu HTTP.

Ai đó đã biên soạn danh sách các tùy chọn GUI cho Lisp :

  • cl-gtk2, một giao diện cho thư viện gui GTK
  • McClim
  • Ngọc Hồng lựu
  • Qt chung
  • EQL

1
Common Lisp Cookbook trông thực sự hữu ích. Giống như tôi đã nói với anh chàng kia, có vẻ như có rất nhiều thứ được triển khai cụ thể. Có vẻ không công bằng khi khiến tất cả những người bạn muốn có thể chạy mã của mình sử dụng cùng một cách triển khai mà bạn sử dụng. Đó chỉ là cách nó được?
NewLisper

Đúng là như vậy, một số người cố gắng tuân theo tiêu chuẩn ANSI Common Lisp hoặc cố gắng gắn bó với các thư viện hoạt động trên nhiều triển khai để nó không quá phức tạp.

Bạn có mất khả năng làm nhiều việc nếu bạn dính vào ANSI Common Lisp, như nội dung hệ thống tệp, nội dung mạng, v.v.?
NewLisper

Lisp giúp dễ dàng viết các thư viện di động trên các API cụ thể để triển khai, vì vậy tôi sẽ không lo lắng về điều đó.
Pavel Penev

Này, bạn có phiền thay đổi url của Sách dạy nấu ăn thành lispcookbook.github.io/cl-cookbook không? Đó là cùng một nội dung, nhưng phần lớn được tăng cường, những thứ lỗi thời được loại bỏ và có hình dạng đẹp hơn. Xem lịch sử git của nó! Cảm ơn.
Ehvince
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.