我目前正在阅读这本书" 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)
我没有收到错误,但是如果我住在'()那么我会得到一个错误。这是为什么?有基于语言语法的解释还是一个错误?
答案 0 :(得分:1)
(define in-class '(alexander graham campana))
创建符号列表,而不是 student 的实例。它相当于
(define in-class (list 'alexander 'graham 'campana))
答案 1 :(得分:1)
'x
之类的前面的单引号字符是引号特殊形式(quote x)
的参数的缩写。这是所有lisp方言需要区分代码和数据的基本语法,自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
的正确列表,graham
,campana
和(list alexander graham campana)
。这些符号中没有一个与变量有关,因为它们都是关于符号的,而且你用这个确切名称定义变量的事实只是巧合。
当您使用list
#<procedure:list>
变为alexander
时,如果将graham
,campana
和(list alexander graham campana) ; ==> (#<student> #<student> #<student>)
'(alexander graham campana) ; ==> (alexander graham campana)
作为变量进行评估,那么这是一个过程成为他们的学生对象,结果是那些列表。试试吧:
{{1}}