1 as Value o-6ren">
gpt4 book ai didi

hashmap - 将值添加到与 Lisp 中的 HashMap 表中的列表相同的键

转载 作者:太空宇宙 更新时间:2023-11-03 19:00:24 25 4
gpt4 key购买 nike

我想编写一个将键和值作为参数的函数。这样如果键已经存在于表中,那么它会将值添加到列表中的当前值。

例如,

(setf (gethash "key" table) 1) ==> 1 as Value of Key
(setf (gethash "key" table) 2) ==> (1 2) as Value of key

我有执行该操作的功能检查器

(defun checker(_key values) 
(if (gethash _key table)
(let
(setf lists (gethash _key table))
(push values lists)
(setf (gethash _key table) lists))
(setf (gethash _key table) values)))

出现以下错误:

Bad Binding (gethash _key table)

最佳答案

LET 具有以下语法:

(let <bindings> <body>)

... 其中绑定(bind)是 <var> 的列表或 (<var> <value>)元素。您在这里定义了一个名为 setf 的变量, 另一个名为 lists , 但第三个不是正确的绑定(bind)。

你的代码的固定版本是:

(defun checker (key value)
(let ((list (gethash key table)))
(cond
(list
(push value list)
(setf (gethash key table) list))
(t (setf (gethash key table) (list value))))))

但是,您可能会注意到其中有很多冗余代码。您只需要:

(defun table-push (key table value)
(push value (gethash key table)))

PUSH 在一个地方操作,并且 GETHASH 可用于修改条目。

如果需要对列表进行排序,可以使用 MERGE 并这样做:

(defun push-sorted-table (key table value &key (predicate #'<))
(setf (gethash key table)
(merge 'list
(list value)
(gethash key table)
predicate)))

这将破坏性地修改现有列表,但只要您仅通过表访问列表并且不保留指向代码其他部分的内部 cons 单元格的指针,您可能不介意。对于大型数据集,您可以存储平衡树而不是列表,以便新元素的插入渐进地更好。

关于hashmap - 将值添加到与 Lisp 中的 HashMap 表中的列表相同的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35386977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com