Преобразование списка в круговой список в схеме Chicken?

Пытаясь найти, как преобразовать такой список, я наткнулся на потоки схем и циклические списки. Однако для этого ответа требуются функции в Racket, недоступные в схеме Chicken. Может ли кто-нибудь указать мне, как это сделать в схеме «Курица»? Или нейтрально по схеме?


person xuinkrbin.    schedule 16.10.2013    source источник


Ответы (2)


Если вы можете изменить список, вот стандартный способ:

(define (make-circular lst)
  ; helper for finding the last pair in a list
  (define (last-pair lst)
    (if (null? (cdr lst))
        lst
        (last-pair (cdr lst))))
        ; special case: if the list is empty
  (cond ((null? lst) '())
        (else
         ; set the last pair to point to the head of the list
         (set-cdr! (last-pair lst) lst)
         lst)))

Имейте в виду, что приведенное выше изменит список ввода. В остальном он работает так, как ожидалось:

(make-circular '(1 2 3 4 5))
=> #0=(1 2 3 4 5 . #0#)

(car (cdr (cdr (cdr (cdr (cdr (make-circular '(1 2 3 4 5))))))))
=> 1
person Óscar López    schedule 16.10.2013

При использовании SRFI это довольно просто:

(использовать srfi-1) (определить l '(1 2 3 4)) (применить круговой список l)

person Hans    schedule 15.09.2014