Хорошо, это может показаться смешным вопросом, но как вы вернете список в схеме.?
Схема создания списка
Ответ 1
Основываясь на некоторых других ваших вопросах, я думаю, что у вас может возникнуть проблема с тем, чтобы ваша голова обернулась вокруг концепций, центральных для функционального языка, такого как Scheme.
На уровне, который вы изучаете Scheme (новичок), каждая функция, которую вы пишете, имеет вход и выход, а тело каждой функции - одно выражение. Независимо от того, какое значение оценивает выражение, возвращается функция. Нет необходимости явно "возвращать" что угодно, как на императивном языке, таком как Java или C; это просто происходит как прямое следствие оценки выражения.
Тело функции является единственным выражением. Это не похоже на Java, где тело метода состоит из ряда инструкций:
do this
then do that
then do something else
then return something (maybe)
Функции схемы оценивают одно выражение; больше ничего. Здесь простая функция, которая добавляет 5 к любому числу, переданному в качестве аргумента:
(define (add5 x)
(+ x 5))
Тело функции (+ x 5)
, которое является просто выражением, которое должно быть оценено. Значение x
подключено, функция +
(добавление) применяется к x
и 5, и результат возвращается.
Списки не сильно отличаются. Все, что вам нужно - это выражение, которое построит список. Два уже упомянуты: list используется для создания списка с нуля, если у вас уже есть все элементы; минус используется для добавления одного элемента в существующий список и часто используется рекурсивно.
Здесь функция, которая потребляет число n
и строит список (n n-1 n-2 ... 0)
(define (makelist n)
(if (= n 0)
(list 0) ; base case. Just return (0)
(cons n (makelist (- n 1))))) ; recursive case. Add n to the head of (n-1 n-2 ... 0)
Как в базовом, так и в рекурсивном случае, список возвращается просто путем вычисления выражения, которое использует одну из функций построения списка.
Вот еще один пример. Этот использует нашу функцию add5
, чтобы добавить 5 к каждому элементу списка чисел (lon):
(define (add5list lon)
(if (null? lon)
`() ; base case: lon is empty. Return an empty list.
(cons (add5 (car lon)) (add5list (cdr lon))))) ; recursive case.
; Add 5 to the head of lon and prepend it to the tail of lon
Опять же, как базовые, так и рекурсивные случаи возвращают списки, оценивая выражения, которые приводят к спискам.
Главное, что нужно помнить о Схеме, - это все функции, возвращающие что-то, и что-то просто результат оценки выражения. Тело функции Scheme является единственным выражением.
Ответ 2
Вероятно, вы просто хотите: '(2 3 5 7 11)
или (list 2 3 5 7 11)
?
Вы также можете создавать списки, указав элемент и список, чтобы добавить его в: (cons 2 (cons 3 '()))
Здесь приведен пример возврата списка из функции:
(define returnlist
(lambda(a b c)
(cons a (cons b (cons c '())))
))
(returnlist 2 3 4)
Возвращаемое значение будет следующим: (list 2 3 4)
Ответ 3
Другой не очень известный способ сделать это:
> ((lambda x x) 2 3 5 7 11)
(2 3 5 7 11)
то есть сама функция "списка" может быть определена как:
> (define list (lambda x x))