2012-10-29 21 views
11

Có thể ai đó vui lòng giải thích những vấn đề cụ thể với việc sử dụng gói cl trong elisp? Là một coder mới trong emacs tôi cảm thấy như thể tôi đang làm một sai lầm bất cứ khi nào tôi đạt cho (yêu cầu 'cl) tùy chọn. Tôi đã đọc và hiểu vấn đề biên dịch byte với gói cl. Tôi đã xem xét các lập luận cũ và không muốn làm sống lại chúng. Tôi cũng không tìm kiếm bất kỳ bình luận chung về việc liệu lisp thông thường là tốt hơn so với x thương hiệu lisp.Làm thế nào để tôi sử dụng tốt nhất phổ biến-lisp trong elisp (nếu ở tất cả)?

Những gì tôi muốn biết là thực tế làm thế nào để sử dụng chung-lisp để bất kỳ elisp tôi viết sẽ có một cơ hội tốt được chấp nhận bởi phần lớn các lập trình viên elisp. Cụ thể, tôi có nên tránh sử dụng hoàn toàn lisp chung hay có một số phần của ngôn ngữ có thể chấp nhận được đối với mọi người và một số phần trong đó phần lớn các lập trình viên sẽ kích hoạt và chế giễu?

Nếu không có nhu cầu để hạn chế bề rộng của câu trả lời, là thế này:

(mapcar (lambda(x) (* x x)) '(1 2 3)) 

nhiều hơn nữa chấp nhận được hơn thế này:

(require 'cl) 
(loop for el in '(1 2 3) collect (* el el)) 
+1

Thật tuyệt vời khi nhận được một số nhận xét từ bất kỳ ai không thích phổ biến-lisp (hoặc có thể không có bất kỳ và huyền thoại là busted). –

+3

gói CL không phải là Common-Lisp, vì vậy bạn có thể thích và không thích người khác. Tôi thích nhiều phần của gói CL cung cấp, nhưng có những phần khác có vấn đề vì nhiều lý do khác nhau. Thư viện 'cl-lib' mới trong Emacs-24.3 dọn dẹp không gian tên để chúng ta không cần quan tâm nếu' cl-lib' là tốt hay không. Phần CL tôi không thích phải làm với các tính năng của Common-Lisp không phù hợp với việc thực hiện "thông dịch đơn giản", vì vậy chúng có thể dẫn đến chi phí hiệu năng không mong muốn. (cộng với một số tính năng có triển khai là thiếu sót) – Stefan

Trả lời

8

Trong khi sử dụng rất nhiều thư viện của bên thứ ba và viết một số mã eLisp của riêng tôi, tôi chưa bao giờ gặp phải tình huống khi sử dụng gói CL dẫn đến xung đột tên. Vì vậy, tôi muốn bị cám dỗ để nói rằng lập luận chống lại việc sử dụng CL không là gì ngoài chủ nghĩa thuần túy (theo nghĩa gốc của từ này, không có nghĩa là mặt tôn giáo của sự vật). Tuy nhiên, nếu bạn đang có kế hoạch hỗ trợ thời gian rất dài và bạn muốn có một bản sao lưu nào đó, đây là những gì tôi sẽ làm (nhưng tôi không tự làm điều đó, bởi vì sửa chữa mọi thứ một khi chúng bị hỏng, có vẻ như vậy.). là một chiến thuật tốt hơn). Đối với các chức năng trong gói CL mà bạn đang sử dụng, hãy tạo một tệp đặc biệt, trong đó bạn defalias tất cả chúng đều có tiền tố cl-. Vì vậy, ví dụ: thay vì có một số (position ...), bạn sẽ có (cl-position ...). Về mặt lý thuyết sẽ giúp bạn giải quyết vấn đề tương thích về phía trước. Tuy nhiên, các chức năng sẽ không bị xóa ngay lập tức, bạn sẽ nhận được cảnh báo trước khi chúng không được chấp nhận và sẽ có rất nhiều thời gian để cập nhật. Tùy thuộc vào bạn.

Macro vòng lặp trong Common Lisp là một tranh cãi tất cả bởi chính nó, nó không phải là một cấu trúc điển hình cho ngôn ngữ và đó là lý do tại sao, ví dụ, thư viện lặp tồn tại. Nó cũng yêu cầu bạn học "ngôn ngữ mini vòng lặp" để sử dụng nó tốt, đó là một loại ngôn ngữ cụ thể cho từng miền nhỏ và thực sự không yêu cầu loại cấu trúc này sử dụng một ngôn ngữ. NHƯNG, vòng lặp có mặt mạnh của nó. Các hàm xử lý danh sách như mapcar hoặc reduce sẽ phục vụ bạn tốt trong các trường hợp nhỏ hơn, như trường hợp bạn có trong ví dụ của mình, nhưng trong các trường hợp ít quan trọng, loop sẽ là cách tốt hơn và tiết kiệm hơn.

4

Bạn đã đọc các macro section của sổ tay chưa? Sử dụng các macro như ví dụ loop của bạn là hoàn toàn ổn.

Nhưng bạn sẽ sử dụng eval-when-compile xung quanh yêu cầu.

Thực tế, (eval-when-compile (require 'cl)) xuất hiện 66 lần ngay trong thư mục gốc lisp trong Emacs của tôi.

+0

Có, tôi đã đọc phần macro và đã xem xét một số mã macro trong các gói. Tôi vẫn đang chờ đợi khoảnh khắc 'aha' đó khi tôi tìm thấy một vấn đề mà _needs_ một giải pháp macro. –

+0

Không có vấn đề _needs_ một giải pháp macro. Khá một số có thể được đơn giản hóa với các macro. Đây là một ví dụ clojure hơn là elisp, nhưng tôi đã viết một macro để trích xuất tất cả các trường tĩnh của một lớp java để lộ nó trong không gian tên riêng của tôi. 'Giải pháp' không có macro sẽ là viết từng phần một ... – Cubic

4

Trừ khi bạn có kế hoạch tích hợp mã của mình trong Emacs, hãy sử dụng gói CL và đặt đoạn mã này vào .emacs để tắt cảnh báo.

(byte-compile-disable-warning 'cl-functions) 

Lưu ý: Bạn có thể tìm thấy một số lời khuyên về lập trình elisp trên nicferrier's blog.

Các vấn đề liên quan