2016-07-12 65 views
0

如果我有一個函數或宏(我將與宏去)採取了一些關鍵參數,如:變換關鍵字參數到關聯列表中的Lisp

(defmacro mwe (&whole args &key name description &allow-other-keys) 
    (pushnew (list-to-alist args) *some-var*)) 

如果我想說的是,所有的用法兆瓦的將是這樣的形式:

(mwe :name name :prop1 value1 :prop2 value2) 

我如何改變,很容易成ALIST(或者一個哈希表,但我認爲這將是矯枉過正只是2-10場)爲更容易檢索關鍵字參數,使用assoc?我目前正在使用這個

+0

如果你只是想簡單的檢索,如何使用'GETF'和'&REST'參數? – jkiiski

+4

['alexandria:plist-alist'](https://common-lisp.net/project/alexandria/draft/alexandria.html) – coredump

+0

@jkiiski我並沒有真正想到'getf''。如你所見,這是我接受的答案。此外,不知道這是否會是一個不同的問題......但我怎麼能讓emacs/SLIME知道一些關於自動完成的強制性關鍵參數呢?我想我寧願選擇'&WHOLE'。 – ssice

回答

5

您可以使用GETF訪問鍵/值元素的屬性列表:

CL-USER 19 > (getf '(:name name :prop1 value1 :prop2 value2) 
        :prop2) 
VALUE2 

要將屬性列表轉換爲assoc命令列表中使用,例如:

CL-USER 18 > (loop for (parameter value) 
        on '(:name name :prop1 value1 :prop2 value2) 
        by #'cddr 
        collect (cons parameter value)) 
((:NAME . NAME) (:PROP1 . VALUE1) (:PROP2 . VALUE2)) 
0

(假定列表始終是偶數):

(defun list-to-alist (plist) 
    (when plist 
    (destructuring-bind (a b . rest) plist 
     (cons (cons a b) 
      (list-to-alist rest))))) 

但是我想聽到任何改進或更好的方法來處理這種情況。如果更有意義,我可以用完全不同的方式接受處理&whole/&key情況的答案。

+0

這也假定這個列表足夠排序,你可以遞歸。 Common Lisp中不需要尾遞歸優化。 – BRFennPocock

+0

如果您的意思是* short *,我確實在OP中聲明。 – ssice

+2

無論如何,這裏沒有尾遞歸,遞歸的結果不會立即返回,它被用作'cons'的第二個參數。 – acelent