2011-01-03 25 views
6

Tôi khá hấp dẫn bởi Gambit Scheme, đặc biệt bởi nhiều nền tảng được hỗ trợ và khả năng đặt mã C ngay trong nguồn Đề án của bạn khi cần. Điều đó nói rằng, nó là một Đề án, trong đó có ít "pin bao gồm" so với Common Lisp. Một số người thích viết mã nhiều thứ từ đầu, (a.k.a. yak-cạo mạnh mẽ) nhưng không phải tôi!So sánh Common Lisp với Gambit w.r.t truy cập thư viện và hệ thống đối tượng của họ

này mang lại cho tôi hai câu hỏi của tôi, hướng tới những người đã sử dụng cả hai Gambit và một số hương vị của Common Lisp:

1) Những hiệu quả có tiếp cận tốt hơn với các thư viện? Lược đồ có ít thư viện hơn Common Lisp. Tuy nhiên, Gambit Scheme có quyền truy cập mượt mà hơn vào thư viện mã C/C++ &, vượt xa các thư viện của Common Lisp. Theo ý kiến ​​của bạn, sự mượt mà của FFI của Gambit có vượt trội so với việc thiếu các thư viện gốc không?

2) Hệ thống đối tượng của Đề án (ví dụ: TinyCLOS, Meroon) so với CLOS của Common Lisp như thế nào? Nếu bạn thấy họ thiếu, bạn đã bỏ lỡ những tính năng nào nhất? Cuối cùng, làm thế nào quan trọng là một hệ thống đối tượng trong Lisp/Scheme ở nơi đầu tiên? Tôi đã nghe nói về toàn bộ các công ty dựa trên lisp (ví dụ: Phần mềm ITA) cho phép hoàn toàn CLOS. Các đối tượng có thực sự là tùy chọn trong Lisp/Scheme không? Tôi lo sợ rằng nếu Gambit không có hệ thống đối tượng tốt, tôi có thể bỏ lỡ chúng (nền tảng lập trình của tôi hoàn toàn là hướng đối tượng).

Cảm ơn vì đã giúp một tham vọng chuyển đổi từ C++/Python,

- Matt

PS: Có người với hơn 1500 đại diện, bạn có thể xin vui lòng tạo ra một "nước cờ" tag? :) Cảm ơn Jonas!

Trả lời

2

1) Tôi chưa sử dụng Gambit Scheme, vì vậy tôi thực sự không thể nói mức độ tích hợp C/C++ trơn tru như thế nào. Nhưng tất cả Common Lisps tôi đã sử dụng có đầy đủ chức năng C FFI: s. Vì vậy, sự sẵn có của các thư viện C là như nhau. Phải mất một số công việc để tích hợp, nhưng tôi cho rằng đây là trường hợp với Gambit Scheme. Sau khi tất cả, Lisp và C là ngôn ngữ khác nhau ..? Nhưng có thể bạn có trải nghiệm khác, tôi muốn tìm hiểu thêm trong trường hợp đó.

Bạn có thể quan tâm đến Quicklisp, một dự án Common Lisp mới thực sự tốt - nó giúp bạn dễ dàng cài đặt nhiều thư viện chất lượng.

2) C++ và Python được thiết kế để sử dụng OOP và lớp học làm phương tiện đóng gói và cấu trúc dữ liệu điển hình. CLOS không có tham vọng này chút nào. Thay vào đó, nó cung cấp các hàm chung có thể được chuyên biệt hóa cho một số loại đối số nhất định - không nhất thiết phải là các lớp. Về cơ bản điều này cho phép OOP, nhưng trong Common Lisp, OOP là một tính năng thuận tiện hơn là một cái gì đó cơ bản để hoàn thành công việc.

Tôi nghĩ rằng CLOS được thiết kế tốt và linh hoạt hơn nhiều so với mô hình đối tượng C++ - TinyCLOS không khác biệt ở khía cạnh đó.

+0

