Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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
Common lisp 公共Lisp不提供编译器警告_Common Lisp_Compiler Warnings - Fatal编程技术网

Common lisp 公共Lisp不提供编译器警告

Common lisp 公共Lisp不提供编译器警告,common-lisp,compiler-warnings,Common Lisp,Compiler Warnings,当我更改以下形式时,根据为函数()提供的示例 (the (values integer float) (truncate 3.2 2)) 到 我仍然没有收到任何编译器警告,而(整数1.2)给出 );编译器警告: ; 在位置0处的匿名lambda表单中:中违反了类型声明(整数1.2) 有人能解释一下为什么上面没有警告吗?我在CCL上测试这些。您误解了的功能。规范用这么多的话告诉您: 指定表单返回的值属于value type指定的类型。如果任何结果不是声明的类型,则结果是未定义的 (我的重点。

当我更改以下形式时,根据为
函数()提供的示例

(the (values integer float) (truncate 3.2 2))

我仍然没有收到任何编译器警告,而
(整数1.2)
给出

);编译器警告: ; 在位置0处的匿名lambda表单中:中违反了类型声明(整数1.2)


有人能解释一下为什么上面没有警告吗?我在CCL上测试这些。

您误解了
的功能。规范用这么多的话告诉您:

指定表单返回的值属于value type指定的类型。如果任何结果不是声明的类型,则结果是未定义的

(我的重点。)

换句话说,
the
所做的就是允许你对编译器说:“我保证这些东西有这些类型,你可以为此编译适当的代码,而不需要检查;如果这不是真的,那么我完全接受你可能需要点燃我的头发,挖出我剩下的一只眼睛

现在,著名的是,CMUCL及其衍生物(如SBCL)采用了一种完全不同的类型检查方法。从:

SBCL编译器处理类型声明的方式不同于大多数其他Lisp编译器。在默认编译策略下,编译器不会盲目相信类型声明,而是认为它们是关于应该检查的程序的断言:所有未被证明始终有效的类型声明都会在运行时断言

因此,系统将
视为关于类型的断言,如果还不知道该断言为真,则必须对其进行检查。我认为这是一致的,因为“未指明的后果”显然可以包括“以一种好的方式引发异常”(我个人更喜欢刺眼的编译器,但那只是我自己)


但是,如果您想编写可移植代码,就不应该假设
可以做到这一点。相反,你需要要么接受它没有承担的风险,要么使用某种形式,如
检查类型
断言
,并将类型检查作为你断言的内容。

你误解了
的作用。规范用这么多的话告诉您:

指定表单返回的值属于value type指定的类型。如果任何结果不是声明的类型,则结果是未定义的

(我的重点。)

换句话说,
the
所做的就是允许你对编译器说:“我保证这些东西有这些类型,你可以为此编译适当的代码,而不需要检查;如果这不是真的,那么我完全接受你可能需要点燃我的头发,挖出我剩下的一只眼睛

现在,著名的是,CMUCL及其衍生物(如SBCL)采用了一种完全不同的类型检查方法。从:

SBCL编译器处理类型声明的方式不同于大多数其他Lisp编译器。在默认编译策略下,编译器不会盲目相信类型声明,而是认为它们是关于应该检查的程序的断言:所有未被证明始终有效的类型声明都会在运行时断言

因此,系统将
视为关于类型的断言,如果还不知道该断言为真,则必须对其进行检查。我认为这是一致的,因为“未指明的后果”显然可以包括“以一种好的方式引发异常”(我个人更喜欢刺眼的编译器,但那只是我自己)


但是,如果您想编写可移植代码,就不应该假设
可以做到这一点。相反,您需要要么接受它没有的风险,要么使用某种形式,如
检查类型
断言
,并将类型检查作为您断言的内容。

我猜您必须设置安全优化值:
(declaim(优化(安全3)))
我用SBCL测试,有一个警告我想你必须设置安全优化值:
(declaim(optimize(safety 3))
我用SBCL测试,还有一个警告阅读CLHS中的下一段:允许表单产生不同于值类型指定数量的值,如果声明类型的值确实是这些类型的值。@学生:是的,但这与这里无关:
(truncate 3.2)
的类型根本不是
(values integer)
,而是
(values integer float)
的子类型。例如,如果您说了
(整数(truncate 3.2))
(浮点(truncate 3.2))
,那么您的示例将很重要,但您没有这样做。在任何情况下,系统都允许但不要求告诉您违规情况。请阅读CLHS中的下一段:允许表单生成不同于值类型指定的值,前提是声明类型的值确实属于这些类型。@Student:是,但这与此无关:
(truncate 3.2 2)
的类型根本不是
(values integer)
,而是
(values integer float)
的某些子类型。例如,如果您说了
(整数(truncate 3.2))
(浮点(truncate 3.2))
,那么您的示例将很重要,但您没有这样做。在所有情况下,系统都是允许的,但不要求告诉您违规情况。
(the (values integer integer) (truncate 3.2 2))