我是Scheme的初学者,所以如果对你来说这是一个非常基本的问题我会道歉。
我正在尝试创建一个列表的空列表,这些列表将在之后填充。实现这个的正确方法是使用对象,但我需要使用列表。
假设我们有一个大学系和学生。每个学生都有一些特定的字段,如姓名,gpa等。这些字段由用户确定,因此字段数量未知。最后,我们在数据库结构中有类似的东西:
创建一个表(table-name由用户作为参数给出)和列(再次由用户给出)。
从视觉上讲,列表列表应如下所示:table-name---name1---name2---name3---...
-----------------field11----field21---field31--....
-----------------field12----field22---field32--....
.......
创建列表后,我应该能够将记录插入其中。
答案 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))
作为返回值。您必须在此之后按照自己的意愿处理数据。