Nano Hash - криптовалюты, майнинг, программирование

Удалить элемент из списка записей

У меня есть следующая структура:

(defrecord Member [id name salary role])  
(defrecord Project [id name duration])
(defrecord ProjectMember [project member])

(def project-member-records (ref ()))

(defn find-project-member-record [parm-proj-id parm-member-id]
  (filter #(let [project (.project %) 
             member (.member %) 
             proj-id (:id project)
             member-id (:id member)] 
             (and (= proj-id parm-proj-id)
                  (= member-id parm-member-id))) @project-member-records))

;;Sample func, does not work
(defn remove-project-member-record [proj-id member-id]
  (dosync (ref-set project-member-records (remove #(= (:id (.project %)) proj-id) @project-member-records))))

Теперь я хочу удалить элемент из project-member-records. Например, я хочу удалить элемент по идентификатору проекта и идентификатору участника, например, я нахожу запись в функции find-project-member-record. Или (и) я хочу удалить элемент, если у меня есть запись, найденная project-member-records, что-то вроде (remove (find-project-member-record 1 1) project-records) ;pseudo codeНо я не знаю, как я могу это сделать.

23.09.2013

Ответы:


1

Использование remove правильно, но find-project-member-record возвращает последовательность. Пытаться

(defn remove-project-member-record [proj-id member-id]
  (let [it (first (find-project-member-record proj-id member-id))]
    (dosync
     (ref-set project-member-records
              (remove #(= % it) @project-member-records)))))

Если find-project-member-record всегда возвращает либо пустую последовательность, либо последовательность с одним элементом, может иметь смысл вместо этого возвращать либо сам элемент, либо nil. (например, вызовите first по результату filter в find-project-member-record, а не в remove-project-member-record и в другом месте).

Вот как вы можете его структурировать, если хотите, чтобы все было заключено в транзакцию dosync:

(defn remove-project-member-record [proj-id member-id]
  (dosync
   (let [it (first (find-project-member-record proj-id member-id))]
     (ref-set project-member-records
              (remove #(= % it) @project-member-records)))))
23.09.2013
  • Извините, но это не работает. Я немного переписал ваш пример: (defn remove-project-member-record [proj-id member-id] (dosync (ref-set project-member-records (remove #(= % (first (find-project-member-record proj-id member-id))) @project-member-records)))) Этот код не выдает никаких ошибок, но не удаляет данные из списка. 23.09.2013
  • @OZKA, у меня была синтаксическая ошибка, извините за это. Попробуйте еще раз сейчас - это работает в моем тестировании. Кроме того, хотя ваше переписывание обычно эквивалентно, в данном случае это не так (поскольку оно находится в транзакции). Вот почему моя формулировка работает, а ваша нет. 23.09.2013
  • @OZKA, если вам нужно, чтобы все было заключено в транзакцию, переместите let в dosync, это тоже работает на моей стороне. 23.09.2013
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..