Questions tagged «language-design»

与编程语言的任何方面的设计有关的问题的标记。

30
“最少惊讶”和可变默认参数
长时间修改Python的任何人都被以下问题咬伤(或弄成碎片): def foo(a=[]): a.append(5) return a Python新手希望此函数始终返回仅包含一个元素的列表[5]。结果是非常不同的,并且非常令人惊讶(对于新手而言): >>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5] >>> foo() 我的一位经理曾经第一次遇到此功能,并将其称为该语言的“巨大设计缺陷”。我回答说,这种行为有一个潜在的解释,如果您不了解内部原理,那确实是非常令人困惑和意外的。但是,我无法(对自己)回答以下问题:在函数定义而不是函数执行时绑定默认参数的原因是什么?我怀疑经验丰富的行为是否具有实际用途(谁真正在C中使用了静态变量,却没有滋生bug?) 编辑: 巴泽克举了一个有趣的例子。连同您的大多数评论,特别是Utaal的评论,我进一步阐述了: >>> def a(): ... print("a executed") ... return [] ... >>> >>> def b(x=a()): ... x.append(5) ... print(x) ... a …

16
Java为什么不支持unsigned ints?
Java为什么不包括对无符号整数的支持? 在我看来,这是一个奇怪的遗漏,因为它们允许人们编写不太可能在意外大的输入上产生溢出的代码。 此外,使用无符号整数可以是一种自我证明的形式,因为它们指示无符号int打算保留的值永远不会为负。 最后,在某些情况下,无符号整数对于某些操作(例如除法)可能更有效。 包括这些的不利之处是什么?

13
为什么我们必须在C#中同时定义==和!=?
C#编译器要求,每当自定义类型定义operator时==,它也必须定义!=(请参阅此处)。 为什么? 我很好奇,为什么设计师会认为这是必要的,为什么当仅存在另一个运算符时,编译器为什么不能默认其中一个运算符的合理实现。例如,Lua允许您仅定义相等运算符,而另一个则免费。C#可以通过要求您定义==或同时定义==和!=,然后将缺少的!=运算符自动编译为来执行相同的操作!(left == right)。 我知道有些情况下有些实体可能不相等或不相等(例如IEEE-754 NaN),但是在某些特殊情况下,这似乎是个例外,而不是规则。因此,这不能解释为什么C#编译器设计人员将例外作为规则。 我已经看到了定义平等运算符的工艺不佳的情况,然后不平等运算符是一个复制粘贴,每个比较都相反,每个&&切换为||。(您明白了……基本上!(a == b)通过De Morgan的规则扩展了)。与Lua的情况一样,编译器可以通过设计消除这种糟糕的做法。 注意:运算符<> <=> =也是如此。我无法想象需要用不自然的方式定义它们的情况。Lua允许您仅定义<和<=,并通过前者的否定自然定义> =和>。C#为什么不做同样的事情(至少是“默认”)? 编辑 显然,有充分的理由允许程序员执行他们喜欢的相等性和不平等性检查。一些答案指出了可能不错的情况。 但是,我的问题的核心是,为什么在C#中通常在逻辑上不必要时强制执行此操作? 这与.NET接口(如)的设计选择形成了鲜明的对比Object.Equals,IEquatable.Equals IEqualityComparer.Equals其中缺少NotEquals对应项表明该框架将!Equals()对象视为不相等,仅此而已。此外,类Dictionary和方法之类的类.Contains()仅取决于上述接口,即使定义了它们也不直接使用运算符。事实上,当ReSharper的生成平等部件,它定义两个==和!=来讲Equals(),甚至那么只有如果用户选择,以产生在所有运营商。框架不需要相等运算符来了解对象相等。 基本上,.NET框架不关心这些运算符,只关心几种Equals方法。要求用户同时定义==和!=运算符的决定完全与语言设计有关,而就.NET而言,与对象语义无关。

