>我使用define
在方案中命名了一个列表。我试过了
(define aList (list 0 16 19))
(list-ref ‘(aList) 1)
但它说"错误:aList
不是一个函数"。为什么?请帮忙。
我们在 Scheme 中简单地使用它来引用名称。
(define aList (list 0 16 19))
(list-ref aList 1)
应该工作。
将名称括在括号中意味着将其值作为函数调用。列表(list 0 16 19)
不是一个函数。
引用'
通常会阻止这种情况,这会导致不同的错误消息(尝试(list-ref '(aList) 1)
),但您在那里使用了不同的字符‘
,这在 Scheme 中没有特殊含义。
顺便说一下,define
不是 Scheme 中的函数,而是一个宏(*)。函数甚至在开始工作之前就已经计算了它们的参数,但在这里我们要定义名称aList
从现在开始将引用的值。这意味着当调用整个define
"形式"(即括号表达式)时,它仍然没有价值,所以如果它是一个函数,这将导致循环性。
作为宏,define
可以引用名称本身,而不是名称的值。它定义它的值,而不是引用它(即它把值放在那里,而不是从那里获取它)。
(*)(现在,它可能不是一个宏,而是一个特殊的运算符,但从语言用户的角度来看,这是一回事;区别只是从实现者的角度来看)