Ищите более чистый способ сделать список ассоциаций из списка номеров - PullRequest
2 голосов
/ 29 февраля 2020

Я хочу написать процедуру, которая будет принимать список в форме '(0 7 10 14) и преобразовывать его в список' ((0. 7) (7. 10) (10. 14)) , Процедура ниже сделает именно это. Я думаю, что это довольно грязно и не могу найти более простой способ написать это. Может быть, я могу использовать встроенную функцию ракетки, чтобы сделать это?

(define (simplify-path path)
    (if (null? (cddr path))
        (cons (cons (car path) (cadr path)) '())
        (begin (cons (cons (car path) (cadr path))
                     (simplify-path (cdr path))))))

Ответы [ 3 ]

1 голос
/ 02 марта 2020
(define (simplify-path path)
  (for/list ([x path] [y (cdr path)]) (cons x y)))

Делает ли это тоже.

  • В отличие от map, for/list может принимать два разных списка длины - сокращение до длины самого короткого.
1 голос
/ 03 марта 2020

записано в мит-схеме.

(define list->assocs
  (lambda (l)
    (define pair-first-second
      (lambda (l)
        (cons (car l) (cadr l))))
    (define iter
      (lambda (l k)
        (if (eq? '() (cddr l))
            (k (pair-first-second l))
            (iter (cdr l)
                  (lambda (r)
                    (k (cons (pair-first-second l) r)))))))
    (if (or (eq? '() l)
            (eq? '() (cdr l)))
        l
        (iter l
              (lambda (x) x)))))


(list->assocs '(0 7 10 14))
1 голос
/ 29 февраля 2020

Используя Racket, мы можем сделать это:

(define (simplify-path path)
  (map cons
       (drop-right path 1)
       (rest path)))

Работает как положено:

(simplify-path '(0 7 10 14))
=> '((0 . 7) (7 . 10) (10 . 14))
...