Clojure: вектор не является неизменным - PullRequest
0 голосов
/ 17 ноября 2018

Я столкнулся с проблемой, когда неизменность внезапно перестала действовать для моих векторов.Мне было интересно, есть ли способ создать свежие неизменные векторные копии данного набора.

Clojuredocs предложил "aclone", но это дает мне ошибку, утверждая, что такого метода нет.

(defn stripSame [word wordList]
  (def setVec (into #{} wordList))
  (def wordSet word)
  (def wordVec (into #{} [wordSet]))
  (def diffSet (set/difference setVec wordVec))
  (def diffVec (into [] diffSet))
  diffVec) 


(defn findInsOuts [word passList]
  (def wordList (stripSame word passList))
  (println word wordList)
  (def endLetter (subs word (dec (count word))))
  (def startLetter  (subs word 0 1))
  (println startLetter endLetter)
  (def outs (filter (partial starts endLetter) wordList))
  (def ins (filter (partial ends startLetter) wordList))
  ;(println ins outs)
  (def indexes [ (count ins) (count outs)])
  indexes)

(defn findAll [passList]
  (def wordList   (into [] passList) ))
  (println wordList)
  (loop [n 0 indexList []]
    (println  "In here" (get wordList n) wordList)
    (if (< n (count wordList))
      (do
        (def testList wordList)
        (def indexes (findInsOuts (get wordList n) testList))
        (println (get wordList n) indexes)
        (recur (inc n) (conj indexList [(get wordList n) indexes]))))))

passList - это список слов, подобных этому (lol at good), который затем преобразуется в вектор.

Так что по сути findAll вызывает findInsOuts, который просматривает каждое слово в списке и видит, сколько других словначинайте с последней буквы, но сначала удаляйте искомое слово из вектора, прежде чем выполнять какую-либо функцию для предотвращения дублирования.Проблема в том, что этот вектор каким-то образом является изменчивым, поэтому копия вектора в findAll также постоянно удаляет это значение.

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

Как я могу создать новый вектор для использования, который на самом деле является неизменным?

Любая помощь приветствуется

1 Ответ

0 голосов
/ 17 ноября 2018

Боюсь, твой код пронизан недоразумениями.Для начала не используйте def в пределах defn.Вместо этого используйте let.Это превращает вашу первую функцию в ...

(defn stripSame [word wordList]
  (let [setVec (into #{} wordList)
        wordSet word
        wordVec (into #{} [wordSet])
        diffSet (clojure.set/difference setVec wordVec)
        diffVec (into [] diffSet)]
    diffVec))

Например,

=> (stripSame 2 [1 2 :buckle-my-shoe])
[1 :buckle-my-shoe]

Функция может быть упрощена до ...

(defn stripSame [word wordList]
  (vec (disj (set wordList) word)))

..или, используя макропоток, чтобы ...

(defn stripSame [word wordList]
  (-> wordList set (disj word) vec))

Я не думаю, что функция делает то, что вы думаете, потому что она не всегда сохраняет порядок элементов в векторе.


Будь я на вашем месте, я бы пробежался по некоторым учебникам сообщества на этой странице .Там тоже есть несколько хороших книг.Когда вы овладеете идиомами языка, вы обнаружите, что то, что вы пытаетесь сделать, здесь гораздо яснее и проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...