2009-04-02 40 views
5

Tôi vừa mới bắt đầu học Common Lisp - và nhanh chóng yêu thích nó - và tôi vừa chuyển sang hệ thống kiểu. Tôi dường như đang phát triển một sự yêu thích đặc biệt cho lập trình ứng dụng.Lập trình ứng dụng và các loại lisp phổ biến

Như tôi đã hiểu, trong chuỗi và danh sách CL là cả hai chuỗi, nhưng dường như không có bất kỳ hàm chuẩn nào để ánh xạ qua một chuỗi, chỉ các danh sách. Tôi có thể thấy lý do tại sao họ sẽ được cung cấp cho danh sách, những gì với họ là datatype cơ bản và tất cả, nhưng tại sao nó không được thiết kế để làm việc với các trình tự? Vì chúng là loại tổng quát hơn, có vẻ hữu ích hơn khi nhắm mục tiêu các hàm ứng dụng vào chúng thay vì danh sách. Hay tôi hoàn toàn hiểu lầm cách nó hoạt động?

Edit:

Những gì tôi đã cảm thấy đặc biệt là nhầm lẫn về là cách mà chuỗi - trừu tượng - và danh sách - một thực hiện - dường như rối tung cả lên ở CL. Sự đồng thuận dường như là vì lý do lịch sử; lisp đã được khoảng thời gian quá lâu mà bạn có thể khá nhiều bản đồ ra sự phát triển của thực hành kỹ thuật phần mềm thông qua các chức năng và các macro của nó; chức năng nào áp dụng cho các chuỗi và danh sách có vẻ tùy ý ngay từ cái nhìn đầu tiên vì CL có một hỗn hợp các hàm trừu tượng trước chuỗi chỉ hoạt động trên các danh sách và các hàm hoạt động tương tự theo cách tổng quát hơn trên các chuỗi. Là một người chỉ học CL vào lúc này, tôi nghĩ sẽ hữu ích nếu các tác giả giới thiệu các chuỗi đầu tiên như là sự trừu tượng rõ ràng hơn, và sau đó mua trong danh sách như là sự thực hiện cơ bản nhất của sự trừu tượng đó. Danh sách vẫn sẽ cần thiết như cú pháp của khóa học, nhưng do thời gian nó là cần thiết để nhà nước này rõ ràng nhiều độc giả đã có thể làm việc này ra một mình, mà sẽ được khá một bản ngã tăng khi bắt đầu.

Trả lời

1

Vâng, bạn nói chung là chính xác. Hầu hết các chức năng làm thực sự tập trung vào danh sách (mapcar, find, count, remove, append vv) Đối với một vài trong số những có chức năng tương đương cho chuỗi (concatenate, someevery đến tâm), và một số người, trong đó danh sách tương đương đã lỗi thời (ví dụ: nth cho các danh sách chỉ so với elt cho tất cả các chuỗi). Một số hàm chỉ đơn giản là làm việc trên các trình tự (ví dụ: length).

CL là một chút lộn xộn. Đó là một ngôn ngữ lớn, như trong lớn. Hơn 700 chức năng, AFAIK. Và nó cũ rồi. Một số chức năng này không được chấp thuận theo quy ước và một số khác hiếm khi được sử dụng.

Có, sẽ hữu ích hơn khi có các hàm ánh xạ là các phương thức, được áp dụng như dự định trên tất cả các trình tự. CL chỉ đơn giản là không được xây dựng theo cách đó. Nếu nó được xây dựng một lần nữa ngày hôm nay, tôi chắc chắn điều này sẽ được xem xét, và nó sẽ trông rất khác nhau.

Điều đó nói rằng, bạn không được để lại hoàn toàn trong cái lạnh. Macro loop hoạt động trên các trình tự, cũng như iterate (một macro lặp riêng biệt, mà tôi xảy ra để thích hơn). Điều này sẽ giúp bạn đi xa. Đối với hầu hết các mục đích thực tế bạn sẽ sử dụng danh sách, và điều này sẽ không nhiều hơn một vấn đề thực dụng. Nếu bạn tình cờ thiếu một chức năng lập bản đồ cho các vectơ (hoặc các chuỗi chung), thì ai sẽ ngăn bạn viết nó?

+5

COUNT, TÌM, XÓA hoạt động tốt hơn các chuỗi. Kiểm tra từ điển trình tự của tiêu chuẩn ANSI CL. –

+0

Rất tốt, bạn biết gì? Nói một chút trước tôi ở đó. Cảm ơn! –

+0

Bạn có thể đã nói trước chính mình, nhưng bạn đã cho tôi câu trả lời tôi cần. Những gì tôi đã nhầm lẫn là lý do tại sao sự trừu tượng giữa các trình tự như trường hợp chung và danh sách như việc thực hiện dường như rất lộn xộn trong CL; bây giờ tôi biết đó là vì lý do lịch sử. Cảm ơn! –

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