2016-06-30 7 views
1

バイトコンパイル時にレットバインド変数をemacsの値に置き換えるにはどうすればよいですか?たとえば、変数my-autoがあるとします。シンボル名を関数の値に置き換えることはできますか?バイトコンパイル時にレットバインド変数をシンボル値に置き換えます

私が手にバイトコンパイルした後
(defvar my-auto "somefile.el") 

(defun test() 
    (let ((generated-autoload-file my-auto)) 
    (prin1 generated-autoload-file))) 

(一部の記号が表示されませんが、あなたのアイデアを得る)

(defalias 'test #[nil "\302 !)\207" [my-auto generated-autoload-file prin1] 2]) 

しかし、私の代わりにmy-autoがあり

(defalias 'test #[nil "\301\302!)\207" [generated-autoload-file "somefile.el" prin1] 2]) 

を得ることができます"somefile.el"に置き換えられましたか?私は何らかのマクロを書くことができると思いますが、どうやってリファクタリングするのかは分かりません。

+0

[XY問題](http://meta.stackexchange.com/q/66377/231821)のように聞こえます。あなたは本当に何をしようとしていますか? – Drew

答えて

1

なぜグローバル変数を定義していますか?その変数の値が関数内にしかない場合は、test?あなたの本当の疑問を提起することを検討してください。あなたが本当にやろうとしていること。

とにかく、これはあなたが明らかに(あなたを思う)何をしたいん:

;;; foo.el --- tools -*- lexical-binding:t -*- 

(eval-and-compile 
    (let ((var "somefile.el")) 

    (defvar my-auto var) 

    (defun test() 
     (let ((generated-autoload-file var)) 
     (prin1 generated-autoload-file))))) 

は、最初の行はlexical-binding宣言を持つ、ファイルにそれを置くようにしてください。ファイルをバイトコンパイルします。バイトコンパイルされたファイルをロードします。次に、(symbol-function 'test)にチェックします。 OPに追加

#[0 "\300\301!\207" 
    ["somefile.el" prin1] 
    3 "\n\n(fn)"] 


、jenesaisquoi:あなたはこのようなものが表示されます。 ?これは、彼がやってしまったよ何明らかである:

別の方法としては、バイトコンパイルは、(マクロを必要とした後、次に

(defmacro expand-thing (place) 
    (or (and (symbolp place) (symbol-value place)) 
     ;; or do other checks 
     (eval place))) 

のように、バイトコンパイル拡大しますマクロを作成することです最初に!)

(defun test() 
    (let ((generated-autoload-file (expand-thing my-auto))) 
    (prin1 generated-autoload-file))) 

結果は期待どおりです。

関連する問題