Questions tagged «language-design»

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

17
为什么引用在C ++中不可重定位
C ++引用具有两个属性: 他们总是指向同一个对象。 它们不能为0。 指针相反: 它们可以指向不同的对象。 它们可以是0。 为什么在C ++中没有“不可为空的,可重定位的引用或指针”?我想不出为什么引用不可重新引用的充分理由。 编辑: 问题经常出现,因为当我要确保“关联”(在这里避免使用“引用”或“指针”一词)永远不会无效时,我通常会使用引用。 我认为我从来没有想过“太棒了,这个引用总是指向同一个对象”。如果引用是可重新定位的,则仍然可以得到如下所示的当前行为: int i = 3; int& const j = i; 这已经是合法的C ++,但毫无意义。 我这样重申我的问题: “'引用是对象'设计的背后原理是什么?为什么认为引用始终是同一对象而不是仅在声明为const时有用?” 干杯,菲利克斯

18
C宏有什么用?
我已经写了一些C语言,而且我读得足够好,可以大致了解它的功能,但是每次遇到宏时,它都会使我完全失望。我最终不得不记住宏是什么,并在阅读时将其替换在脑海中。我遇到的那些直观易懂的东西总是像小的迷你函数,所以我一直想知道为什么它们不只是函数。 我可以理解需要在预处理器中为调试或跨平台构建定义不同的构建类型,但是定义任意替换的功能似乎仅对使本来就很难理解的语言有用。 为什么为C引入了如此复杂的预处理器?还有没有人有使用它的示例,这会让我理解为什么#debug样式的条件编译时,为什么它似乎仍然用于简单的目的以外的用途? 编辑: 阅读了许多答案后,我仍然听不懂。最常见的答案是内联代码。如果inline关键字不这样做,则它有充分的理由不这样做,或者实现需要修复。我不明白为什么需要一种完全不同的机制来表示“真正内联此代码”(除了在内联之前编写的代码)。我也不理解提到的想法,即“如果它太愚蠢而无法放入函数中”。当然,任何需要输入并产生输出的代码都最好放在函数中。我想我可能不明白,因为我不习惯于编写C的微观优化,但是预处理器感觉就像是解决一些简单问题的复杂解决方案。

8
为什么Ruby具有TrueClass和FalseClass而不是单个布尔类?
当我发现这个值时,我正在对值进行序列化。Ruby有一个TrueClass类和一个FalseClass类,但是没有Boolean类。我想知道为什么会这样。 我看到使用的一些优势Boolean;例如,字符串解析可以集中在其上。 Ruby开发人员比我聪明,因此肯定有很多我看不见的充分理由。但是现在在我看来就像是用OneClass和一个TwoClass代替Fixnum。

2
Java编译器中“ let表达式”(LetExpr)的目的?
Java编译器似乎支持(查找)中的let表达式。com.sun.tools.javac.tree.*LetExpr JCTree中的一条评论甚至提到了一些语法 (let int x = 3; in x+2) 当然,哪种语言不会被该语言的语法接受,而在较早的编译器阶段会被拒绝。 我想知道这个构造的起源,这是我以前从未见过的。 它是在内部使用javac还是由其他工具综合使用?难道这仅仅是Java早期的一种人工产物,它是一种从未见过光的语言功能? 今天有什么可以用的吗? 一般来说,为什么存在?

7
为什么不将nullptr称为NULL?
在C ++ 11中,nullptr关键字被添加为类型更安全的空指针常量,因为先前的NULLas常见定义为0。 标准委员会为什么选择不调用新的空指针常量NULL,或者声明不NULL应该将其声明为#defined nullptr?

5
为什么F#的类型推断如此反复无常?
F#编译器似乎以(相当)严格的从上到下,从左到右的方式执行类型推断。这意味着您必须做一些事情,例如将所有定义放到使用之前,文件编译的顺序很重要,并且您往往需要重新整理内容(通过|>或通过您拥有的东西),以避免使用显式的类型注释。 使它更加灵活有多难,并且计划在F#的未来版本中使用它吗?显然,这是可以做到的,因为Haskell(例如)在推理能力相当强的情况下没有这种限制。导致此问题的F#的设计或意识形态与生俱来有什么不同?
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.