Re: keys in a hash table (aka, all assigned indices in an array): awful hack
- To: mathgroup at smc.vnet.net
- Subject: [mg13347] Re: [mg13281] keys in a hash table (aka, all assigned indices in an array): awful hack
- From: Carl Woll <carlw at fermi.phys.washington.edu>
- Date: Mon, 20 Jul 1998 02:50:02 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Hi Daniel, I see a couple of problems with your approach. First, the keys may also have downvalues. Suppose that you have the definitions apple = MacIntosh fruits[apple] = crunchy fruits[lemon] = sour Then your keys function would return {MacIntosh,lemon} instead of {apple,lemon}. This is why DownValues uses HoldPattern in its answer. So, you might want to modify your function to return Hold[MacIntosh, lemon] or something similar. However, this isn't sufficient, since we also have problem number 2. That is, what if your function has multiple arguments? It might not make sense for your example, but suppose you also have a definition like fruits[lemon, citrus] = True Then your function keys would miss out on this second argument. So you probably want the answer to look something like Hold[{apple},{lemon,citrus}] The following function will return the above: ClearAll[Domain,ReplaceHead] Domain[s_] := Distribute[ Apply[ReplaceHead,First/@DownValues[s],1], Hold, List, Hold, Sequence ] SetAttributes[ReplaceHead, {HoldAll}] ReplaceHead[h_[args___]] := Hold[{args}] Of course, First/@DownValues[s] is very similar to what the above function returns and is probably good enough. Carl Woll Dept of Physics U of Washington On Fri, 17 Jul 1998, Daniel Reeves wrote: > suppose I make some assignments like this: > fruits[apple]= crunchy > fruits[lemon]= sour > > I'm treating fruits like a hash table and now I would like a list of all > the keys. In this case {apple,lemon}. > > It seems like there should be an easy way to do this. All I came up with > was the following hack: > > keys[hash_]:= > DownValues[hash] /. {RuleDelayed->(#&), hash->(#&)} //ReleaseHold > > > the hash values will be simple; we can just do fruits/@keys[fruits] > > Thanks, > Daniel > > -- > Daniel Reeves dreeves at umich.edu http://interlabs.bradley.edu/~daniel > > "Computer Science is no more about computers than astronomy is about > telescopes." -- E W Dijkstra > >