2016-07-12 7 views
0

に連想リストにキーワードパラメータを変換MWEの形のものであろう:Lispの

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

の容易な検索のために、私は連想リストにその簡単に変換(または多分ハッシュ・テーブルが、私はそれがちょうど2-10フィールドの行き過ぎになると思う)ことができますどのようにキーワード引数は、assocを使用していますか?

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

しかし、私は、任意の改善やケースを処理するためのより良い方法を聞いてみたい:私は現在、これを使用しています

+0

'GETF'を'&REST'引数で使用する方法はありますか? – jkiiski

+4

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

+0

@jkiiski私は' getf'を本当に考えていませんでした。あなたが見ているように、それは私の受け入れられた答えです。また、これが別の質問であるかどうかは分かりませんが、私はemacs/SLIMEにautocompletionに関するいくつかの必須の主要な引数を知らせることができますか?私はむしろ '&WHOLE'の代わりに行くと思います。 – ssice

答えて

5

あなたは、プロパティリストにキー/値の要素にアクセスするGETFを使用することができます。

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

例えば連想リストの使用にプロパティリストを変換するには:あなただけの簡単な場合

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

は、(リストは常に偶数であると想定します)。私は&whole/&keyの状況を扱う答えを、全く違う形で受け入れることができます。

+0

これはまた、リストが再分類できるほどソートされていることを前提としています。 Common Lispでは、テール再帰の最適化は不要です。 – BRFennPocock

+0

あなたが* short *を意味するなら、私はOPでそれを述べました。 – ssice

+2

ここにはテール再帰はありません。再帰の結果はすぐには返されません。それは 'cons'の第2引数として使われます。 – acelent