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