A ::ROUTINE is invoked like an external call, so it gets a new variable set, does not inherit things like digits settings or signal traps. It also cannot see labels in the main program. Using PROCEDURE on an internal call just creates the new variable set, the other settings get inherited from the caller.
One big advantage of using ::ROUTINE is that you can group a large number of functions in a single file and call them from other programs by using ::REQUIRES to access them.
Rick