That's much of it. Another reason might be "no one has written a XYZ interpreter for the target architecture", which may be due to performance or just obscurity. Another problem constraint might be pedagogical - if the problem you are trying to solve is "show how to do X in language Y" then of course language Z can't be used - though that example could reasonably be dismissed as trivially true. I'm sure we can come up with some more if we try.