List 计划如何创建列表

List 计划如何创建列表,list,scheme,List,Scheme,好吧,这听起来可能是个荒谬的问题,但如何在scheme中返回列表呢?您可能只想:(23 5 7 11)或(23 5 7 11) 您还可以通过指定元素和要将其添加到的列表来构造列表:(cons 2(cons 3’()) 下面是一个从函数返回列表的示例: (define returnlist (lambda(a b c) (cons a (cons b (cons c '()))) )) (returnlist 2 3 4) 返回值将是列表:(列表2 3 4)另一种不太为人所知的

好吧,这听起来可能是个荒谬的问题,但如何在scheme中返回列表呢?

您可能只想:
(23 5 7 11)
(23 5 7 11)

您还可以通过指定元素和要将其添加到的列表来构造列表:
(cons 2(cons 3’())

下面是一个从函数返回列表的示例:

(define returnlist 
  (lambda(a b c) 
    (cons a (cons b (cons c '())))
))

(returnlist 2 3 4)

返回值将是列表:
(列表2 3 4)

另一种不太为人所知的方法:

> ((lambda x x) 2 3 5 7 11)
(2 3 5 7 11)
也就是说,“列表”函数本身可以定义为:

> (define list (lambda x x))

根据您看到的一些其他问题,我认为您可能难以理解函数式语言(如Scheme)的核心概念

在您正在学习的Scheme(新手)级别,您编写的每个函数都有一个输入和一个输出,每个函数的主体都是一个表达式。表达式计算结果的值由函数返回。没有必要像在Java或C这样的命令式语言中那样显式地“返回”任何内容;它只是计算表达式的直接结果

函数体是单个表达式。与Java不同,Java的方法体由一系列指令组成:

do this
then do that
then do something else
then return something (maybe)
Scheme函数对单个表达式求值;没别的了。下面是一个简单的函数,它将5添加到作为参数传递的任何数字中:

(define (add5 x)
  (+ x 5))
函数体是
(+x5)
,它只是一个要计算的表达式。插入
x
的值,将
+
(加法)函数应用于
x
和5,并返回结果

清单也没什么不同。您所需要的只是一个表达式,它将构造一个列表。已经提到了两个:list用于从头构建列表,如果您已经拥有所有元素cons用于将单个元素添加到现有列表中,并且经常递归使用

这里有一个函数,它使用一个数字
n
,并构建列表
(n-1 n-2…0)

在基本和递归情况下,只需对使用列表构建函数之一的表达式求值即可返回列表

这是另一个例子。这个函数使用我们的
add5
函数向数字列表(lon)的每个元素添加5:

同样,基本情况和递归情况都是通过计算产生列表的表达式来返回列表的

Scheme需要记住的关键是所有函数都会返回一些东西,而这些东西只是计算表达式的结果。Scheme函数的主体是一个表达式。

您可能会发现这很有用:。它在很大程度上并不是技术性的,可以回答很多类似的问题。这对于理解Scheme程序是如何由Scheme中最常见的数据结构构成的非常有用的指南。
(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)
(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