Once the programmer has gotten used to python's lists, he'll be a fish out of water with C.
Here are a couple of code fragments from a couple of apps I coded. Here's the one I did with Ruby (not Python, but Ruby uses the same type of lists and dictionaries)
# Create a Ruby hash for master list of all option menus, list boxes and
# spin buttons. (Use hash instead of array as the values for window
# IDs don't start with 0, and may change from one FOX release to another)
# Use the window IDs (FOX defined) as keys.
#
# Organize as 6X6 matrix.
@hshOptMenuList= {THEMES => [cbSpecies, omThemes, sbFurRate, omRelations, nil, nil],
PARTICIPATION => [omArt, omCons, omFursuiting, omContact, omMucking, nil],
REALISM => [omPlushies, omRealism, omTrans, omFanfic, omFanzines, nil],
PREFERENCES => [omFurryGender, omYiffRating, cbOccu, omRLAge, omTechSavvy, omOpSys],
REALLIFE => [omGames, omEduc, omRLFurriness, omHousing, nil, nil],
INTERESTS => [omTheNet, omAnime, omPets, omRLGender, omRLSex, nil]}
I also did a C++ version of the same app, as C++ is a bit snappier on running it. Here's the same problem solved in C++:
/*
Initialize the Option Menu master list.
Note: This becomes necessary as the option menu buttons themselves
do not have a handle to receive messages. Must enable/disable
by calling the ancestor methods directly.
Store the pointers as FXObject*, and cast to type as needed.
*/
Index= THEMES - THEMES;
OptMenuList[Index][0]= FurrySpeciesCB;
OptMenuList[Index][1]= Themes;
OptMenuList[Index][2]= FurRateSB;
OptMenuList[Index][3]= Relations;
Index= PARTICIPATION - THEMES;
OptMenuList[Index][0]= Art;
OptMenuList[Index][1]= Cons;
OptMenuList[Index][2]= Fursuiting;
OptMenuList[Index][3]= Contact;
OptMenuList[Index][4]= Mucking;
Index= REALISM - THEMES;
OptMenuList[Index][0]= Plushies;
OptMenuList[Index][1]= Realism;
OptMenuList[Index][2]= Transform;
OptMenuList[Index][3]= Fanfic;
OptMenuList[Index][4]= Fanzines;
Index= PREFERENCES - THEMES;
OptMenuList[Index][0]= FurryGender;
OptMenuList[Index][1]= YiffRating;
OptMenuList[Index][2]= FurryJobsCB;
OptMenuList[Index][3]= RLAge;
OptMenuList[Index][4]= TechSavvy;
OptMenuList[Index][5]= OpSys;
Index= REALLIFE - THEMES;
OptMenuList[Index][0]= Games;
OptMenuList[Index][1]= Education;
OptMenuList[Index][2]= RLFurriness;
OptMenuList[Index][3]= Housing;
Index= INTERESTS - THEMES;
OptMenuList[Index][0]= Internet;
OptMenuList[Index][1]= Anime;
OptMenuList[Index][2]= Pets;
OptMenuList[Index][3]= RLGender;
OptMenuList[Index][4]= RLSexlife;
Simply declare: FXObject *OptMenuList[6][6];
Then fill it with zeros while initializing. Fish out of water? Not hardly! In both cases, it's simply a 6X6 matrix. The main difference is that you don't have to declare the Ruby (or Python) list, with the Ruby hash, you don't have to subtract off the "THEMES" bias every time you want to use it (which is why I went with the hash, and not the list).
I don't see a problem here.