2014-02-20 7 views
0

Я новичок в clojure, но мне было интересно, можно ли устанавливать переменные с областью имен.Есть ли способ установить переменные области пространства имен в clojure?

(ns robot.core) 

(def ^:dyanmic myar nil) 

(defn somefunction [] 
    (binding [myvar 1])) 

(defn -main [] 
    ((somefunction) 
    (println myvar)) 

Запуск, что выход nil воли, есть в любом случае, чтобы установить namespace'd переменные, или они должны быть розданы каждой функции?

+0

Это опасно и не рекомендуется! – Chiron

+0

@Чирон, что такое «опасно»? –

ответ

1

alter-var-root функция позволяет изменять корень привязки переменной:

(def ^:dyanmic *myvar* nil) 

(defn somefunction [] 
    (alter-var-root #'*myvar* (constantly 1))) 

(defn -main [] 
    (somefunction) 
    (println *myvar*)) 

binding функции, с другой стороны. позволяет запускать некоторый код с переопределенной переменной ^:dyanmic без изменения привязки ядра.

+0

FYI: '^: dynamic' - это то, что позволяет использовать привязку, чтобы иметь только видимое значение потока. 'alter-var-root', с которым вы связались, объясняет, что он фактически изменяет var и отображается для всех потоков. –

0

Я не уверен, что вы пытаетесь сделать, но знаете ли вы: личные метаданные?

(def ^:private wohoo "wohoo") 

И defvar-?

Я предполагаю, что вы хотите скрыть свой var от других пространств имен.

Смежные вопросы