Decorators are not a data structure. It's an unnecessary syntax sugar that was implemented just to make some code a tiny bit more readable, that's it.
And you can't use them to change something in runtime unless you rely on some global variables or introduce some other referential opaqueness.
With that being said, a way to achieve the exact same functionality but maybe without some special sugar is available in any language that treats functions as first-class citizens.
The tutorial that you linked gives this example:
@split_string
@uppercase_decorator
def say_hi():
return 'hello there'
And the most similar way to implement it in Clojure would be something like
(def say-hi (comp
split-string
uppercase-decorator
(fn [] "hello there")))
Although I would just wrap it all in a single function, which is much simpler in Clojure because there's no return
statement that can appear anywhere, like there is in Python:
(defn say-hi []
(-> "hello there"
uppercase-decorator
split-string))