Исходя из ответов на некоторые другие ваши вопросы, я думаю, что у вас могут возникнуть проблемы с тем, чтобы обернуть голову вокруг концепций, являющихся центральными для функционального языка, такого как Схема.
На уровне, который вы изучаете 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 используется для создания списка с нуля, если у вас уже есть все элементы; cons используется для добавления одного элемента в существующий список и часто используется рекурсивно.
Вот функция, которая потребляет число 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, - это то, что все функции возвращают что-то, и это что-то является просто результатом вычисления выражения. Тело функции Scheme является одним выражением.