I think the Assoc++ function has been around for some time, something along the lines of:
([color=BLUE]defun[/color] _Assoc++ ( key alist )
(
([color=BLUE]lambda[/color] ( pair )
([color=BLUE]if[/color] pair
([color=BLUE]subst[/color] ([color=BLUE]list[/color] key ([color=BLUE]1+[/color] ([color=BLUE]cadr[/color] pair))) pair alist)
([color=BLUE]cons[/color] ([color=BLUE]list[/color] key 1) alist)
)
)
([color=BLUE]assoc[/color] key alist)
)
)
Wherein, if a key is already present in the association list, its associated value would be incremented, else the new key would be added to the association list.
Such a function is really handy when counting the number of instances of multiple items, for example in this simple block counter:
([color=BLUE]defun[/color] c:test ( [color=BLUE]/[/color] ss i lst )
([color=BLUE]if[/color] ([color=BLUE]setq[/color] ss ([color=BLUE]ssget[/color] [color=MAROON]"_X"[/color] '((0 . [color=MAROON]"INSERT"[/color]))))
([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] i ([color=BLUE]sslength[/color] ss))
([color=BLUE]setq[/color] lst (_Assoc++ ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 2 ([color=BLUE]entget[/color] ([color=BLUE]ssname[/color] ss ([color=BLUE]setq[/color] i ([color=BLUE]1-[/color] i)))))) lst))
)
)
lst
)
But, say we have a situation in which items form a hierarchy, and you wish to count items based on two (or more) variable keys - at this point the Assoc++ function cannot be used since only one key can be queried.
For example:
_$ ([color=BLUE]setq[/color] alist (_nAssoc++ '([color=MAROON]"Item1"[/color] [color=MAROON]"SubItem1"[/color] [color=MAROON]"A"[/color]) alist))
(
([color=MAROON]"Item1"[/color]
([color=MAROON]"SubItem1"[/color]
([color=MAROON]"A"[/color] 1)
)
)
)
_$ ([color=BLUE]setq[/color] alist (_nAssoc++ '([color=MAROON]"Item1"[/color] [color=MAROON]"SubItem1"[/color] [color=MAROON]"B"[/color]) alist))
(
([color=MAROON]"Item1"[/color]
([color=MAROON]"SubItem1"[/color]
([color=MAROON]"B"[/color] 1)
([color=MAROON]"A"[/color] 1)
)
)
)
_$ ([color=BLUE]setq[/color] alist (_nAssoc++ '([color=MAROON]"Item1"[/color] [color=MAROON]"SubItem2"[/color] [color=MAROON]"A"[/color]) alist))
(
([color=MAROON]"Item1"[/color]
([color=MAROON]"SubItem2"[/color]
([color=MAROON]"A"[/color] 1)
)
([color=MAROON]"SubItem1"[/color]
([color=MAROON]"B"[/color] 1)
([color=MAROON]"A"[/color] 1)
)
)
)
_$ ([color=BLUE]setq[/color] alist (_nAssoc++ '([color=MAROON]"Item2"[/color] [color=MAROON]"SubItem1"[/color] [color=MAROON]"A"[/color]) alist))
(
([color=MAROON]"Item2"[/color]
([color=MAROON]"SubItem1"[/color]
([color=MAROON]"A"[/color] 1)
)
)
([color=MAROON]"Item1"[/color]
([color=MAROON]"SubItem2"[/color]
([color=MAROON]"A"[/color] 1)
)
([color=MAROON]"SubItem1"[/color]
([color=MAROON]"B"[/color] 1)
([color=MAROON]"A"[/color] 1)
)
)
)
_$ ([color=BLUE]setq[/color] alist (_nAssoc++ '([color=MAROON]"Item1"[/color] [color=MAROON]"SubItem1"[/color] [color=MAROON]"A"[/color]) alist))
(
([color=MAROON]"Item2"[/color]
([color=MAROON]"SubItem1"[/color]
([color=MAROON]"A"[/color] 1)
)
)
([color=MAROON]"Item1"[/color]
([color=MAROON]"SubItem2"[/color]
([color=MAROON]"A"[/color] 1)
)
([color=MAROON]"SubItem1"[/color]
([color=MAROON]"B"[/color] 1)
([color=MAROON]"A"[/color] 2)
)
)
)
This was my solution,
[color=green];; Scroll for solution - so as not to spoil the challenge ;)[/color]
([color=BLUE]defun[/color] _nAssoc++ ( keys alist )
(
([color=BLUE]lambda[/color] ( pair )
([color=BLUE]if[/color] pair
([color=BLUE]subst[/color]
([color=BLUE]cons[/color] ([color=BLUE]car[/color] keys)
([color=BLUE]if[/color] ([color=BLUE]cdr[/color] keys)
(_nAssoc++ ([color=BLUE]cdr[/color] keys) ([color=BLUE]cdr[/color] pair))
([color=BLUE]list[/color] ([color=BLUE]1+[/color] ([color=BLUE]cadr[/color] pair)))
)
)
pair
alist
)
([color=BLUE]cons[/color]
([color=BLUE]if[/color] ([color=BLUE]cdr[/color] keys)
([color=BLUE]cons[/color] ([color=BLUE]car[/color] keys) (_nAssoc++ ([color=BLUE]cdr[/color] keys) [color=BLUE]nil[/color]))
([color=BLUE]list[/color] ([color=BLUE]car[/color] keys) 1)
)
alist
)
)
)
([color=BLUE]assoc[/color] ([color=BLUE]car[/color] keys) alist)
)
)
Have fun!