Language agnostic 当速记列表和方法签名重写可用时,用于变量args语法

Language agnostic 当速记列表和方法签名重写可用时,用于变量args语法,language-agnostic,programming-languages,language-design,Language Agnostic,Programming Languages,Language Design,对于具有简单的列表速记语法的语言,例如 x = [1,2,3]; 以及用不同的签名重载函数的能力 变量参数语法在函数中是否有任何用途,而不是通过列表清楚地完成?例如,varargs的一个常见用法是printf type语句: printf("This is %s while this is a number %d\n", "a string", 10); 但是,您可以使用以下工具轻松、清晰地执行上述操作: printf("This is %s while this is a number %

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

x = [1,2,3];
以及用不同的签名重载函数的能力

变量参数语法在函数中是否有任何用途,而不是通过列表清楚地完成?例如,varargs的一个常见用法是printf type语句:

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
块。但是,这可以通过使用
if
作为单个命令将
elseif
分解为
else
来避免


因此,如果没有具体的varargs语法,是否有某些类型的事情(干净/清晰地)是无法完成的?

对于if/elseif/else问题,在类似LISP的语言中存在了一个解决方案,大约50年了——请查找COND

(COND
    (condition1 value1)
    (condition2 value2)
    (condition3 value3)
    (T default))

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

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

我是基于纯粹的轶事经验,在一个专有的游戏脚本语言中拥有这两个特性,以及用户观察到的学习曲线和常见错误。[用户范围从刚从学校毕业到在不同游戏公司从事数个多年项目的行业老手-最大的有160名团队成员(20名核心脚本用户+50名左右脚本实时“命令行”用户)有些是纯粹的脚本编写者,只知道这一脚本语言或其他一些,有些也是专家C++程序员——两组在这个问题上似乎都有相同的结果。 [如果相关-我所基于的语言也有类型化变量参数,并且所有类型都有一个公共基类。]

多年来,我创建了许多相同的双重方法,尽管一个使用可变长度参数,另一个使用列表。在内部,两种具有不同接口的方法可以归结为相同的代码——它们只是在风格上的语法差异

在“wild”中,我发现了一种机制,它使用了一个包含两个额外字符的速记列表,这意味着还有两个字符可以忘记。我是根据调用我“帮助”那些在基于列表的方法版本(而不是变量参数方法)中遇到问题的用户的次数来计算的

至于直观性,我对方法做了一些分析/计算,使用可变长度方法的实例数量远远超过了列表方法。此外,当被问及人们似乎更喜欢可变的arg版本

然而,我仍然相信,使用基于列表的方法是非常有用的,尤其是在进行更复杂的调用和元编程时,因为将一组参数视为一个单元非常方便,并且可以在参数上使用常见的列表函数-交集、并集、筛选等

我非常相信只添加必要的功能,以减少给定程序员在任何时候需要记住的数量,尽管多年来我发现,如果某个功能更易于使用或导致的错误更少,则有时可以对该规则进行有效的例外。[我早期编写的一种脚本语言非常精简——在我看来也是优雅的——尽管我通过艰苦的努力了解到,人们更喜欢它,而且一旦我以直觉和减少错误的名义将它发展为具有更多的“冗余”时,问题就更少了。]

显然,不同的语言、不同的功能和不同的用户、不同的域可能会有不同的结果——尽管根据我观察的时间长短,我对它的价值相当有信心

[同时]

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

如果变量arg参数可以指定比速记列表更高或更高的内容(反之亦然),即参数是通过引用传递的,而不是通过值传递的,参数是使用某种延迟求值或调用求值等,那么可以使用一种或另一种语法来做更多的事情


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

请注意,printf的参数列表由不同类型的元素组成。因此,在静态类型语言中,如果类型系统不支持异构列表,则此解决方案是不可能的。@nponeccop:严格来说,如果所有对象都继承自基类型,则它们也可以被强制转换,则不是真的。在本上下文中不是这样。要求函数的所有参数实现同一接口不是一个好主意。具有可变参数的函数与接受列表的函数的不同之处在于,它们可以像函数的作者所希望的那样具有异构性。您能否给出一个允许可变异构参数并在编译时检查其类型的语言示例?Haskell似乎对此有一定的支持:并且有很多研究虽然我一直热衷于使用COND语法来更具可读性地表示长if/elseif链,但它并不能真正解决varargs p