Tengo una lista, que puede contener elementos que se puedan comparar como iguales. Me gustaría una lista similar, pero con un elemento eliminado. Así que de (: a: b: c: b: d) Me gustaría poder "eliminar" solo uno: b para obtener (: a: c: b: d).¿Qué es idiomático Clojure para "eliminar" una sola instancia de muchas en una lista?
El contexto es una mano en un juego de cartas donde dos mazos de cartas estándar están en juego, por lo que puede haber cartas duplicadas, pero todavía se juegan de a una por vez.
Tengo un código de trabajo, consulte a continuación. ¿Hay formas más idiomáticas de hacer esto en Clojure?
(defn remove-one [c left right]
(if (= right())
left
(if (= c (first right))
(concat (reverse left) (rest right))
(remove-one c (cons (first right) left) (rest right)))))
(defn remove-card [c cards]
(remove-one c() cards))
Estas son las respuestas Scala llegué hace un tiempo: What is an idiomatic Scala way to "remove" one element from an immutable List?
Como nota al pie, miré el código fuente de la respuesta preferida a mi versión Scala de esta pregunta. Resulta que la función diff en Scala usa un hash mutable para contar el número de ocurrencias para eliminar de un conjunto múltiple. –
Solo para aclarar: ¿importa qué: b cuenta como duplicado aquí? De la salida de ejemplo, 'soltó' la primera: b, pero ¿sería igual a haber descartado la segunda: b en su lugar? [abcbd -> acdb, pero ¿también sería aceptable?] – monojohnny
@monojohnny, abcd es igual de bueno para mi caso de uso. –