Questions tagged «language-design»

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

4
为什么Objective-C方法名称的最后一部分必须带一个参数(当有多个部分时)?
在Objective-C中,您不能在最后一个组件不带参数的地方声明方法名称。例如,以下内容是非法的。 -(void)take:(id)theMoney andRun; -(void)take:(id)yourMedicine andDontComplain; 为什么用Objective-C这样设计?仅仅是Smalltalk的产物,没有人看到有需要摆脱的必要吗? 此限制在Smalltalk中是有意义的,因为Smalltalk在消息调用周围没有定界符,因此最终组件将被解释为最后一个参数的一元消息。例如,BillyAndBobby take:'$100' andRun将解析为BillyAndBobby take:('$100' andRun)。在Objective-C中,这不需要括号,这无关紧要。 支持无参数选择器组件不会像用程序员选择的方法名称(例如,runWith:而不是语言)那样以所有常用的语言度量方法给我们带来很多好处。take:andRun)不会影响程序的功能语义,也不会影响语言的表现力。确实,具有无参数组件的程序与没有该组件的程序等效。因此,我对不需要此功能的答案不感兴趣(除非这是Objective-C设计师的陈述原因;是否有人偶然知道Brad Cox或Tom Love?他们在这里吗?)或那句话如何编写方法名称,以便不需要该功能。主要的好处是可读性和可写性(这与可读性一样,只是...您知道),因为这意味着您可以编写与自然语言句子更加相似的方法名称。这样的人-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication(马特·加拉格尔指出的“可可的爱”-(BOOL)application:(NSApplication*)theApplication shouldTerminateAfterLastWindowClosed,因此将参数直接放在适当名词的旁边。 苹果的Objective-C运行时(例如)完全能够处理这类选择器,那么为什么不编译呢?为什么不同时在方法名称中支持它们呢? #import <Foundation/Foundation.h> #import <objc/runtime.h> @interface Potrzebie : NSObject -(void)take:(id)thing; @end @implementation Potrzebie +(void)initialize { SEL take_andRun = NSSelectorFromString(@"take:andRun"); IMP take_ = class_getMethodImplementation(self, @selector(take:)); if (take_) { if (NO == class_addMethod(self, take_andRun, take_, "@@:@")) { …

7
Haskell的严格点是什么?
我们都知道(或应该知道)Haskell默认是懒惰的。在必须评估之前,不会评估任何内容。那么什么时候必须对某些东西进行评估?在某些方面,Haskell必须严格。我称这些为“严格点”,尽管这个特定术语没有我想象的那么广泛。据我说: Haskell中的减少(或评估) 仅在严格点进行。 所以,问题是:什么,准确地说,是Haskell的严格点?我的直觉说main,seq/爆炸模式,模式匹配以及IO通过执行的任何操作main都是主要的严格要求,但是我真的不知道为什么知道这一点。 (另外,如果他们不叫“严点”,什么是他们叫什么名字?) 我想一个很好的答案将包括有关WHNF的一些讨论。我也想像它可能会影响lambda演算。 编辑:关于此问题的其他想法。 正如我对这个问题的思考一样,我认为在严格性点的定义中添加一些内容会更加清晰。严格点可以具有变化的上下文和变化的深度(或严格性)。回到我的定义“ Haskell的减少仅在严格性点发生”,让我们在该定义中添加以下条款:“严格性点仅在评估或减少其周围上下文时触发。” 因此,让我尝试让您开始我想要的答案。main是严格的一点。它被专门指定为上下文的主要严格要点:程序。在main评估程序(的上下文)时,将激活main的严格点。Main的深度最大:必须对其进行充分评估。Main通常由IO操作组成,这些操作也是严格意义上的要点,其上下文是main。 现在您尝试:seq用这些术语讨论和模式匹配。解释功能应用的细微差别:它有多严格?怎么不行 那deepseq呢 let和case陈述?unsafePerformIO?Debug.Trace?顶级定义?严格的数据类型?爆炸图案?等等,仅用seq或模式匹配就可以描述其中的多少项?

9
为什么设计一种具有独特匿名类型的语言?
作为C ++ lambda表达式的功能,这一直困扰着我:C ++ lambda表达式的类型是唯一且匿名的,我根本无法写下来。即使我创建了两个在语法上完全相同的lambda,也将结果类型定义为不同的。结果是:a)lambda只可以传递到允许编译时传递的模板函数,不可言传的类型与对象一起传递,以及b)lambda仅在通过类型擦除它们之后才有用std::function<>。 好的,但这只是C ++的工作方式,我准备将其编写为该语言的令人讨厌的功能。但是,我只是了解到Rust似乎也做同样的事情:每个Rust函数或lambda都有一个唯一的匿名类型。现在我在想:为什么? 因此,我的问题是:从语言设计者的角度来看,将唯一的匿名类型的概念引入语言的优势是 什么?

