Defining a keyed table or "dictionary" is quite straightforward in lua and not really diffferent from other programming languages. It is for instance done like this:
functions = {}functions["j"] = printLowerfunctions["J"] = printUpper
functions["C-j"] = printControl* printUpper, -Lower and -Control are names of functions
The same result can be achieved with this syntax.
functions = { j = printLower, J = printUpper, C-j = printControl}This alternative can come in quite handy when a table is part of a larger table/object structure, like this one.
menu = { state = nil, display = { keys = {"M"}, functions = { M = displayMenu } }, choice = { keys = {"j", "J", "C-j"}, functions = { j = printLower, J = printUpper, C-j = printControl } }}Still there is a problem with this perticular example and it wil produce a syntax error. The reason is in the third key/value pair:
where the "-" character is not interpreted as part of the key value but as a minus sign. All key values that are not syntactic valid Lua identifiers will result in this same problem.
But we can't be daunted by such a small problem and will simply put the offending key value in qoutes right? Wrong! A syntax like this:
functions = { "j" = printLower, "J" = printUpper, "C-j" = printControl}
unfortunately is not allowed in lua and will yield an error. So in situations with problematic key values you will have to revert to a syntax like in the first example. That cóuld however get you into trouble with the way lua resolves field and/or function adresses; see also Function names in table fields.
I ran into problems with this phenomenon when I wanted to change the menu script in such a way that it would also correctly process [Control]+[Key] combinations. But the Celestia designers decided to specify [Control] combinations as a "C-x" string where the x represents the character pressed. A very unfortunate choice; the underscore character "_" would have been a better choice, since it is a valid part of a lua identifier.