2016-07-23 4 views
0

매크로에서 생성 된 함수에 심볼 이름을 어떻게 대체 할 수 있습니까? 나는 여기서 명백한 것을 놓치고 있다고 생각한다. 예를 들어, 나는매크로의 대체 심볼 이름

(defun fn (var) (symbol-value var)) 
같은 서명 기능은 반환
(cl-defmacro mac (pkg) 
    (let (
     ;; Define some variables 
     (sym (intern (concat pkg "-file"))) 
     (sym-def "default-file.el") 
     (sym-doc (concat "A custom var from `" pkg "'.")) 
     ;; Define some functions 
     (symfn (intern (concat pkg "-fn"))) 
     (symfn-doc (concat "A function for `" pkg "'."))) 

    `(list 
     (defcustom ,sym ,sym-def ,sym-doc 
     :group (quote ,(make-symbol pkg)) 
     :type '(choice (const :tag "None" nil) 
         file)) 
     (defun ,symfn() 
     ,symfn-doc 
     (interactive) 
     (fn ,sym))))) 

다른 기능 (fn)에 대한 호출을 만드는

다음과 유사한 몇 가지 변수와 함수를 정의하는 매크로를 만들려고 노력하고 있어요

그래서 (fn 'some-var)과 같은 전화가 올 것으로 예상됩니다. 그리고, 나는 (quote ,sym), symbol-name, 그리고 다른 사람과 같은 일을 시도

pack-file ; works: "default-file.el" 
(pack-fn) ; error: not a symbol 

,

(mac "pack") 

같은 매크로를 사용하여 다음과 같은 작업을 할 수 있도록하려는 ...하지만 할 수 없습니다 그것을 올바르게 얻는 것처럼 보입니다.

+1

은 매크로의 확장은 아마도 한 가지를 들어,'progn' 형태이어야한다. 아마도'fn'에 대한 호출이'(fn ', sym)'가되기를 원할 것입니다. (필자에게는 elisp를 사용하는 것이 없지만 나머지는 괜찮아 보인다.) – tfb

+0

당신이 질문에서 언급 했으니까요, 나는 그것이 손가락 문제라고 생각합니다 ... – tfb

답변

1

fn에 대한 전화를 (fn ',sym) (이 질문에 답해 보았습니다.하지만 어쨌든 잘못 생각한 것 같습니다).

(list ...) 대신 (progn ...) 매크로를 확장해야 할 수도 있습니다.

(이 원래 코멘트했다 : 난 그냥 그렇게 대답 거기에 여기 놓겠 어.)