List 计划如何创建列表
好吧,这听起来可能是个荒谬的问题,但如何在scheme中返回列表呢?您可能只想: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)另一种不太为人所知的
(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