gpt4 book ai didi

lisp - 我应该什么时候声明函数返回类型?

转载 作者:太空宇宙 更新时间:2023-11-03 18:48:14 25 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .


8年前关闭。







Improve this question




我对应该在 common lisp 中声明函数返回类型的位置和频率感到困惑。如果我理解正确,使用声明提供的信息不需要实现,并且在使用信息时,效果没有很好的定义,并且在不同的实现之间可能不一致,所以这更多的是最佳实践问题而不是正式定义 .如果您尝试回答这些问题,请记住这一点。基本上,这就是我想知道的:假设我的目标是最大效率( (optimize (debug 0) (safety 0) speed) ),何时提供函数返回类型声明,原则上 ,编译器可用于优化的有用信息?这是一个宽泛的问题,我会给出宽泛的答案;但为了更好地了解我的目标,让我将其分解为几个具体问题。给定以下定义:

(defun foo (a)
(the <type> <form>))

(defun bar (a)
(foo a))

(defun baz (a)
(bar a))

一个。编译器能否优化对 BAZ 的调用? , 或者应该返回 BAR 中的表格和 BAZ被包裹在一个(看似多余的) THEFOO 中的形式?换句话说,编译器会知道处理 (bar <form>)吗?如 (the <type> (bar <form>))没有我说得这么明确?

湾。三个定义的相对顺序会影响 (a) 的答案吗?

C。如果上述定义出现在三个单独的源文件中,这些源文件被编译成三个单独的 fasl 文件,那将如何改变 (a) 的答案?

d。鉴于以下情况:
(let ((var1 (foo <form1>))
(var2 (bar <form2>))
(var3 (baz <form3>)))
<form>*)

编译器能否/将正确推断(绑定(bind)到的对象)的类型 VAR1 , VAR2 , 和 VAR3LET 的正文中没有明确的类型声明,或者我应该添加另一个 DECLARE绑定(bind)后立即形成?

e.假设 LET来自问题 (d) 的文件不是定义三个函数的文件,以下声明将产生什么影响:
(declaim (ftype (function (t) <type>) foo bar baz))

在文件的顶部有关于 (d) 的答案?

最佳答案

要回答标题中的问题,当您希望人类读者知道某些值具有某些类型时,您应该使用声明。
过早的优化是对程序员时间和机器周期的浪费。

现在,您的具体 list :

一个。你有什么样的优化?编译器会知道返回值的类型,但是它将如何使用这些知识在很大程度上取决于实现。

公元前。很可能是的。否则必须在编译前加载文件或重新编译bar在它看到 foo 之后.

d。大概是。

e.如果编译器知道函数 foo &c 在编译 let 时形式,它应该能够使用该知识。如果定义函数的文件尚未加载,则需要声明。但是请注意,如果您对编译器撒谎,您可能会遇到非常严重的麻烦(例如,段错误)。

关于lisp - 我应该什么时候声明函数返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19283732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com