2016-01-30 6 views
-3

У меня есть функция, которую мне нужно взять за слово и я пытаюсь сделать переменную x отсортированной версией переменной слова. Я не уверен, как я это делаю ... Я пытаюсь передать его как параметр для функции, но не работает.Передача абстрактных/нулевых переменных в функции Clojure

Как перейти в «слово» и сделать переменную в пределах функции равной сортированной версии «слова», поэтому у меня есть две копии, исходное слово и версия версии 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) 
+0

почему вы используете котировальные списки и строки слов, а не векторы слов или лучше, векторы ключевых слов? – johnbakers

+0

Просто я новый для языка, и я не полностью понимаю весь диапазон доступных мне. Не уверен, как я буду перебирать векторы. И im, полагаясь на цикл for в минуту. Я пытаюсь преобразовать это в Clojure - >> http://pastebin.com/aRRdMCn4 –

+2

Вы уже задали этот же вопрос здесь: http://stackoverflow.com/questions/35092605/clojure-into-array-iterate- over-array – jmargolisvt

ответ

0

Это выражение не делает ничего для вас:

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

Вы не размещать это в любом месте, где будет использоваться возвращаемое значение. A for не является обязательным для цикла на других языках. Он просто создает последовательность и возвращает ее, она ничего не меняет.

Кроме того, вы должны использовать векторы и предпочитают ключевые слова, в общем:

[:one :two :three :whatever] 

Хотя это изменило бы семантику, что вы делаете, так что, может быть, у вас есть строки, поступающие из где-то еще и нужно использовать их? В противном случае не используйте строки как идентификаторы: для этого нужны ключевые слова.

Что касается других вопросов, неясно, что вы имеете в виду. Вы говорите, что хотите сделать переменную, но неясно, что вы подразумеваете под этим, так как код, который у вас есть, ничего не делает по этим строкам.

+0

Да, мне нужно использовать Strings, я пытаюсь преобразовать это в Clojure http://pastebin.com/aRRdMCn4. В конце концов я буду использовать выражение for, но у меня будет кошмар, связанный с этим в Clojure. Это мои первые попытки на функциональном языке, поэтому я стал новичком. –

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" 
"#"