Dans une application sur laquelle je travaille dans Racket, je dois prendre une liste de nombres et partitionner la liste en sous-listes de nombres consécutifs: (Dans l'application, je serai effectivement partitionner paires constituées d'un nombre et des données, mais le principe est le même)Partitionner une liste dans Racket
à savoir si ma procédure est appelée chunkify
alors:.
(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.
Je suis venu avec ce qui suit dans Racket:
#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))
Cela fonctionne très bien, mais je me demande donné l'expressivité de Racket s'il n'y a pas une façon plus simple plus simple de le faire, une certaine façon de se débarrasser des « call-with-valeurs » et la nécessité d'inverser la liste dans la procédure etc., peut-être d'une manière tout à fait différente.
Ma première tentative a été plus ou moins basé sur un modèle avec un collecteur "The Little Schemer" et qui était encore moins simple que ce qui précède:
(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)])))
Ce que je suis à la recherche est quelque chose de simple, concis et simple.
Ceci est plus d'un "s'il vous plaît consulter mon code", pas "ce qui ne va pas avec mon code", donc je pense que ce serait sur www.codereview.stackexchange.com –