Estoy tratando de escribir una función de utilidad Clojure llamada map-longest
(sugerencia de nombre alternativo apreciada). Esta función tendrá el siguiente "firma":Clojure map-longest
(map-longest fun missing-value-seq c1 & colls)
y se comportan de manera similar a map
, a excepción de lo que va a continuar procesando las colecciones suministrados hasta que el más larga se agota. Para las colecciones más cortas que las más largas, cuando se agoten los valores, las tomará del missing-values-seq
. Debería ser flojo, pero obviamente no se puede usar con colecciones infinitas.
Ejemplo del uso:
(print (apply str
(map-longest #(str %1 \space %2 \space %3 \newline) (repeatedly "--")
["a1" "a2" "a3"] ["b1" "b2"] ["c1" "c2" "c3" "c4"])))
Se debe producir el siguiente resultado:
a1 b1 c1
a2 b2 c2
a3 -- c3
-- -- c4
pero puede tener la llamada equivocada.
¿Cómo implemento esto? ¿La biblioteca clojure.core o clojure-contrib ya tiene algo como esto? Como alternativa al missing-value-seq
, ¿sería mejor pasar una segunda función para generar los valores perdidos (por ejemplo: #(identity "--")
en mi ejemplo)?
Caso de uso: Estoy escribiendo un pequeño texto spider solitario como un ejercicio para aprender Clojure/programación funcional. Necesito poder mostrar los tableaus del juego (tableaux para puristas :-)).
'(no-cada nil primicias??)' - que no funcionará para secuencias como [ 'c1' c2 nil 'c3]. – ffriend
@ffriend: ¿puedes dar un código de prueba? –
intente estas secuencias: ['a1' a2 nil] ['b1' b2] ['c1' c2 nil 'c4]. Puedes arreglarlo marcando '(cada? Empty? Cols)' antes de calcular 'primeros' y reemplazando calculando' primeros' por '(map first-or-val (conj colls c1))' (ver mi respuesta). – ffriend