Here's a somewhat more compact approach that is roughly equivalent to your script:
dirs.face_north:compass_n dirs.face_east :compass_e dirs.face_west :compass_w dirs.face_south:compass_s each canvas name in dirs canvas.toggle["transparent" deck.cards.f.widgets[name].value] end compass_neutral.toggle["transparent" (!sum "transparent"=(range dirs)..show)]
If you want your contraption to update in response to a change in state elsewhere in the deck, you will need to somehow notify the contraption of that change. There are a number of ways to accomplish this. For example, if you wrapped the script you describe in an "on view do ... end" event handler defintion, you could also expose a way for code outside the contraption to fire that view event:
on get_update do view end
And then fire it from the outside when appropriate:
mapArrowContraption.update[]
You could alternatively make a widget inside the contraption "animated" and use the view[] event that fires at 60hz to poll for changes to player direction on each frame, but this type of polling approach should be used sparingly; if lots of contraptions work this way it can add up to your game doing quite a bit of redundant work every frame!
You might also find this thread relevant.
Does any of that help point you in the right direction?