2012-02-02 16 views
5

Tôi tự hỏi ai có thể giải thích lý do thiết kế đằng sau các tính năng sau đây của autolisp/visual lisp? Đối với tôi, họ dường như bay khi đối mặt với thực hành phần mềm được chấp nhận ... tôi có thiếu cái gì đó không?Bất cứ ai có thể giải thích các quyết định thiết kế đằng sau Autolisp/visual lisp với tôi?

  • Tất cả các biến là toàn cầu theo mặc định (tức là trừ khi đặt sau một / trong các đối số chức năng)
  • dữ liệu đọc/ghi từ autocad đòi hỏi đặt công cụ vào một danh sách liên kết với rất nhiều con số kỳ diệu. 10 có nghĩa là tọa độ x/y, 90 nghĩa là độ dài của danh sách toạ độ, 63 có nghĩa là màu sắc, v.v. Ok bạn có thể lưu trữ chúng trong một số hằng số nhưng điều đó có nghĩa là nhiều hình cầu hơn, và tài liệu khuyến khích bạn sử dụng các số ma thuật trực tiếp.
  • Lisp là ngôn ngữ kiểu hàm, khuyến khích lập trình bằng cách đệ quy lặp lại, nhưng đệ quy đuôi là afaik không được tối ưu hóa trong hình ảnh lisp dẫn đến ngăn xếp khủng khiếp - trừ khi, tất nhiên bạn lặp lại. Nhưng cú pháp vòng lặp là rất hạn chế; ví dụ. bạn không thể thoát ra khỏi hoặc trả về một giá trị từ một vòng lặp trừ khi bạn đặt một số loại cờ trong điều kiện chấm dứt. Kết quả, mã xấu.
  • Nói chung, bạn buộc phải khai báo các biến trên toàn bộ địa điểm bay khi đối mặt với lập trình hàm - vậy tại sao lại sử dụng ngôn ngữ chức năng (-ish)?

Trả lời

6

Lisp không phải là một ngôn ngữ, đó là group of sometimes surprisingly different languages. SchemeClojure là các thành viên chức năng của gia đình. Elisp không đặc biệt chức năng và không khuyến khích lập trình hàm hoặc đệ quy. trên thực tế, bao gồm very flexible object system, một số extremely flexible iteration DSL và không đảm bảo các cuộc gọi đuôi được tối ưu hóa (các phương ngữ của Đề án làm, nhưng không phải là nói chung về Lisps; đó là điểm yếu trong suy nghĩ của "Lisp" như một ngôn ngữ duy nhất).

Bây giờ chúng tôi đã xóa, AutoLisp là một triển khai từ năm 1986 dựa trên phiên bản đầu tiên của XLISP (sớm nhất được xuất bản trong 1983).

Lý do nó có thể bay khi đối mặt với thực tiễn lập trình hiện được chấp nhận là có trước thực tiễn lập trình được chấp nhận hiện tại. Một điều cần ghi nhớ là các netbook rẻ nhất hiện nay là several hundred times mạnh hơn những gì một lập trình viên có thể mong đợi để có quyền truy cập trở lại vào giữa những năm 80. Có nghĩa là ngay cả khi một tính năng nhất định được chấp nhận là tuyệt vời, các ràng buộc về CPU hoặc bộ nhớ có thể đã ngăn cản việc triển khai thực hiện nó bằng một ngôn ngữ thương mại.

Tôi chưa bao giờ được lập trình trong Autolisp/Visual Lisp cụ thể, và những thứ bạn trích dẫn âm thanh gây phiền nhiễu đẫm máu, nhưng nó có thể có một số lợi thế hiệu suất/bộ nhớ đã hợp lý vào thời điểm đó.

+0

"nó có thể có một số" ... nah ", họ" chỉ "lấy" như nó đã được, mà không có sự cho phép của tác giả bị cáo buộc, và không bao giờ bận tâm để cải thiện nó vì sợ không tương thích ngược. –

+0

@Will - Man. Tôi đoán điều đó giải thích nó sau đó; bản gốc XLISP là một dự án đồ chơi cho nhà văn, không phải thứ gì đó mà anh ấy đang quảng cáo nghiêm túc. – Inaimathi

