This is not the case even in an interpreted language. You only need to build an AST once, at parse time. In JavaScript the AST is then compiled into byte code or machine code depending on the implementation.
In JS, if 1 developer and 9 users with a total of 10 separate browser instances all call the same function, the code will be parsed 10 times.
In Unison, the AST is generated by the developer, cached, and the 9 users can call it by hash (assuming they have access to that database where the AST lives) without reparsing the code.
The way I intend to use it is that users periodically fetch the codebases from all of the developers that they trust. This has no immediate effect because you're still calling the same function that you're used to. So the sync can be very latency tolerant.
Then, when you decided to use the new version of something, you call the new hash. If something goes wrong, you just go back to calling the old hash--atomic upgrade/downgrades, no merge conflicts.
My impression of Unison is that if you want to call a function ten times, you just need to evaluate that code into an AST once. Once you have the hash of that AST, you can delete the code and still call the function 9 more times without having to bother with building the tree each time.
I don't know what to call it, but I don't think it's interpreted because you don't need the code to run it (except the first time, which is how you know find the hash of the function).