2011-11-24 28 views
7

Cách thành ngữ để thực hiện các callback đa hình trong elisp là gì?Gọi lại đa hình trong Emacs/Elisp

Cụ thể, giả sử tôi có một chế độ nhỏ với một hàm thực hiện một phép toán nhất định và sau đó gọi một hàm khác. Hàm thứ hai này nên có một sự triển khai khác nhau tùy thuộc vào bộ đệm hiện tại có chứa một tệp C++ hay một tệp Java.

Hoặc, giả sử tôi muốn quá tải biến thay vì hàm. Ví dụ, tôi muốn gọi một số thực thi bên ngoài, và một trong các đối số được truyền cho nó khác nhau tùy thuộc vào bộ đệm hiện tại có tệp C++ hay tệp Java. Tôi muốn có thể xây dựng dòng lệnh trong một hàm chung và thay thế một đối số tùy thuộc vào nội dung của bộ đệm. Có phải là make-variable-buffer-local cách tiếp cận phù hợp không? Tại thời điểm nào (và theo cơ chế nào) là các biến cục bộ ban đầu được thiết lập?

Trả lời

5

Tôi đoán bạn có nhiều cách tiếp cận. Một số tùy chọn phù hợp với chức năng gọi lại của bạn là:

  1. Biến vùng đệm, như bạn đã đề cập.

    Cách bạn đặt nó thực sự phụ thuộc vào trường hợp sử dụng của bạn, nhưng bạn có thể triển khai các móc chế độ chính cụ thể hoặc after-change-major-mode-hook cho trường hợp chung.

    make-variable-buffer-local chắc chắn là phương pháp phù hợp nếu bạn muốn biến luôn là bộ đệm cục bộ.

  2. Alist ánh xạ các chế độ chính cho hàm liên quan của chúng.

    Định cấu hình này cho tất cả các chế độ bạn yêu cầu và sau đó thực hiện tìm kiếm cho chế độ chính hiện tại.

  3. Chỉ cần tạo tên hàm dựa trên tên chế độ chính, gọi nó nếu chức năng như vậy tồn tại.

Trong mọi trường hợp, rất có thể bạn sẽ sử dụng funcall hoặc apply để chạy hàm đã chọn.

Số 1 và 2 cũng sẽ liên quan đến phần thứ hai của câu hỏi của bạn.

+1

Tôi đã nhận thấy rằng 'make-variable-buffer-local' và' funcall' là phương pháp được thực hiện với 'indent-line-function', trong số những thứ khác. – Ray

1

Nếu bạn đang chỉnh sửa tệp C++ hoặc java, bộ đệm đó phải ở dạng tương ứng là c++-mode hoặc java-mode. Vì vậy, bạn có thể làm điều gì đó như sau:

(defun function1() 
    (interactive) 
    ;; put your generic code here 
    (cond ((string= major-mode "c++-mode") 
    (function2-cpp)) 
    ((string= major-mode "java-mode") 
    (function2-java)) 
    (t (message "I don't know what mode this is")))) 

(defun function2-cpp() 
    (message "this is cpp mode")) 

(defun function2-java() 
    (message "this is java mode"))