Scheme如何创建列表

时间:2010-03-30 00:50:02

标签: list scheme

好吧这可能听起来像一个荒谬的问题,但你如何在计划中返回一个列表。?

3 个答案:

答案 0 :(得分:19)

在看到你的其他一些问题的基础上,我认为你可能无法将你的头脑包含在一个功能语言(如Scheme)的核心概念中。

在你正在学习Scheme(新手)的级别,你编写的每个函数都有一个输入和一个输出,每个函数的主体都是一个表达式。表达式求值的值是由函数返回的。没有必要像在Java或C等命令式语言中那样明确地“返回”任何内容;它恰好是评估表达式的直接后果。

函数体是单个表达式。它不像Java那样方法的主体由一系列指令组成:

do this
then do that
then do something else
then return something (maybe)

Scheme函数计算单个表达式;而已。这是一个简单的函数,它将5作为参数传递给任何数字:

(define (add5 x)
  (+ x 5))

函数的主体是(+ x 5),它只是一个要评估的表达式。插入了x的值,+(添加)函数应用于x和5,并返回结果。

列表没有太大区别。您只需要一个构造列表的表达式。已经提到了两个:如果您已经拥有所有元素, list 用于从头开始构建列表; 缺点用于将单个元素添加到现有列表中,并且通常以递归方式使用。

这是一个使用数字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函数为数字列表(lon)的每个元素添加5:

(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函数的主体是单个表达式。

答案 1 :(得分:9)

您可能只想:'(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)

答案 2 :(得分:4)

另一种不太知名的方法:

> ((lambda x x) 2 3 5 7 11)
(2 3 5 7 11)

也就是说,“list”函数本身可以定义为:

> (define list (lambda x x))