language-agnostic - 当速记列表和方法签名覆盖可用时用于变量 args 语法

标签 language-agnostic programming-languages language-design

对于具有简单的列表速记语法的语言,例如

x = [1,2,3];

以及重载具有不同签名的函数的能力......

对于不能通过列表清楚地完成的函数,变量参数语法是否有任何用途?例如,可变参数的常见用途是用于 printf 类型语句:
printf("This is %s while this is a number %d\n", "a string", 10);

但是,您可以通过以下方式轻松清晰地执行上述操作:
printf("This is %s while this is a number %d\n", ["a string", 10]);

到目前为止,我唯一能想到的就是实现控制流结构,如 if/elseif/else。您希望能够在其中传递 elseif/else 的可变数字 block 。但是,可以通过中断 elseif 来避免这种情况。进入 elseif作为单个命令。

那么,如果没有明确的可变参数语法,是否有一些事情不能(干净/清楚地)完成?

最佳答案

即使速记列表可以达到相同的目的,也应该包含变量 args,因为它们增加了直观性并减少了错误。

[这是假设您同意语言功能的可接受“使用”是直观性和减少错误。]

我基于在专有游戏脚本语言中具有这两个功能的纯粹轶事经验以及观察到的学习曲线和用户犯的常见错误。 [用户范围从刚毕业的学生到行业资深人士,在不同的游戏公司从事了超过 15 年的多个多年项目——最大的团队成员有 160 人(20 个核心脚本用户 + 50 个左右的脚本实时“命令-line”用户)。有些是纯脚本编写者,只知道这种脚本语言或其他几种语言,有些也是专业的 C++ 程序员——两组似乎在这个问题上的结果相同。]

[如果它是相关的——我所基于的语言也有类型变量参数,并且所有类型都有一个公共(public)基类。]

多年来,我创建了许多相同的双重方法,尽管一种使用可变长度参数,另一种使用列表。在内部,具有不同接口(interface)的两种方法都将归结为相同的代码——它们只是在文体语法上有所不同。

在“狂野”中,我发现使用包含两个额外字符的速记列表的机制意味着只有两个字符可以被忘记。我根据我被要求“帮助”那些在使用基于列表的方法版本而不是可变参数方法时遇到问题的用户的次数来确定这一点。

至于直观性,我已经对方法进行了一些分析/计数,并且使用可变长度方法的实例数量大大超过了列表方法。此外,当被问及时,人们似乎在美学上更喜欢可变 arg 版本。

但是我仍然相信基于列表的方法有很大的实用性,特别是在进行更复杂的调用和元编程时,因为将一堆参数视为一个单元和常见的列表函数很方便 - 交集,联合,过滤,等也可以用在论点上。

我坚信只添加必要的功能以减少给定程序员在任何时候都需要记住的数量,尽管多年来我发现有时可以保证该规则的有效异常(exception),如果一个功能更容易使用或导致更少的错误。 [我写的早期脚本语言非常精简——在我看来也很优雅——尽管我学到了人们更喜欢它的艰难方式,并且一旦我以直观性和减少错误。]

显然,围绕这些功能具有不同元素的不同语言以及不同的用户和域可能会产生不同的结果——尽管根据我的观察时间,我对它的值(value)相当有信心。

[还有]

变量 args 和速记列表之间的另一个潜在的具体区别取决于语言是否可以指定如何将参数传递到方法/函数接口(interface)的变量 arg 方面与用作速记列表中的元素的参数/语句之间的差异。

如果变量 arg 参数可以指定超出可以为速记列表指定的内容(反之亦然) - 即参数通过引用而不是通过值传递,则参数将使用某种惰性评估或在调用时评估等——然后可以使用一种或另一种语法完成更多工作。

这实际上取决于语言,如果变量参数“组”或速记列表元素使用的参数可以以相同的方式“传递”,则没有区别。

关于language-agnostic - 当速记列表和方法签名覆盖可用时用于变量 args 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8123011/

相关文章:

python - 我怎样才能制作 "function dictionary"?

c++ - 为什么不允许指针的运算符重载工作?

algorithm - 查找数字中有多少位

data-structures - 八叉树邻居搜索

multithreading - 什么时候多线程不是一个好主意?

language-agnostic - 为什么要区分返回值的方法和不返回值的方法?

c++ - 哪些编程语言支持常量方法?

algorithm - 分隔出由 `(, ), ||, &&, |` 分隔的 unix 语句

java - 为什么 `ScalaObject`存在?

haskell - 为什么 Haskell 使用 -> 而不是 =?