2013-10-02 22 views
6

Tôi đang sử dụng phổ biến-lisp cho các thử nghiệm đồ họa thời gian thực của tôi và cho đến nay nó đã được tuyệt vời. Yêu cầu của tôi về tốc độ và khả năng tương thích dễ dàng với cffi có nghĩa là tôi đang sử dụng mảng 'đã nhập'. Một khu vực của mã thực sự cảm thấy xấu xí là các phiên bản chung của các hàm toán học ma trận và vectơ của tôi. Như Clos không thể chuyên về chiều dài của một mảng Tôi đang làm một cái gì đó như thế này:Chuyên về Vectơ và Ma trận

(defun v+ (vec-a vec-b) 
    (%v+ vec-a vec-b (length a) (length b))) 

(defmethod %v+ (va vb (la (eql 3)) (lb (eql 3))) 
    ***CODE HERE***) 

này hoạt động nhưng không cảm thấy đúng. Tôi đã thấy phần mở rộng để triển khai CL khác nhau và nghe về lời hứa của MOP.

Tôi đã tránh xa điều này vì tôi sợ nó sẽ phá vỡ chức năng với một số triển khai CL nhưng tôi đã thấy gần đây hơn Closer-to-Mop project.

Câu hỏi cốt lõi: MOP có cung cấp phương pháp hiệu quả hơn để chuyên về chiều dài không? Có khu vực/kỹ thuật nào tôi nên tập trung vào không?

+0

lý do tại sao bạn sử dụng CLOS khi GF không gửi đi ... –

+0

xin lỗi v + nên đã được defun thay vì defmethod. Khác hơn là tôi không nghĩ rằng tôi hiểu câu hỏi của bạn. % v + là chung để xử lý các độ dài khác nhau của vector như tôi đã nhận xét với Menschenkindlein đề xuất đến từ một câu hỏi SO http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length . Lý do duy nhất của tôi để hỏi điều này là để tìm hiểu xem MOP có cho phép chuyên về một mảng có độ dài nhất định hay không. có lẽ tôi nên loại bỏ phần nền của câu hỏi vì nó không phải là điểm, chỉ là một ví dụ về một trường hợp sử dụng. – Baggers

+2

Nó rất ít ý nghĩa khi sử dụng CLOS và MOP để viết các hàm chỉ cho ba loại vectơ. Vì bạn đề cập đến 'tốc độ', tôi sẽ sử dụng các hàm có thể được gạch chân. Nếu tôi cần một số cách ngắn để viết công cụ này, tôi sẽ viết một macro cho ... –

Trả lời

0

Mã của bạn phù hợp với tôi và những gì bạn đang sử dụng là nhập gắn thẻ.

(defmethod v+ (vec-a vec-b) 
    (labels ((find-tag (vec) 
       (if (> (length vec) 3) 
        :more-than-3 
        :less-than-4))) 
     (%v+ vec-a vec-b (find-tag a) (find-tag b))) 

(defmethod %v+ (va vb (va-tag (eql :less-than-4)) (vb-tag (eql :less-than-4))) 
    ***CODE HERE***) 
+0

Chúc mừng, yeah nó hoạt động tốt và trên thực tế nó là phương pháp từ một trong những câu hỏi cũ của tôi ở đây http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length. Tuy nhiên câu hỏi là nhiều hơn về cách MOP tăng khả năng liên quan đến các phương pháp chuyên – Baggers

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