Я надеялся получить лучший ответ, но это то, чем я в конечном итоге воспользовался.Мой код использует Vars .Vars предоставляют механизм ссылки на изменяемое хранилище, которое можно динамически восстанавливать (к новому хранилищу) для каждого потока, используя binding
.Это код:
(def ^:dynamic runtime ())
(defn run-prog [prog runtime-init]
(binding [runtime (transient runtime-init)] ;bind the new runtime
(run! ev (:list prog)) ; Calls the functions
(persistent! runtime)))
(defn read-script [script]
(try
(let [prog (parse (slurp script))]
(println (run-prog prog {:vars {:var1 20 :var2 ""}})) ; Show vars
(println (run-prog prog {:vars {:var1 78}})) ; Show vars
... )))
run-prog
вызывается с проанализированной программой (список вызовов функций) и начальным значением для переменных.Он возвращает конечное состояние переменных и является потокобезопасным (каждый поток имеет доступ только к своей собственной карте переменных).
Если вы не хотите использовать временные коллекции, вы можете использовать set!
чтобы изменить всю карту переменных на новое значение.