2013-03-26 3 views

ответ

8

переменные неизменны в Clojure. Таким образом, вы не должны пытаться изменить значение foo, но вместо этого, «создать» новый Foo:

(def foo2 (+ foo 0.1)) 

... или, если в цикле, повторялись с новым значением:

(loop [foo 5.0] 
    (when (< foo 9) 
    (recur (+ foo 0.1)))) 

... или, если Foo является атом, swap! его с новым значением:

(def foo (atom 5.0)) 
(swap! foo (partial + 0.1)) 

Я рекомендую вам начать с чтения the rationale of Clojure.

+1

Отображение vars как единственного способа создания нового значения вводит в заблуждение - в большинстве случаев, когда требуется заменить значение другим, это неправильный инструмент. Атомы, петли и т. Д., Вероятно, должны иметь более заметное место в примерах. –

+2

['swap!'] (Http://clojuredocs.org/clojure_core/clojure.core/swap!) Принимает функцию и аргументы, чтобы сделать обновление, поэтому вы можете записать его так, а не использовать 'partial':' (swap! foo + 0.1) ' – DaoWen

3

ответ Блэксад охватывает определение ВАРА, так что я просто хотел бы добавить другие области, в которых вы можете иметь значение, которое увеличивается на единице от другого значения:

в локальной области видимости функции во:

user> (defn my-function [x] 
     (let [y (inc x) 
       z (+ x y)] 
      [x y z])) 
#'user/my-function 
user> (my-function 4) 
[4 5 9] 

и если вы хотите, чтобы построить значение с приращением, чтобы сделать процесс более ясным:

user> (defn my-function [x] 
     (let [y (inc x) 
       z (+ x y) 
       z (+ z 4) 
       z (* z z)] 
      [x y z])) 
#'user/my-function 
user> (my-function 4) 
[4 5 169] 

Это может сделать процесс более презентабельно, ты gh это не «способ вернуть переменные» и действительно полезен только в ограниченных контекстах. Этот шаблон используется в макросах clojure.core.

+0

Является ли' let * 'просто подсказкой (что присвоения не являются независимыми) или ведет себя иначе, чем' let'? – Blacksad

+0

let - макрос, который вызывает вызов, позволяющий * https://github.com/clojure/clojure/blob/c6756a8bab137128c8119add29a25b0a88509900/src/clj/clojure/core.clj#L4035 –

+1

Я не понимаю, почему 'let *' здесь тоже. Очевидно, это не то, что вы напишете в реальной жизни, и, похоже, это не служит какой-либо учебной цели в этом контексте. Это просто отвлекает от основного момента, а именно, как использовать 'let' для создания новых областей. – amalloy

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