我没有找到标准的Elisp库函数来合并两个属性列表,如下所示:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
我可以用构建一些东西dolist
,但是在这样做之前,我想检查一下我是否在忽略某些库中的现有函数。
根据评论进行更新:
- 针对“多种方式”的评论:
我可以想象没有这样的功能,因为对于这个问题可能有不同的(并且可能是有效的)答案:当您重复使用具有不同值的属性名称时该怎么办?
是的,有一个关于如何合并重复项的问题,但是解决此问题的方法相对较少。我看到两种通用方法。首先,参数顺序可以解决重复项;例如,最右边的胜利,如Clojure的merge中。其次,合并可以委托给用户提供的回调函数,就像Ruby的merge一样。
无论如何,存在不同方式的事实并不妨碍许多其他语言标准库提供合并功能。关于排序,可以说相同的一般论点,但Elisp提供了排序功能。
- “你能详细说明吗?” /“请准确指定您要寻找的行为。”
一般来说,我对Elisp社区使用的内容持开放态度。如果您想要一个特定的示例,那么下面的示例将是可行的:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
并返回
'(k1 1 k2 2 k3 0))
这将是最右边的风格,例如Clojure的合并。
- “它们是清单,所以追加?”
不,append
不保留属性列表的语义。这个:
(append '(k1 1 k2 2) '(k2 0))
返回此:
(k1 1 k2 2 k2 0)
append是“ C源代码”中的内置函数。
(附加&rest序列)
连接所有参数,并将结果制成列表。结果是一个列表,其元素是所有参数的元素。每个参数可以是列表,向量或字符串。最后一个参数不被复制,仅用作新列表的尾部。
- “并且您的示例没有显示任何类似合并的内容-它甚至没有显示两个属性列表。”
是的,它确实; 它会逐步进行合并。它显示了使用Elisp记录在案的属性列表功能进行合并是多么麻烦:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
只需显示来自的结果输出值pl
:
(key-1 value-1 key-2 value-2)
重申一下,我能够编写一个函数来解决此问题,但是我首先想弄清楚这种函数是否存在于常用位置。
最后,如果您因不清楚该问题而对这个问题投了反对票,那么我现在要尽力澄清一下,所以请您重新考虑一下。这不是缺乏研究。“列表”上的Elisp文档无法回答问题。
append
:(let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
这是一样的(:a 3 :b 2 :a 1)
,只要你只使用的plist函数访问的plist。
plist-get
也plist-member
似乎并不在乎是否有多个相同的密钥。看起来他们在这方面的行为类似于alists :(plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
。同时,(plist-put '(:a "a" :b "b" :a "c") :a "d")
替换第一个:a
键的值,而不替换第二个键的值。
append
?