Bub*_*a88 2 programming-languages pass-by-reference pass-by-name
这是一个重新开放的问题.
我寻找一种语言和支持平台,默认情况下语言可以通过引用传递或按名称传递语义.我知道历史有点,有Algol,Fortran,还有C++可以使它成为可能; 但是,基本上,我所寻找的是更现代的东西,并且提到的值传递方法是首选的并且默认情况下(隐式假设).
我问这个问题,因为在我看来,pass-by-ref/name的一些优点似乎很明显.例如,当它在独立代理中使用时,不需要(在某种程度上)值的值,并且在这种情况下性能不会降低很多.所以,我可以在例如富客户端应用程序或某些游戏风格或独立服务类应用程序中使用它.
对我来说,主要的优点是符号的身份与其当前值之间的明确分离.我的意思是,当没有复制复制时,您知道您正在使用您查询/接收的确切符号/路径.并且内在的拳击值不会干扰程序的实际逻辑.
我知道有C#ref关键字,但它不是那么内向,虽然可以接受.同样地,我意识到传递引用语义几乎可以用任何语言模拟(Java作为一个例子)等等......不确定传递名称:)
你会建议什么 - 在适当的地方创建类似DSL的东西来满足这些需求; 或者使用我已经知道的一些语言?也许,有些东西我不见了?
谢谢!
更新:目前,我认为Haskell是合适的.但我没有多少调查,所以我想我稍后会更新这个文本.
Scala提供了非常灵活的参数传递语义,包括真正的 call-by-name:
def whileLoop(cond: => Boolean)(body: => Unit) {
if (cond) {
body
whileLoop(cond)(body)
}
}
Run Code Online (Sandbox Code Playgroud)
它确实有效
var i = 10
whileLoop (i > 0) {
println(i)
i -= 1
}
Run Code Online (Sandbox Code Playgroud)
技术细节:虽然所有参数都是按值传递的(并且这些参数通常都是引用),与Java非常相似,但符号=> Type将使Scala自动生成所需的闭包,以便模拟按名称调用.
请注意,也有懒惰的评估.
lazy val future = evalFunc()
有趣的是,你有一致的严格的值调用语义,但可以准确地改变你真正需要的地方 - 几乎没有任何句法开销.