Какой рекурсивный способ переместить второй элемент списка вперед? [Ракетка] - PullRequest
1 голос
/ 16 марта 2019

Как я могу рекурсивно переместить середину списка из 3 элементов в начало списка? Есть вложенные списки.

Итак,

 ((not #f) iff (((#f implies #t) and #t) or #f))

Должен стать

(iff (not #f) (or (and (implies #f #t) #t) #f))

1 Ответ

1 голос
/ 16 марта 2019

Это действительно хорошее использование match, потому что мы можем установить условие для списка из 3 элементов и просто игнорировать другие случаи -

(define (transform l)
  (match l
    ((list a b c)
     (list (transform b)
           (transform a)
           (transform c)))
    (_
     l)))

(transform '((not #f) iff (((#f implies #t) and #t) or #f)))
; '(iff (not #f) (or (and (implies #f #t) #t) #f))

@ PetSerAl ловит ошибку в комментариях. Вот исправление -

(define (transform l)
  (match l
    ((list a b c)             ; a 3-element list
     (list (transform b)
           (transform a)
           (transform c)))
    ((? list? _)              ; any other list
      (map transform l))
    (_                        ; a non-list
     l)))

(transform '(not (#f implies #t)))
; '(not (implies #f #t)
...