5
为什么Java 8接口方法中不允许“最终”?
Java 8最有用的功能之一是default接口上的新方法。引入它们的原因基本上有两个(可能还有其他原因): 提供实际的默认实现。例:Iterator.remove() 允许JDK API演进。例:Iterable.forEach() 从API设计人员的角度来看,我希望能够在接口方法上使用其他修饰符,例如final。在添加便捷方法时,这将很有用,以防止在实现类时“意外”覆盖: interface Sender { // Convenience method to send an empty message default final void send() { send(null); } // Implementations should only implement this method void send(String message); } 如果Sender已经上过课,以上是已经很普遍的做法: abstract class Sender { // Convenience method to send an empty message final void …



11
是什么阻碍了Ruby,Python获得Javascript V8速度?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 5年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 V8引擎是否有任何阻止优化实现(例如内联缓存)的Ruby / Python功能? Python由Google家伙共同开发,因此不应被软件专利所阻止。 还是这与Google投入V8项目的资源有关。


5
函数中的“ this”关键字如何工作?
我刚刚遇到了一个有趣的JavaScript情况。我有一个类,该类的方法使用对象文字表示法定义了多个对象。在这些对象内部,this正在使用指针。从程序的行为,我推断出this指针是指向在其上调用方法的类,而不是由文字创建的对象。 尽管这是我期望的工作方式,但这似乎是任意的。这是定义的行为吗?跨浏览器安全吗?是否有任何推理依据说明它超出了“规格说明”的范围(例如,这是某些更广泛的设计决策/理念的结果)吗?简化的代码示例: // inside class definition, itself an object literal, we have this function: onRender: function() { this.menuItems = this.menuItems.concat([ { text: 'Group by Module', rptletdiv: this }, { text: 'Group by Status', rptletdiv: this }]); // etc }

12
为什么Python没有符号功能?
我不明白为什么Python没有sign功能。它有一个abs内置的(我认为sign是姐姐),但是没有sign。 在python 2.6中甚至有一个copysign函数(在math中),但是没有符号。copysign(x,y)当您可以只写一个sign然后copysign直接从中获取时,为什么还要麻烦写一个abs(x) * sign(y)?后者会更清楚:x带有y的符号,而带copysign的您必须记住它是x带有y的符号还是y带有x的符号! 显然sign(x),除了cmp(x,0),它不提供任何其他功能,但是它也将更具可读性(对于像python这样的易读性语言,这将是一个很大的优势)。 如果我是python设计人员,那么我会反过来:没有cmp内置的,而是一个sign。当需要时cmp(x,y),您可以做一个sign(x-y)(或者,对于非数值的东西更好,只需x> y-当然,这应该要求sorted接受布尔值而不是整数比较器)。这也将更加清晰:正时x>y(而与cmp你必须记住公约正值当第一是大的,但它可能是周围的其他方法)。当然cmp,出于其他原因(例如,在对非数字事物进行排序时,或者如果您希望排序是稳定的,仅使用布尔值是不可能的),就有意义了 因此,问题是:为什么Python设计人员决定将sign函数保留在语言之外?为什么要麻烦copysign父母而不是父母sign? 我想念什么吗? 编辑-Peter Hansen评论后。足够公平,您没有使用它,但是您没有说您使用python做什么。在使用python的7年中,我无数次需要它,最后一个是打破骆驼背的稻草! 是的,您可以传递cmp,但是我传递它的90%的时间是成语,这样 lambda x,y: cmp(score(x),score(y))就可以很好地使用sign了。 最后,我希望您同意这sign会比有用copysign,所以即使我购买了您的视图,为什么还要在数学中定义它而不是符号呢?copysign如何比sign有用呢?

5
为什么数组不能分配给Iterable?
使用Java5,我们可以编写: Foo[] foos = ... for (Foo foo : foos) 或仅在for循环中使用Iterable。这非常方便。 但是,您不能像这样编写可迭代的通用方法: public void bar(Iterable<Foo> foos) { .. } 并使用数组调用它,因为它不是Iterable: Foo[] foos = { .. }; bar(foos); // compile time error 我想知道这个设计决定背后的原因。



3
为什么要声明(j ++);禁止的?
以下代码是错误的(请参阅ideone上的内容): public class Test { public static void Main() { int j = 5; (j++); // if we remove the "(" and ")" then this compiles fine. } } 错误CS0201:只能将赋值,调用,递增,递减,等待和新对象表达式用作语句 除去括号后,为什么代码会编译? 为什么不使用括号进行编译? 为什么C#是这样设计的?

13
当某人编写一种新的编程语言时,他们用什么来编写?
请原谅我的无知。我正在涉足PHP,并且全神贯注地浏览SO,并且不得不问一个我多年来一直想知道的问题: 当您编写全新的编程语言时,该用什么编写? 对于你们所有的程序员来说,这听起来都是很愚蠢的事情,对此我深表敬意,但这对我来说却是一件令人费解的事情。你是做什么?对自己说:今天我要发明一种新的语言!然后启动...记事本?所有的编译器是否都建立在以前存在的语言之上,以至于一劳永逸就可以将所有设计过的编程语言绘制到一棵巨大的分支树上,最终植根于……我不知道,有些古老了吗? 凭着我无能为力的智慧,我发现这很着迷...请教育我!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.