In addition to what was mentioned in other answers, this convention is used where the non-version is macros, and these macros emit code that calls functions *. Even in clojure.core , let and fn are macros that have received let* and fn* calls as a result of the code, respectively. Another example: sqlkorma , where non * ( where , delete , update , etc.) are macros and * units ( where* , delete* , etc.) are functions.
The reason for using this template is that in some cases it is not practical to use the version of the API macro (other than using eval, since you have no information at compile time), in such cases you can use the * functions.
source share