Zuriar
Zuriar

Reputation: 11734

over ride a defonce var at the repl

How can I over-ride (re-def) a defonce var at the repl?

> (defonce moo "MOO")

> moo
>> "MOO"

> (defonce moo "CHANGED MOO")
> nil
> moo
>> "MOO"

thanks

Upvotes: 0

Views: 534

Answers (2)

leetwinski
leetwinski

Reputation: 17859

i wouldn't redefine defonce'd var with def, because it always looks like a mistake.. If you do it on purpose (if you really need it for some reason), you would probably want to emphasize it. Like by using alter-var-root:

user> (defonce a 10)
#'user/a

user> (alter-var-root #'a (constantly 20))
20

Upvotes: 2

Sam Estep
Sam Estep

Reputation: 13304

As you demonstrated, defonce checks to see if the named var already has a value, and if it does, leaves it alone. To change an existing root binding, you can just use a regular def:

;; using def or defonce here makes no difference
(defonce moo "MOO")

moo
;=> "MOO"

(def moo "CHANGED MOO")

moo
;=> "CHANGED MOO"

Upvotes: 4

Related Questions