Vấn đề với chỉ đơn thuần là có một FFI là nó buộc bạn phải quấn mọi chức năng mà bạn chạm từ Lisp. Ngay cả với sự giúp đỡ của SWIG, điều này có thể nhanh chóng trở thành một việc vặt. Gambit có lợi thế là cho phép bạn chèn một khối mã C (và C++!) Ngay vào nguồn lược đồ của bạn. Nói cách khác, bạn chỉ phải viết mã giao diện cho bất kỳ dữ liệu nào bạn cần truyền vào và ra khỏi khối đó, không phải cho mọi chức năng trong khối đó. Điều này là rất tốt vì bạn thường cần sử dụng một loạt các hàm C/C++ cùng nhau để tạo ra kết quả mà bạn quan tâm và chỉ quan tâm đến việc gói kết quả. – SuperElectric

+0

@SuperElectric: Nhưng bạn luôn có thể đặt khối C (hoặc C++) đó vào một hàm C, và sau đó truy cập chức năng này thông qua FFI. –

+0

@ MiklósHomolya Đúng, nhưng đó là một câu hỏi tiện lợi. Từ kinh nghiệm của tôi với Lush, tôi có thể nói rằng có thể chỉ cần đặt một số mã C ở giữa một cơ thể fucntion lisp và có nó có thể truy cập bất kỳ biến lisp trong phạm vi là một chiến thắng năng suất lớn. – SuperElectric

5

Chắc chắn lược đồ có ít thư viện hơn trong tiêu chuẩn đã xác định, nhưng mọi triển khai Đề án được đưa ra thường dựa trên tiêu chuẩn đó để bao gồm nhiều loại chức năng hơn. Ví dụ:

Gambit, sử dụng hệ thống gói Snow sẽ cung cấp cho bạn quyền truy cập vào một số thư viện hỗ trợ.

Đề án khác có giá vé tốt hơn, có quyền truy cập vào nhiều thư viện hỗ trợ hơn (hoặc tốt hơn). Cả hai Racket (với PlaneT) và gà (với eggs) ngay lập tức đến tâm trí.

Điều đó nói rằng, Lisp thường khá phong phú và một số lượng lớn thư viện thú vị và hữu ích là một cài đặt asdf đơn giản.

Đối với hệ thống đối tượng Đề án, cá nhân tôi có xu hướng ưu tiên Chương trình Gà và đã ưu tiên coops. Điều đó nói rằng, hoàn toàn không có gì sai với TinyCLOS. Hoặc là sẽ phục vụ tốt và không thực sự tìm thấy bất cứ điều gì để được thiếu. Mặc dù câu lệnh cuối cùng có thể có nhiều hơn để làm với thực tế là tôi không có xu hướng dựa vào rất nhiều đối tượng định hướng-isms khi viết Đề án. Cả hai hệ thống trong kinh nghiệm của tôi có xu hướng bề mặt khi tôi muốn viết "giao thức" và sau đó có một cách chuyên về giao thức, nếu điều đó có ý nghĩa.

+0

"Cả hai hệ thống trong kinh nghiệm của tôi có xu hướng bề mặt khi tôi muốn viết" giao thức "và sau đó có một cách chuyên về giao thức, nếu điều đó có ý nghĩa." ... ermmm không thực sự. Bạn đang đề cập đến hệ thống nào và bạn có thể xác định 'giao thức' không? – SuperElectric

+0

các hệ thống là hệ thống hướng đối tượng tôi đã đề cập. Giao thức là một phương thức chung, và các đối tượng TinyCLOS (hoặc coops) sau đó cung cấp các đặc tả kiểu tham số cho phương thức, để một giao diện tương tự có thể được sử dụng cho nhiều kiểu. Tốt nhất tương tự tôi có thể nghĩ là một phương pháp mẫu C++, nơi bạn có thể chuyên (cung cấp hành vi tùy chỉnh) dựa trên kiểu đầu vào. – Shaun

+0

Có một chương trong cuốn sách Common Common Lisp thực hiện một công việc tốt hơn là tôi giải thích. Bạn có thể đọc tại đây: http://www.gigamonkeys.com/book/object-reorientation-generic-functions.html – Shaun

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