En una aplicación en la que estoy trabajando Racket necesito tomar una lista de números y dividir la lista en sublistas de números consecutivos: (En la aplicación real, en realidad estaré la partición de pares formados por un número y algunos datos, pero el principio es el mismo)Particionando una lista en Racket
es decir, si mi procedimiento se llama chunkify
a continuación:.
(chunkify '(1 2 3 5 6 7 9 10 11)) -> '((1 2 3) (5 6 7) (9 10 11))
(chunkify '(1 2 3)) -> '((1 2 3))
(chunkify '(1 3 4 5 7 9 10 11 13)) -> '((1) (3 4 5) (7) (9 10 11) (13))
(chunkify '(1)) -> '((1))
(chunkify '()) -> '(())
etc.
yo he llegado con el siguiente en Raqueta:
#lang racket
(define (chunkify lst)
(call-with-values
(lambda()
(for/fold ([chunk '()] [tail '()]) ([cell (reverse lst)])
(cond
[(empty? chunk) (values (cons cell chunk) tail)]
[(equal? (add1 cell) (first chunk)) (values (cons cell chunk) tail)]
[else (values (list cell) (cons chunk tail))])))
cons))
Esto funciona muy bien, pero me pregunto dada la expresividad de la raqueta si no hay una manera más sencilla más sencilla de hacer esto, de alguna manera para deshacerse de los "valores call-con-" y la necesidad de invertir la lista en el procedimiento, etc., quizás de alguna manera completamente diferente.
Mi primer intento fue muy vagamente basada en un patrón con un colector en "The Little Schemer" y que era incluso menos sencilla que la anterior:
(define (chunkify-list lst)
(define (lambda-to-chunkify-list chunk) (list chunk))
(let chunkify1 ([list-of-chunks '()]
[lst lst]
[collector lambda-to-chunkify-list])
(cond
[(empty? (rest lst)) (append list-of-chunks (collector (list (first lst))))]
[(equal? (add1 (first lst)) (second lst))
(chunkify1 list-of-chunks (rest lst)
(lambda (chunk) (collector (cons (first lst) chunk))))]
[else
(chunkify1 (append list-of-chunks
(collector (list (first lst)))) (rest lst) list)])))
Lo que estoy buscando es algo sencillo, conciso y directo.
Esto es más de un "por favor revisa mi código", no "lo que está mal con mi código", por lo que creo que pertenecería a www.codereview.stackexchange.com –