引用方案中的列表时出错,使用"定义"函数命名



>我使用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可以引用名称本身,而不是名称的值。定义它的值,而不是引用它(即它把值放在那里,而不是那里获取它)。

(*)(现在,它可能不是一个宏,而是一个特殊的运算符,但从语言用户的角度来看,这是一回事;区别只是从实现者的角度来看)

最新更新