2008-10-10 26 views
9

... giống như các gói.Có thể có bí danh cho tên hàm trong Lisp không?

Tôi sử dụng Emacs (có thể, nó có thể cung cấp một số loại giải pháp).

Ví dụ (defun the-very-very-long-but-good-name() ...) không hữu ích sau này trong mã. Nhưng tên như Fn-15 hoặc chữ viết tắt đầu tiên cũng không hữu ích. Có thể có một bí danh như cho các gói hoặc truy cập chuỗi tài liệu trong khi cố gắng gọi lại tên của hàm không?

Nói cách khác, có thể cho các chức năng kết hợp bằng cách nào đó tự viết tên và viết tắt tên không?

Trả lời

29

Bạn muốn defalias. (defalias 'newname 'oldname) sẽ giữ nguyên tài liệu và thậm chí hiển thị "newname là bí danh cho` oldname '"khi tài liệu của nó được yêu cầu.

+0

Hm, làm thế nào để sử dụng nó? Tôi không thể tìm thấy nó trong CL-USER và những người khác ... – avp

+1

Ctrl- H defalias cũng có được bạn wehre bạn cần phải đi –

+1

Ở trên nên được (defalias 'newname' oldname) – gknauth

0

Nếu vấn đề của bạn là bạn không thể nhớ tên chức năng rất dài, nhưng bạn nhớ PART của tên, đó là những gì "apropos" là cho. Trong Emacs của tôi, tôi có "C-h a" bị ràng buộc với "hyper-apropos". Bạn nhập một chuỗi con của biểu tượng bạn đang tìm kiếm, và nó liệt kê tất cả các kết quả phù hợp.

+0

Vấn đề của tôi là Tôi nghĩ cả tên và mô tả ngắn gọn. – avp

-1

Bạn có thể chỉ cần có một hàm chỉ gọi một hàm khác.

+0

Bạn sẽ mất tài liệu sau đó. – leppie

0

Tôi không biết Emacs, nhưng sẽ không (xác định shortname longnamefunctionblahblah) hoạt động?

+0

Vâng ... Đầu tiên, nó không phải là tự động. Thứ hai, tôi cần phải quan tâm đến nó. Thứ ba, nó là clunky ... :( – avp

0

bạn có thể sử dụng (defmacro ...) tới Alias ​​một hàm

+0

Tôi muốn lặp lại những gì tôi đã nói với leppie Nó chỉ là ... Tôi không biết ... Nó trông xấu xí. Ý tôi là, nó cần nỗ lực, nhưng cung cấp Chế độ viết tắt và chế độ mở rộng hippie thực hiện công việc tương tự dễ dàng ... Nhưng dù sao, cảm ơn cho đầu vào! – avp

3

Nếu đó là tất cả việc nhập liên tục sử dụng tên dài không mong muốn, thì có, emacs có thể trợ giúp. Hãy xem abbrev-mode. Ngoài ra ý tưởng tốt trong ngữ cảnh này là hippie-expand.

Nếu đó là câu hỏi dễ đọc, điều đó khó hơn. ?

3

từ "On Lisp" Đây là mã:

(defmacro alias (new-name prev-name) 
    `(defmacro ,new-name (&rest args) 
    `(,',prev-name ,@args))) 

; use: (alias df defun) 


(defun group (source n) 
    (if (zerop n) (error "zero length")) 
    (labels ((rec (source acc) 
     (let ((rest (nthcdr n source))) 
      (if (consp rest) 
      (rec rest (cons (subseq source 0 n) acc)) 
      (nreverse (cons source acc)))))) 
    (if source (rec source nil) nil))) 

(defmacro aliasx (&rest names) 
    `(alias 
    ,@(mapcar #'(lambda (pair) 
      `(alias ,@pair)) 
      (group names 2)))) 

; use: (aliasx df1 defun 
;    df2 defun 
;    df3 defun) 
+0

Th Anks, muyinliu, cho đầu vào, nhưng Allen đã trả lời câu hỏi. OTOH, giải pháp này đòi hỏi tôi phải nhớ những chi tiết không cần thiết, mà tôi muốn tránh. – avp

3

Bạn có thể sử dụng setf để gán chức năng các tế bào chức năng khác, ví dụ:

(defmacro alias (new-name prev-name) 
    `(setf (symbol-function ,new-name) (symbol-function ,prev-name))) 
+1

Điều này thậm chí không thực sự cần phải là một vĩ mô '(defun bí danh (tên mới prev-name) (setf (biểu tượng chức năng tên mới) (biểu tượng chức năng prev-name)))' hoạt động quá. – Inaimathi

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