在方案(球拍)中创建一个空列表

时间:2014-05-09 18:45:37

标签: list scheme racket

我是Scheme的初学者,所以如果对你来说这是一个非常基本的问题我会道歉。

我正在尝试创建一个列表的空列表,这些列表将在之后填充。实现这个的正确方法是使用对象,但我需要使用列表。

假设我们有一个大学系和学生。每个学生都有一些特定的字段,如姓名,gpa等。这些字段由用户确定,因此字段数量未知。最后,我们在数据库结构中有类似的东西:

创建一个表(table-name由用户作为参数给出)和列(再次由用户给出)。

从视觉上讲,列表列表应如下所示:

table-name---name1---name2---name3---...
-----------------field11----field21---field31--....
-----------------field12----field22---field32--....
.......

创建列表后,我应该能够将记录插入其中。

1 个答案:

答案 0 :(得分:1)

只需定义一个变量:

(define student-list '())

所以student-list是空列表。您可以添加任何想要的内容。想象一下,你想要添加一个学生。您只需将其添加到空列表中即可:

(set! student-list (cons '(name phone-number etc) student-list))

您只需为学生列表分配一个新值,即列表的前一个值(空列表)和您想要的新列表。并且,使用相同的代码,您可以添加另一个学生。

在Scheme中,您不必直接确定字段数:list是动态结构。使用(list stg stg2),您可以创建一个'(stg stg2)的列表。但你有另一个运营商:缺点。此功能允许您向列表中添加内容:(cons 'stg3 (list stg stg2)),并获得列表'(stg3 stg stg2)。你添加了一个字段,你不必“声明”一个字段或类似的东西。它不像C中的固定数组。如果你有一个列表列表,每个列表可以有一个未定义的字段数。所以,例如。

(define student-list)
;;; This is your first empty list.

(define (add-student ids)
  (set! student-list (cons ids student-list)))
;;; ids is the list of name, etc. of student 
;;; you want to insert in the student-list.

此代码定义一个全局变量,并使用您为函数add-student提供的数据对其进行更改。这可以是任何事情。 '(name phone gpa)'(name gpa)等等。但是,如果您想将列表传递给函数((define (add-student students ids)),例如学生列出所有学生的列表,则不能使用set! 。你必须使用套车!和set-cdr!。

如评论中所述,您不必设置nil元素列表,并在之后完成它们。您可以只有一个空变量,并在数据到来时填充它。

编辑:使用上面的代码,我正在做一些副作用。但是你有另一种方式:在Scheme中,一切都有返回值。当您执行(+ 1 2)时,您的返回值为3.因此,如果您执行(list (+ 1 2) (+ 1 4)),则会有一个列表'(3 5)。所以函数也有返回值。在上面的代码中,返回值是#void,导致设置!没有返回值。但是,您可以直接返回所需的列表。要做到这一点,你可以删除集!。

(define (add-student-second students ids)
  (cons ids students))

因此,如果您正在执行(add-student-second '((name1)) (name2)),那么您将获得((name2) (name1))作为返回值。您必须在此之后按照自己的意愿处理数据。