Вопрос

Хорошо, это может показаться смешным вопросом, но как вернуть список в схему?

Нет правильного решения

Другие советы

Основываясь на некоторых других ваших вопросах, я думаю, что у вас могут возникнуть проблемы с пониманием концепций, центральных для функционального языка, такого как 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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top