Elisp

2011-01-10 4 views
6

에 DSL을 만드는 방법 나는 이런 식으로 뭔가를 찾고 Elisp에서 DSL 만들려면 : Elisp 글로벌 네임 스페이스를 갖고 있기 때문에, 그러나Elisp

(install 
;; do install 
) 

(uninstall 
;; do uninstall 
) 

을, 이것은 좋은 생각이 아니다. 그리고 이런 식으로 접두어를 붙이는 것은 너무 못생긴 일입니다.

(commands 
(install 
    ;; do install 
) 

(uninstall 
    ;; do uninstall 
) 

;; ... 
) 

을하지만 내가 원하는하지 않기 때문에 글로벌 네임 스페이스에제거를 설치

(package-install 
;; do install 
) 

(package-uninstall 
;; do uninstall 
) 

그래서 나는이 같은 전화를 모든 명령은 명령에 싸여 할 수있는 타협으로 생각 , 나는 어떻게 든 명령 매크로에서 다음과 같이 접두사 이름과 같은 명령의 모든 항목을 바꿔야합니다.

이렇게 해킹 된 것처럼 보입니다. 게다가 중첩 된 명령어가 있으면 작동하지 않습니다.

좋은 해결책이 있습니까 아니면 갈 길을 해킹하고 있습니까?

감사합니다!

+0

YASnipper는 함수에'yas /'접두어가 붙어 있으므로'yas/expand'를 얻습니다. 나는 그것이 전혀 추한 것이라고 생각하지 않았다. 내가 작성한 tfs 통합을위한 컨벤션을 채택했기 때문에'tfs/checkout','tfs/add' 등이 있습니다. 이것은 공식적인 지원이없는 경우 이름 지정을하는 것이 값 싸고 쉬운 방법입니다. – Cheeso

+0

단지 문체 주석 :'command' 매크로 정의에서와 같이'setcar' /'setcdr'를 사용하지 않을 것입니다. 새로운'cons '(코드를 더 깨끗하게 만들 수도있다)를 만든다. 매크로 익스팬더가 원본 코드 트리를 임의적으로 파괴적인 방식으로 수정하는 경우 어떤 영향을 미칠지 모릅니다. – Dirk

답변

8

로컬로 install을 정의하는 것은 어떻습니까? 이렇게하면 표준 기능이 숨겨지지는 않겠지 만 실제로 그렇게 보이지는 않습니다.

(defmacro commands (&rest body) 
    `(flet ((install (&rest args) (apply 'package-install args)) 
      (uninstall (&rest args) (apply 'package-uninstall args))) 
    ,@body)) 

물론 flet 개의 목록을 자동으로 생성하고 싶을 것입니다. (feature-symbols 'package)을 사용하여 어딘가에 패키지 요소 목록이 필요합니다.

+1

이것이 내가 원하는 것입니다! 고마워요! – rejeep

관련 문제