2017-09-09 5 views
1

의가 잘못된 PLIST 다음 우리가 있다고 가정 해 봅시다조작 된 plist를 Emacs Lisp의 쌍 목록으로 변환하는 방법은 무엇입니까?

(defvar mplist '(
       :lang 'js 'html5 'css 'sass 
       :writing 'org 'markdown)) 
(defvar plist()) 

질문 예를 들어 plistmplist을 변환하는 방법입니다

'(
(:lang . 'js) 
(:lang . 'html5) 
(:lang . 'css) 
(:lang . 'sass) 
(:writing . 'org) 
(:writing . 'markdown)) 

내 사용 사례 use-package의 래퍼 매크로를 작성하는 것입니다 각 패키지는 각 모듈/레이어 (예 : spacemacs 또는 doom-emacs)를 기반으로 설치됩니다.

귀하의 도움에 감사드립니다!

답변

2

당신이 plist에 사용되는 예는 실제로 alist입니다.

'((:lang . 'js) 
    (:lang . 'html5) 
    (:lang . 'css) 
    (:lang . 'sass) 
    (:writing . 'org) 
    (:writing . 'markdown)) 

간단히 말하면 :

  • plist는 키 -> 값 쌍, 예를 들어 평면의 목록 '(:a 1 :b 2 :c 3)
  • alist은 car = the 키와 cdr = 값을 가진 목록 목록입니다. '((a . 1) (b . 2) (c . 3)).

만 쌍 목록을 반복하려는 경우, PHILS 대답 괜찮지 만, 데이터 세트가 작은 수없는 경우 (예를 들어,> 40 개 항목) 당신은, 즉 ":lang css가 회원 가입을 테스트해야 사용 설정 하시겠습니까? "라는 메시지가 표시되면 hash table을 사용해보십시오.

이유는 키가 고유하지 않기 때문입니다. (assq :lang alist)'(:lang . js)을 산출 할 것이다. 나머지는 첫 번째 경기에서 가려집니다. 이 alist으로 유일한 선택은 member입니다 :

(member '(:lang . css) alist) 

그러나 member는 O (N)입니다. 괜찮 으면 다시 phils가 대답합니다. 그렇지 않은 경우 (예 : 자주 조회하는 경우) 고유 한 기호 키 (예 : :lang-css과 같은 하나의 기호로 lang 및 css를 연결)를 입력을 다시 구성하고 assq (여전히 O (n)이지만 더 빠름)을 사용하십시오.) 대신 hash table을 사용하십시오. 해시 테이블에 대한

우리는 약간 PHILS '대답을 수정해야합니다
;; initialize the hash table if necessary 
(unless table 
    (setq table (make-hash-table :test #'equal))) 

(let (pkey) 
    (dolist (i mplist) 
    (if (keywordp i) 
     (setq pkey i) 
     ;; (puthash KEY VALUE HASH-TABLE) 
     (puthash (cons pkey i) t table)))) 

이 그럼 당신은 (gethash '(:lang . css) table)와 함께 O (1) 회원 확인을하거나 (maphash (lambda (pair _) [...]) table)와 쌍을 반복 할 수 있습니다.

희망 하시겠습니까?

1

keywordp 조건자를 찾고 계십니까?

(let (plist pkey) 
    (dolist (i mplist (nreverse plist)) 
    (if (keywordp i) 
     (setq pkey i) 
     (push (cons pkey i) plist)))) 
+0

tks u @phils, 그것은 나에게 의미가 있습니다! – babygau