2016-07-12 10 views
0

Wenn ich eine Funktion oder ein Makro (ich mit dem Makro gehen würde) einige Keyword-Argumente nehmen, wie zum Beispiel:Trans Stichwort Parameter in Zuordnungsliste in Lisp

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

Wenn ich, dass alle Verwendungen sagen will von MWe wird von der Form:

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

Wie kann ich das einfach in eine alist-Transformation (oder vielleicht eine Hash-Tabelle, aber ich denke, dass nur 2-10 Felder für übertrieben wird) zum leichteren Auffinden von Schlüsselwortargumente mit assoc?

+0

Wenn Sie nur einfach wollen Retrieval, wie wäre es nur mit 'GETF' mit einem' & REST' Argument? – jkiiski

+4

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

+0

@jkiiski Ich habe nicht wirklich an' getf' gedacht. Wie Sie sehen, ist das meine akzeptierte Antwort. Auch nicht sicher, ob das eine andere Frage wäre ..., aber wie kann ich emacs/SLIME einige obligatorische Schlüsselargumente bei Autovervollständigung mitteilen? Ich denke, ich würde lieber mit der '& WHOLE' Alternative gehen. – ssice

Antwort

5

können Sie GETF verwenden, um Schlüssel/Wert-Elemente in einer Eigenschaftsliste zuzugreifen:

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

Um eine Eigenschaftsliste zu einer Assoc Liste Verwendung zum Beispiel zu konvertieren:

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

ich dies derzeit verwenden (nimmt die Liste immer noch ist):

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

Aber ich mag alle Verbesserungen oder bessere Möglichkeiten hören, den Fall zu behandeln. Ich kann eine Antwort akzeptieren, die sich mit der Situation auf eine völlig andere Weise befasst, wenn es sinnvoller ist.

+0

Dies setzt auch voraus, dass die Liste so umfangreich ist, dass Sie rekursiv werden können. Die Optimierung der Tail-Rekursion ist in Common Lisp nicht erforderlich. – BRFennPocock

+0

Wenn Sie * kurz * gemeint haben, habe ich das im OP angegeben. – ssice

+2

Es gibt hier keine Tail-Rekursion, das Ergebnis der Rekursion wird nicht sofort zurückgegeben, es wird als zweites Argument für 'cons' verwendet. – acelent