Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 使用pop Lisp时出现未定义的函数错误_List_Common Lisp - Fatal编程技术网

List 使用pop Lisp时出现未定义的函数错误

List 使用pop Lisp时出现未定义的函数错误,list,common-lisp,List,Common Lisp,测试lisp函数时,我在列表中硬编码。然后,使用pop时会产生以下错误: (pop '(1 2 3)) EVAL:1不是函数名;尝试改用符号 但是,使用汽车可以正常工作: (car'(1 2 3)) > 1 我假设这是因为pop需要一个变量,它可以将列表的其余部分重新存储到该变量中 如果是这样的话,当前的错误消息来自哪里?为什么它毫无帮助?它甚至没有提到pop是问题所在。预定义宏的参数不是列表值,而是一个,它是一种计算位置的形式(有关一般说明,请参阅)。例如: CL-USER>

测试lisp函数时,我在列表中硬编码。然后,使用
pop
时会产生以下错误:

(pop '(1 2 3))
EVAL:1不是函数名;尝试改用符号

但是,使用
汽车
可以正常工作:

(car'(1 2 3))
> 1
我假设这是因为
pop
需要一个变量,它可以将列表的其余部分重新存储到该变量中

如果是这样的话,当前的错误消息来自哪里?为什么它毫无帮助?它甚至没有提到
pop
是问题所在。

预定义宏的参数不是列表值,而是一个,它是一种计算位置的形式(有关一般说明,请参阅)。例如:

CL-USER> (let ((stack '(1 2 3)))
           (print (pop stack))
           (print stack)
           "Done!")    

1 
(2 3) 
"Done!"
由于错误消息的原因:
car
将列表作为参数,因此
'(1 2 3)
是一个引用形式,当求值时,生成列表
(1 2 3)
;最后,此列表的第一个元素
1
,由
car
返回。对于作为宏而非函数的
pop
,表单
(pop'(1 2 3))
有一个类似以下内容的扩展:

(LET* ((#:G10655 (1 2 3)) ...)
从中可以看到列表
(1 2 3)
已被计算,这将生成错误消息:

EVAL:1不是函数名;尝试改用符号

事实上,在该评估中,
(1 2 3)
被视为一种形式,系统试图将函数
1
应用于参数
2 3
,这是一个错误,因为
1
不是一个函数


当错误发生在宏扩展阶段之后时,带有宏的语言通常会出现无用消息:因此,使用工具(如
macroexpand
)非常有用,可以查看此阶段的结果,如
(macroexpand'(pop'(1 2 3)))
正如@jkiiski在注释中所建议的那样。

预定义的宏将作为参数而不是列表值,而是一个计算为某个位置的形式(有关一般说明,请参阅)。例如:

CL-USER> (let ((stack '(1 2 3)))
           (print (pop stack))
           (print stack)
           "Done!")    

1 
(2 3) 
"Done!"
由于错误消息的原因:
car
将列表作为参数,因此
'(1 2 3)
是一个引用形式,当求值时,生成列表
(1 2 3)
;最后,此列表的第一个元素
1
,由
car
返回。对于作为宏而非函数的
pop
,表单
(pop'(1 2 3))
有一个类似以下内容的扩展:

(LET* ((#:G10655 (1 2 3)) ...)
从中可以看到列表
(1 2 3)
已被计算,这将生成错误消息:

EVAL:1不是函数名;尝试改用符号

事实上,在该评估中,
(1 2 3)
被视为一种形式,系统试图将函数
1
应用于参数
2 3
,这是一个错误,因为
1
不是一个函数


当错误发生在宏扩展阶段之后时,带有宏的语言通常会出现无用的消息:因此,使用诸如
macroexpand
之类的工具可以查看此阶段的结果是非常有用的,如@jkiiski在评论中建议的
(macroexpand'(pop'(1 2 3))

参见
(macroexpand'(pop'(1 2 3))
。请参阅
(macroexpand'(pop'(1 2 3)))
。没有帮助的消息通常是缺乏验证和/或缺乏编写错误消息的努力(可能是由于个人时间限制、保持代码快速等原因)它与语言没有多大关系。例如,有很多验证和有用的消息。@acelent,我在SBCL中尝试了
(pop'(1 2 3))
,得到了一条我怀疑特别有用的消息:
;in:pop'(1 2 3);(1 2 3);;捕获错误:;非法函数调用;in:pop'(1 2 3);(FUNCALL#’(SETF QUOTE)#:NEW456#:G457)=>(SB-C::%FUNCALL#’(SETF QUOTE)#:NEW456#:G457);;捕获警告:;函数(SETF QUOTE)未定义,其名称由ANSI CL保留;因此,即使稍后定义,这样做的代码也不会可移植;编译单元已完成……未定义函数:;(SETF QUOTE)
…没有帮助的消息通常是缺乏验证和/或没有努力编写错误消息(可能是由于个人时间限制、保持代码快速等原因)。它与语言没有太多关系。例如,除了有用的消息外,还有很多验证。@acelent,我尝试了
(pop'(1 2 3))
在SBCL中得到了一条我怀疑特别有用的消息:
;in:POP'(1233);(1233);;捕获错误:;非法函数调用;in:POP'(1233);(FUNCALL#'(SETF QUOTE);(SETF QUOTE);(SETF QUOTE);==>(SB-C:%FUNCALL'(SETF QUOTE);(SETF QUOTE);:NEW456#:G457);(SETF QUOTE)捕获警告:;函数(SETF QUOTE)未定义,其名称由ANSI CL保留,因此,即使稍后定义,这样做的代码也不会是可移植的。;;编译单元已完成…未定义函数:;(SETF QUOTE)
。。。