List is used as map, and listmap is used
Use lookup to find the key
> (set 'l '(("a" "b") ("c" "d")))(("a" "b") ("c" "d"))> (lookup "a" l)"b"
Lookup only returns value
Search for keys using assoc
> (assoc "a" l)("a" "b")
Returns
Delete key/value
Use pop-assoc
> (pop-assoc "a" l)("a" "b")> l(("c" "d"))
Modify value based on key
Setf and assoc can be used together with I. Note that the last parameter of g is the sublist used for replacement and cannot be evaluated.
> (setf (assoc "a" l) '("a" "h"))("a" "h")> l(("a" "h") ("c" "d"))
Note that there is a potential problem in this way, that is, if the assoc does not find data, nil is returned, and setf tries to assign values to nil, and an error is returned.
In this case, you have to check it first and then decide whether to use setf or push. For example, my code:
(begin (set 'sl (lookup cluster-name cluster-host-list)) (if sl ;; update key/value if found (begin(push host-name sl -1)(setf (assoc cluster-name cluster-host-list) (list cluster-name sl))) ;; add key/value if not found (begin(set 'sl (list host-name))(push (list cluster-name (list host-name)) cluster-host-list)) ))