2016-06-29 126 views
1

如何在函數調用的結果中編譯elisp中的變量?是否需要在所有變量的主體中添加eval-when-compile或者是否可以確保相同的結果,而無需在所有變量定義中重寫?編譯elisp中的變量

用例正在編譯我的本地變量,這些變量在機器之間改變。例如,

(defun setup-defaults (loc) 
    (when (eq system-type 'windows-nt) 
    (cond 
    ((file-exists-p (expand-file-name loc "~")) 
     (file-name-as-directory (expand-file-name loc "~"))) 
    ((file-exists-p (expand-file-name loc "d:/")) 
     (file-name-as-directory (expand-file-name loc "d:/")))))) 

(defconst my/org (setup-defaults "org")) 

(defconst my/home 
    (eval-when-compile 
    (file-name-directory 
    (file-chase-links (or load-file-name "~/.emacs.d/init.el"))))) 

變量my/home將被編譯爲「〜/ .emacs.d /」,但my/org不會在字節編譯評估,除非我把它改寫爲

(defconst my/org (eval-when-compile (setup-defaults "org"))) 

所以,我是否需要爲我的所有變量做到這一點?

回答

1

啊,沒關係我看,這是宏什麼,只是用defmacro反而似乎解決了問題,

(defmacro setup-defaults (loc) 
    (when (eq system-type 'windows-nt) 
    (cond 
    ((file-exists-p (expand-file-name loc "~")) 
     (file-name-as-directory (expand-file-name loc "~"))) 
    ((file-exists-p (expand-file-name loc "d:/")) 
     (file-name-as-directory (expand-file-name loc "d:/"))))))