将抽象/空变量传递给函数Clojure

时间:2016-01-30 22:06:22

标签: clojure lisp clojurescript clojure-java-interop

我有一个函数,我需要接受一个单词,我试图使变量x为单词变量的排序版本。我不知道我是怎么做的...我试图将其作为函数的参数传递但不起作用。

如何传入“单词”并使函数内的变量等于“单词”的排序版本,因此我有两个副本,原始单词和单词的x版本。所以我可以继续传递到我需要创建的地图。

(for [wordset '("one" "two" "three" "FouR" "wot" "Rheet" "nope" "#")]
    (transform2 wordset))

(defn transform2 [word x]
  (let [x (sort-string (str/lower-case word))]
   (prn x)))

(defn sort-string [s]
  (apply str (sort s)))

这是我回来的错误

CompilerException java.lang.RuntimeException: Unable to resolve symbol: x in this context, compiling:(NO_SOURCE_PATH:108:1)

2 个答案:

答案 0 :(得分:0)

这个表达式对你没有任何作用:

(for [wordset '("one" "two" "three" "FouR" "wot" "Rheet" "nope" "#")]
    (transform2 wordset))

您不会将此位置放置在将使用返回值的任何位置。 for不像其他语言中的循环命令。它只是创建一个序列并返回它,它不会修改任何东西。

一般来说,你应该使用向量和首选关键字:

[:one :two :three :whatever]

虽然这会改变你正在做的事情的语义,所以也许你有来自其他地方的字符串需要使用它们?否则,请不要将自己使用字符串作为标识符:这是关键字的用途。

至于你的其他问题,你的意思并不十分清楚。你说你想做一个变量,但是你不清楚这是什么意思,因为你所拥有的代码并没有按照这些方式做任何事情。

答案 1 :(得分:0)

您的transform2接受两个参数,但您只传递一个参数。尝试删除x参数,如下所示。此外,您可能希望颠倒创建函数的顺序,因为它们需要在使用之前进行定义。 (您也可以使用declare。)

(defn sort-string [s]
  (apply str (sort s)))

(defn transform2 [word]
  (let [x (sort-string (clojure.string/lower-case word))]
    (prn x)))

(for [wordset '("one" "two" "three" "FouR" "wot" "Rheet" "nope" "#")]
  (transform2 wordset))

结果将是:

"eno"
"otw"
"eehrt"
"foru"
"otw"
"eehrt"
"enop"
"#"