列表创建混乱

时间:2014-06-14 10:07:56

标签: scheme racket

我目前正在阅读这本书" Racket"为了将我的编程研究扩展为基于Scheme的语言,并发现了创建列表的问题。 该书解释说,到目前为止,创建列表可以使用3种不同的功能:list,cons和'()。问题在于,当我应用创建结构列表时 '()方法我得到一个错误,当我使用list时它不会发生,这里是代码

#lang racket

;;sBasic structure program

;;create student struct
(struct student (name id# dormhall))

(define alexander (student "Alexander" 447 'Nopehall))
(define graham (student "Bellman" 2341 'Nopehallb))
(define campana (student "chompana" 1234 'Nadahalla))

(define in-class '(alexander graham campana))

(student-name (first in-class))

现在,问题在于如果我改变

的类内列表的定义
(define in-class '(alexander graham campana))

(define in-class (list alexander graham campana))

然后使用

调用in-class的第一个实例
(student-name (first in-class)

我没有收到错误,但是如果我住在'()那么我会得到一个错误。这是为什么?有基于语言语法的解释还是一个错误?

2 个答案:

答案 0 :(得分:1)

(define in-class '(alexander graham campana))

创建符号列表,而不是 student 的实例。它相当于

(define in-class (list 'alexander 'graham 'campana))

答案 1 :(得分:1)

'x之类的前面的单引号字符是引号特殊形式(quote x)的参数的缩写。这是所有方言需要区分代码和数据的基本语法,自1958年第一篇Lisp论文以来,它就已存在。

给定您定义的全局变量,例如。 alexander。如果您在交互窗口中编写alexander,则会获得#<student>作为输出,您可以使用(student-name alexander)访问其中的项目,但如果您评估'alexander,则会获得该符号alexander,尝试(student-name 'alexander)

时会遇到奇怪的错误

引用意味着参数(引用的内容)不变。您希望引用的结构与您看到的完全一致,如果'(list alexander graham campana)它不会变为(#<procedure:list> #<student> #<student> #<student>)(list alexander graham campana)list,这是一个带有符号alexander的正确列表,grahamcampana(list alexander graham campana)。这些符号中没有一个与变量有关,因为它们都是关于符号的,而且你用这个确切名称定义变量的事实只是巧合。

当您使用list #<procedure:list>变为alexander时,如果将grahamcampana(list alexander graham campana) ; ==> (#<student> #<student> #<student>) '(alexander graham campana) ; ==> (alexander graham campana) 作为变量进行评估,那么这是一个过程成为他们的学生对象,结果是那些列表。试试吧:

{{1}}