参数值的说明

时间:2011-10-26 14:12:39

标签: clojure

此问题与StackOverFlow while counting digits直接相关。我已经解决了这个问题的解决方案,并提出了两个问题:

首先是解决方案:

(defn num-digits-tail-recursion 
        ([n count]
           (if (= 0 n)
             count
             (recur (quot n 10) (inc count))))
        ([n] (num-digits-tail-recursion n 0)))
  1. count是一个独立的函数,用于计算字符串中的字符数。我是否正确假设计数被允许为var,因为它不在列表的第一个位置?

  2. count是第二个参数,但我只传递一个参数 - 数字。 有关以列表开头的函数语法有什么特别之处,而不是 典型的参数向量(defn test_fn [x y] (println x))

  3. 编辑:

    我为原始问题的不清晰而道歉。为什么提供函数名称 - count - 不会导致num-digits-tail-recursion期望第二个参数?如果我提供([n x]...而不是(n count]...并使用一个参数调用该函数,则会出现一个不足参数错误。

2 个答案:

答案 0 :(得分:2)

  1. 使用与引用的命名空间中的现有函数相同的函数命名args并不是一个好主意,尽管在您的示例中,count以这种方式使用而不是。在您的示例中,count只是一个在每次递归迭代中递增的int!

    但是如果你想传递一个count函数并且你将它的名字命名为'count',那么将调用什么函数?函数clojure.core/count或传递的函数? (整改:由于词法范围而传递的函数)。因此,避免混淆并选择不同的名称。即使您没有传递函数,也应该避免使用这些名称。

  2. 函数支持arity重载,这就是您现在使用的内容。请阅读:http://clojure.org/functional_programming

答案 1 :(得分:1)

问题#1:Clojure是lexicaly范围。因此,如果您创建一个与在封闭范围内定义的var同名的本地var,则本地副本将会影响'外面的。在这种情况下,clojure.core中的count是外部范围,此函数的count将覆盖它。当您在此函数中引用count时,您会看到本地函数参数列表中的定义。

(def x 4)
(defn foo [x]
    (println x))
(foo 42)
=> 42

在您的特定情况下count在不同的命名空间中定义,但范围概念是相同的。

第2部分的例子:

(defn foo
  ([] (println "i have no args"))
  ([x] (println "i have one arg " x))
  ([x y] (println "i have two args " x " " y)))