在Smalltalk中是否可以选择声明临时变量?

在Smalltalk中是否可以选择声明临时变量?,smalltalk,Smalltalk,在编写使用临时变量的Smalltalk代码时,您可以编写如下内容: SequenceableCollection>>#swap: index1 with: index2 | temp | temp := self at: index1. self at: index1 put: (self at: index2). self at: index2 put: temp. 我发现声明临时表的语法有点过时和麻烦。实际上,这是一个你通常停止在你的领域中思考而

在编写使用临时变量的Smalltalk代码时,您可以编写如下内容:

SequenceableCollection>>#swap: index1 with: index2
    | temp |
    temp := self at: index1.
    self at: index1 put: (self at: index2).
    self at: index2 put: temp.
我发现声明临时表的语法有点过时和麻烦。实际上,这是一个你通常停止在你的领域中思考而专注于计算机的地方(你编写了你的方法,你准备好接受代码,但必须“清理”你的临时区域)。这让人分心

也许临时声明对性能有用?或者甚至是声明性——通过IDE调优(比如语法突出显示)可以改善声明性,但我认为
|temp
可以而且应该是可选的。编译器拥有所有需要的信息,或者如果用户没有提供临时声明(假设临时存在于更接近的环境中),编译器可以做出必要的假设


实施这种改变会有什么问题?

这是一种依赖方言的功能。在某些方言中,如果您不声明临时值,浏览器将在保存方法时为您执行此操作。就我个人而言,我发现这种行为比每次使用未知标识符时浏览器都会警告你的行为更方便,因为正如你所说的那样,这种行为可能会分散注意力。通过将临时性的定义推迟到你保存方法的时候,你不必“转移”你的思维;浏览器将完成详细信息。不“手动”声明临时变量的另一个优点是,您的方法不会最终声明未使用的临时变量

是否可以在中选择临时变量声明 闲聊

当然-编译器在编译时(即保存方法时)仍然知道哪些变量是哪些变量

实施这样的改变会有什么问题

主要的问题是,语法突出显示并没有涵盖所有可能出现问题的情况。。。含糊不清:

  • 当其他人查看您的代码时,如果他们熟悉Smalltalk,但不熟悉您当前的语法突出显示设置,会发生什么情况?请记住,您应该始终为未来的读者编写代码,而不仅仅是为您自己
  • 如果您在IDE之外查看代码(例如,在Seaside中开发时)并直接通过浏览器修改代码(仍然存在于IDE中),会发生什么情况
  • 当您将代码从IDE中取出时会发生什么情况,例如。
    • 在这里回答一个问题
    • 对于你的博客帖子
    • 在给同事的电子邮件中
    • 出口到另一种风格的Smalltalk
  • 如果在方法中使用“未声明的临时变量”后,向具有相同名称的类添加实例变量,会发生什么情况?编译器是否必须检查该类及其子类中的所有方法,并询问您指的是哪一个?(相反,删除正在使用的实例变量时会发生什么情况?)
TL;博士:找到一些“老式的”、“笨重的”或“突兀的”(我可能同意你的观点)并不能胜过清晰和消除歧义。


可以说,必须宣布临时官员是随领土而来的。此外,我不认为在接受方法之前快速“清理”它是一件坏事。

没有技术问题-从技术上来说,更改编译器是微不足道的

但这将是一场维护和调试的噩梦,正如其他人已经指出的那样:如果以后在外部作用域中添加了相同的命名变量(这可能是继承层次结构中的instvar),会发生什么?另外,如果您只是输入了一个拼写错误,而临时的不是您的意图,但是您实际上想要访问一些现有的变量,该怎么办

我已经编写了很长一段时间的程序(并且使用了自动变量定义的语言),所以我不希望这样。对于10个小的线性脚本来说可能是可以的,但对于那些需要长期维护的大型程序来说就不行了。正如Bert所指出的,工作区通常为您这样做,这很好,但不是在进入生产代码的方法中


我记得一个关于fortran程序崩溃的老故事,因为程序员编写了“do10i=10.20”而不是“do10i=10,20”,并将一个名为“do10i”的新变量分配给10.20而不是do循环。如果他必须先声明变量,他会被警告的(承认:fortran当时是一种丑陋的语言,但我想你明白我的意思)。

我知道IDE“帮助”你,但觉得它很突兀。临时声明似乎来自另一种语言,这让我想起了类型声明。实际上,编译器不需要声明。此外,如果您根本不声明temp,并且IDE也不强迫您这样做,那么您就不会最终声明为未使用temps@melkyades记住,Smalltalk有块闭包。这使得临时分配变得不那么容易,因为编译器必须识别哪些temp进入堆栈,哪些temp进入环境。由于块可以嵌套,所以这项工作比乍一看要简单得多。当然,所有这些都可以从程序员的角度隐藏起来。但是嘿!这与Smalltalk的精神背道而驰,在Smalltalk中,一切都是可见的,可以探索。所以,我不认为把这一切都掩盖起来有什么意义。我基本上同意@Leandro Caniglia的观点。我们一直使用自动声明。但是我们可以再多做一步,在方法浏览器中隐藏“主”局部变量声明。颜色仍然会告诉我们哪些变量是局部变量。那将是一个有趣的实验。@CarlosE.Ferro我明白你的意思。着色可以让传统的声明消失。也许你仍然希望保持块格式…当然@Amos M.Carpenter已经很好地揭示了在任何不是您常用代码浏览器的上下文中隐藏这些声明是多么烦人。我只会做一个在类或方法浏览器中隐藏它们的实验