4
为什么功能模板不能部分专业化?
我知道语言规范禁止 对功能模板进行部分专业化。 我想知道为什么它禁止这样做的理由?它们没有用吗? template<typename T, typename U> void f() {} //allowed! template<> void f<int, char>() {} //allowed! template<typename T> void f<char, T>() {} //not allowed! template<typename T> void f<T, int>() {} //not allowed!

7
无法在“对象”类的实例上设置属性
因此,我在回答这个问题的同时玩弄Python ,发现这是无效的: o = object() o.attr = 'hello' 由于AttributeError: 'object' object has no attribute 'attr'。但是,对于从对象继承的任何类,它都是有效的: class Sub(object): pass s = Sub() s.attr = 'hello' 打印s.attr将按预期显示“ hello”。为什么会这样呢?在Python语言规范中,有什么规定不能将属性分配给香草对象?



8
Java为什么会有“无法到达的语句”编译器错误?
我经常在调试程序时发现在代码块内插入return语句很方便(尽管可能是不好的做法)。我可能会在Java中尝试类似的方法。 class Test { public static void main(String args[]) { System.out.println("hello world"); return; System.out.println("i think this line might cause a problem"); } } 当然,这会产生编译器错误。 Test.java:7:无法访问的语句 我能理解为什么警告是合理的,因为有未使用的代码是不好的做法。但是我不明白为什么这需要产生一个错误。 这只是Java试图成为一个保姆,还是有充分的理由使它成为编译器错误?


4
Java为什么您的switch语句数据类型不能很长?
这是Sun的Java教程的摘录: 一种开关用的工作原理byte,short,char,和int原始数据类型。它还与枚举类型(在类和继承讨论)和少数特殊类作品是“包装”某些基本类型:Character,Byte,Short,和Integer(在简单的数据对象讨论)。 一定有充分的理由为什么long不允许原始数据类型。有人知道这是什么吗?

3
默认情况下,php函数返回什么?
如果我没有明确返回任何内容,那么php函数到底返回什么? function foo() {} 什么类型的 它有什么价值? 如何使用===进行准确测试? 这是否从php4更改为php5? 有没有之间的差异function foo() {}和function foo() { return; } (我不是在问如何测试它if (foo() !=0) ...)

5
Python:__builtin__和__builtins__有什么区别?
我今天在编码,发现了一些东西。如果我打开一个新的解释器会话(IDLE)并检查该dir函数定义的内容,则会得到以下信息: $ python >>> dir() ['__builtins__', '__doc__', '__name__', '__package__'] >>> dir(__builtins__) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', …

1
哪些类别不能被子类别化?
是否有关于哪些内置库和标准库类不可归类(“最终”)的规则? 从Python 3.3开始,以下是一些示例: bool function operator.itemgetter slice 我发现了一个问题,涉及用C语言和纯Python实现“最终”类。 我想了解什么原因可以解释为什么首先选择一个班级是“最终的”。

5
为什么在有界通配符泛型中不能有多个接口?
我知道Java的泛型类型有各种各样的违反直觉的属性。特别是我不理解的一个,希望有人能向我解释。为类或接口指定类型参数时,可以对其进行绑定,以使其必须使用来实现多个接口public class Foo<T extends InterfaceA & InterfaceB>。但是,如果要实例化实际对象,则此方法不再起作用。List<? extends InterfaceA>很好,但是List<? extends InterfaceA & InterfaceB>无法编译。考虑以下完整代码段: import java.util.List; public class Test { static interface A { public int getSomething(); } static interface B { public int getSomethingElse(); } static class AandB implements A, B { public int getSomething() { return 1; } public …

3
为什么Java中没有子类可见性修饰符?
在不止一次的情况下,我发现自己希望获得Java中无法实现的可变可见性。我希望某些成员在他们自己的班级和任何子班级中可见,但对于包的其余部分或世界其他地方不可见。换句话说,我想要这样: Modifier Class Package Subclass World sub-class Y N Y N 但是,Java的设计师只给了我这个: Modifier Class Package Subclass World public Y Y Y Y protected Y Y Y N no modifier Y Y N N private Y N N N 我想要这样的典型情况是在创建抽象类时。有时我发现抽象的父母需要访问某些成员,但是具体的孩子也需要访问。我可以通过成为成员来给他们这种访问权限protected,但这在我真的不想要的时候打开了对包其余部分的访问权限。 为了完全清楚,我知道这样的修改是不是可以在Java中。我的问题是为什么Java中不包含这样的修饰符?在我看来,这比protected默认值或默认值更自然。仅仅是因为它的原因不够重要,还是与我未曾考虑过的可能的副作用更相关?

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.