2015-04-25 29 views
0

我在尋找最接近的等效(包括排版和語義)是什麼下面會怎麼做,如果在elisp的功能是「一流」:尋找方便的方式來定義詞法範圍的別名功能

(let ((f function-with-very-long-name)) 
    (progn 
      ... 
      (f ...) ;; evaluates to (function-with-very-long-name ...) 
      ... 
    ) 
) 

IOW,我正在尋找一種方便的方法來定義詞彙範圍的別名的功能。

我發現的最接近的方法是將別名符號(上面例子中的f)綁定到lambda,然後調用別名函數。我覺得這種方法印刷繁瑣。 (它否定了其他代碼可能從混疊獲得的任何印刷簡化。)

有更好的嗎?

回答

1

您可以使用funcall。例如,let下面經過21 a-function-with-an-extremely-long-name,雙打,並返回42:

(defun a-function-with-an-extremely-long-name (i) (* 2 i)) 

(let ((f 'a-function-with-an-extremely-long-name)) 
    (funcall f 21)) 
+0

這只是在詞法範圍,如果你採取額外的步驟來啓用詞法範圍一般在包含庫。默認情況下'f'會有動態範圍(這不是這裏顯示的代碼中的一個因素,但是因爲問題是明確的這是一個相關的問題。) – phils

+0

沒錯,但對我來說,這個問題似乎主要集中在使用較短的名稱來調用某些函數的方便性上,而不是用於範圍界定。我想我可以要求澄清。 –

2

我認爲最簡單的方法是使用cl-fletcl-labels(確切的名稱可能取決於哪的Emacs的版本,您正在使用,如果你喜歡,也可以使用cl-letf(symbol-function 'symbol),但我認爲這是不必要的模糊

+0

謝謝。您介意使用您提到的其中一個功能重寫我原始文章中的片段嗎? – kjo

+0

如果你不知道參數,你可以使用apply。像'(cl-flet((f(&rest args)(apply#'function-with-long-name args)))(f ...))' –