Вопрос
Хорошо, это может показаться смешным вопросом, но как вернуть список в схему?
Нет правильного решения
Другие советы
Основываясь на некоторых других ваших вопросах, я думаю, что у вас могут возникнуть проблемы с пониманием концепций, центральных для функционального языка, такого как 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, и результат возвращается.
Списки мало чем отличаются.Все, что вам нужно, это выражение, которое создаст список.Два из них уже были упомянуты: список используется для построения списка с нуля, если у вас уже есть все элементы; минусы используется для добавления одного элемента в существующий список и часто используется рекурсивно.
Вот функция, которая принимает число 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 представляет собой одно выражение.
Вы, вероятно, хотите просто: '(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)
Еще один не очень известный способ сделать это:
> ((lambda x x) 2 3 5 7 11)
(2 3 5 7 11)
то есть сама функция «список» может быть определена как:
> (define list (lambda x x))