Как создать список списков в схеме?

Возможно, я пропустил это в документе R5RS, но как мне создать список списков в (куриной) схеме? Я хочу иметь возможность взять список a, вызвать (list-ref a b), присвоить результат c, а затем вызвать (list-ref c d), где b и d — значения индекса.

Изменить: для уточнения предположим, что у меня есть эти списки:

(define citrus (list "oranges" "limes"))
(define apples (list "macintosh" "rome" "delicious"))

Затем я хочу создать список под названием fruit с citrus и apples в качестве элементов списка.


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


Ответы (2)


Если вы хотите создать список, содержащий эти списки, просто вызовите list с ними в качестве аргументов:

(define fruit (list citrus apples))

(list-ref (list-ref fruit 0) 1)
=> "lime"
person Barmar    schedule 04.07.2013
comment
Код неверен, данные индексы возвращают "limes", а не "rome" - person Óscar López; 04.07.2013

Вот как вы создаете список списков:

(list (list 1 2) (list 3 4))   

Или еще проще:

'((1 2) (3 4))

Теперь, если у вас уже есть другие подсписки, определенные как отдельные списки, поместите их во внешний список, снова вызвав для них list:

(define the-first  (list 1 2))
(define the-second (list 3 4))
(define list-of-lists (list the-first the-second))
list-of-lists
=> '((1 2) (3 4)) 

Чтобы получить доступ к позиции с двумя индексами, сделайте это — помните, что индексы отсчитываются от нуля:

(define lst '((1 2) (3 4)))
(list-ref (list-ref lst 1) 0)
=> 3

Итак, первый пример в вопросе будет выглядеть так:

(define a '((1 2) (3 4)))
(define b 1)
(define c (list-ref a b))
(define d 0)
(list-ref c d)
=> 3

И второй пример (после редактирования) будет выглядеть так:

(define citrus (list "oranges" "limes"))
(define apples (list "macintosh" "rome" "delicious"))
(define fruit (list citrus apples)) ; here's the list of lists

Теперь, чтобы получить доступ к элементу, сначала мы должны передать индекс самого внешнего списка (допустим, мы хотим, чтобы яблоки находились под индексом 1 в самом внешнем списке), а затем индекс самого внутреннего списка (допустим, нам нужен Macintosh, который находится под индексом 0 в подсписке яблок):

(list-ref (list-ref fruit 1) 0)
=> "macintosh"
person Óscar López    schedule 04.07.2013