Clojure Vars与其他语言的指针/参考文献

时间:2016-02-20 16:29:27

标签: clojure

我正在尝试理解Var的咒语概念。

据我所知,它只是一个值的引用/指针。 "根值" Var的一个可以被认为是Var指向一个线程的初始值。此外,我认为 - 在幕后 - 每个Var都有一个地址指向它所指向的内存中的位置(即使像Java这样的语言,Javascript也不能让你访问那个特定的位置,也许在幕后做一些让地址不稳定的事情。)

问题:这是考虑它的正确方法吗?将clojure Var视为一个值的引用/指针是什么意思?

给出类似

的内容
(def v 7)

是否适合说" Var#' v指向值7"?

1 个答案:

答案 0 :(得分:4)

是的,这是一个很好的概念。我会稍微调整你的最后陈述:     var main = function(){ $('.arrow-next').click(function(){ var currentSlide = $('.active-slide'); var nextSlide = currentSlide.next(); if (nextSlide.length == 0){ nextSlide = $('.slide').first(); } currentSlide.fadeOut(600).removeClass('active-slide'); nextSlide.fadeIn(600).addClass('active-slide'); currentDot = $('.active-dot'); nextDot = currentDot.next(); if (nextDot.length == 0){ nextDot = $('.dot').first(); } currentDot.removeClass('active-dot'); nextDot.addClass('active-dot'); }); $('.arrow-prev').click(function(){ var currentSlide = $('.active-slide'); var prevSlide = currentSlide.prev(); if (prevSlide.length == 0){ prevSlide = $('.slide').last(); } currentSlide.fadeOut(600).removeCLass('active-slide'); prevSlide.fadeIn(600).addClass('active-slide'); currentDot = $('.active-dot'); prevDot = currentDot.prev(); if (prevDot.lenth == 0){ prevDot = $('.dot').last(); } currentDot.removeClass('active-dot'); prevDot.addClass('active-dot'); }); }; $(document).ready(main); 扩展为#'v,说var(var v)没有意义,相反我会说var v。我也会说(var v)到值7而不是指着。是的,它们的行为类似于指针,但它们有一个特殊的derefs(或@)形式来取消引用它们(并且你不能做指针算术)。

我认为采用术语deref对于理解Clojure的另一个方面很重要:当你使用任何符号时,假设我们进行函数调用deref,实际上有一个隐藏的步骤! (inc 1)是与var inc相关联的符号,(inc实际上并不是函数!inc只是对函数进行了解析)但随后自动对vars进行了评估{{ 1}}。当你写(var inc)时,你实际上只是在阻止inc。这就是为什么当您更改或替换var时,假设我们重新定义了deref,新代​​码就会被执行。

关键在于,在考虑指针时,您可能会想将inc视为某些var指向的函数。这是不正确的。 inc是与derefs到函数的var相关联的符号。使用var inc时,它会自动解析为函数。从这个意义上讲,你可以说只是说v值为7是准确的。 v是一个var,你真的不需要指定它。 (显然,当你试图明确地指出它是一个var时,它是有意义的,因此将它称为var也没有错误。)