在scheme(racket)中创建列表的空列表

卡雷德克

我是Scheme的初学者,因此对您来说这是一个非常基本的问题,我深表歉意。

我正在尝试创建列表的空列表,然后将其填充。实现此目的的正确方法是使用对象,但我需要使用列表来实现。

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

创建一个带有列(再次由用户给定)的表(表名由用户给定)。

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

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

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

吉维特

只需定义一个变量:

(define student-list '())

因此,student-list是空列表。您可以添加任何想要的内容。假设您要添加一个学生。您可以将其添加到空白列表中:

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

您只是为学生列表分配了一个新值,该值是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-car!并设置CDR!。

如评论中所述,您不必设置nil元素列表,然后再完成它们。您只能有一个空变量,并在数据出现时用数据填充它。

编辑:与上面的代码,我在做一些副作用。但是您还有另一种方式:在Scheme中,所有东西都有返回值。在执行操作时(+ 1 2),您将获得3的返回值。因此,如果执行此操作(list (+ 1 2) (+ 1 4))则将有一个list '(3 5)因此,一个函数也有一个返回值。在上面的代码中,返回值为#void,原因设定了!没有返回值。但是,您可以直接返回所需的列表。为此,您只需删除设置!

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

因此,如果您正在执行操作(add-student-second '((name1)) (name2))则将获得((name2) (name1))返回值。之后,您只需要按需处理数据即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章