+0

Những ngày 1983-1986 không có trước thực hành tuyệt vời ở Lisp, xin lỗi. Vào năm 1986, Lisp thường đã có mặt ở đó và gần như cùng một thứ đã được chuẩn hóa vào năm 1994. Nó không phải là trường hợp có tiền lệ, mà là một trường hợp không có manh mối. AutoLisp tồi tệ hơn một số Lisps trong những năm 1960. – Kaz

3

Nếu tôi nhớ không lầm thì AutoLISP là một ngã ba từ phiên bản đầu tiên của XLisp (một số nguồn tin khẳng định đó là XLisp 1.0 (xem this C2 article).

XLisp 1.0 là một lisp 1 cell (các chức năng và các biến chia sẻ cùng một không gian tên) với một số kỳ quặc khá lạ với nó

2

Bạn có thể thêm dynamic scoping vào danh sách kết hợp btw và nếu bạn không biết điều gì là tự cân nhắc.Nhưng thực ra không phải tất cả bốn điểm của bạn đều lớn đến mức thỏa thuận IMO:

  • "Không khai báo các vars được tạo tự động là toàn cầu". Giống như trong CL là nó không (thông qua setq)? Một lựa chọn khác là thất bại, và đó không phải là một lựa chọn hấp dẫn đối với ngôn ngữ được cho là được sử dụng để viết kịch bản nhanh chóng.

  • "số ma thuật" là mã DXF, mà bạn đúng là bất tiện lớn vì chúng có xu hướng thay đổi với các phiên bản ACAD thay đổi đôi khi (may mắn thay, hiếm khi). Đó chỉ là nó như thế nào. Sửa chữa nó sẽ đòi hỏi một đại tu lớn, giới thiệu một số "lược đồ" và những gì không, và tại sao "họ" bận tâm? AutoLISP đã được để lại trong trạng thái của nó vào khoảng năm 1992, và không bao giờ bị làm phiền kể từ đó. Bản thân Visual LISP hoàn toàn khác và có nhiều khả năng hơn, nhưng tất cả đều bị khóa cho người dùng thông thường và chỉ được thực hiện để phục vụ một mục tiêu - để mô phỏng AutoLISP cũ càng trung thực càng tốt (trừ khi nó bổ sung các tính năng liên quan đến VBA mới) vào nửa cuối những năm 1990, và cũng đã bị khóa).

  • (while (not done) ...) không phải là rằng xấu xí. Không có bảo đảm tối ưu đuôi, có, cũng giống như không có một trong CL và Haskell (mà cuối cùng thực sự stumbles tôi - không có cách nào đảm bảo để mã hóa một vòng lặp trong Haskell trong không gian liên tục mà không có monads - làm thế nào về điều đó?).

  • "bạn buộc phải tuyên bố vars trên khắp nơi" ở đây tôi không theo bạn. Bạn khai báo chúng là bạn phải khai báo chúng - trong danh sách đối số nội bộ của hàm. Bạn có ý nghĩa gì về những địa điểm khác? Tôi không biết gì cả.

Trong thực tế, trở ngại lớn nhất của AutoLISP là độ phân giải tên động IMO, nhưng đó là cách trong Xlisp, chỉ vài năm sau khi sơ đồ xuất hiện lần đầu tiên. Sau đó, nó cũng là kho lưu trữ dữ liệu không thay đổi của nó, nhưng điều đó được thực hiện chủ yếu để đơn giản hóa việc triển khai và ngăn chặn quá nhiều sự nhầm lẫn và do đó các câu hỏi, từ cơ sở người dùng, tôi đoán vậy.

+1

Trên thực tế, Haskell hỗ trợ các cuộc gọi đuôi (miễn là bạn sử dụng ứng dụng chức năng nghiêm ngặt để đặt bộ tích lũy). Tôi đã nhầm lẫn về điểm này bản thân mình và [câu trả lời này] (http://stackoverflow.com/a/4286283/190887) xóa nó lên. – Inaimathi