在 C++ 中,运算符::用于访问命名空间或类中的类、函数和变量。
如果在访问对象的实例变量/方法时使用的语言规范.而不是::在那些情况下太像,那么这是否会导致可能不存在的歧义::?
鉴于 C++ 不允许变量名也是类型名,我想不出可能发生的情况。
澄清:我不是问为什么::被选中.,只是如果它也可以工作?
为什么编译器不会在交换机中的每个代码块之后自动放置break语句?这是出于历史原因吗?您何时需要执行多个代码块?
作为 C++ lambda 表达式的一个特性,这一直困扰着我:C++ lambda 表达式的类型是唯一且匿名的,我根本无法将其写下来。即使我创建了两个语法完全相同的 lambda,结果类型也被定义为不同的。结果是,a) lambdas 只能传递给模板函数,允许编译时,不可描述的类型与对象一起传递,b) lambdas 只有在通过std::function<>.
好的,但这只是 C++ 的方式,我准备将它写为该语言的一个令人讨厌的功能。然而,我刚刚了解到 Rust 似乎也做同样的事情:每个 Rust 函数或 lambda 都有一个唯一的匿名类型。现在我想知道:为什么?
所以,我的问题是:
从语言设计者的角度来看,将独特的匿名类型的概念引入语言有什么好处?
今天,当我随机阅读O'Reilly书中的JavaScript模式时,我发现了一件有趣的事情(第27页供参考).
在Javascript中,在某些情况下,如果大括号的起始位置不同,则会有所不同.
function test_function1() {
return
{
name: 'rajat'
};
}
var obj = test_function1();
alert(obj); //Shows "undefined"
Run Code Online (Sandbox Code Playgroud)
而
function test_function2() {
return {
name: 'rajat'
};
}
var obj = test_function2();
alert(obj); //Shows object
Run Code Online (Sandbox Code Playgroud)
有没有其他语言有这种行为?如果是这样,那么我肯定要改变我的习惯.. :)
我主要关注PHP,C,C++,Java和ruby.
javascript language-agnostic programming-languages language-design
如果我有一个vararg Java方法foo(Object ...arg)并且我打电话foo(null, null),我有两个arg[0]和arg[1]作为nulls.但如果我打电话foo(null),arg本身就是空的.为什么会这样?
我怎么称呼foo这样foo.length == 1 && foo[0] == null的true?
在Objective-C中,您不能声明最后一个组件不带参数的方法名称.例如,以下是非法的.
-(void)take:(id)theMoney andRun;
-(void)take:(id)yourMedicine andDontComplain;
Run Code Online (Sandbox Code Playgroud)
为什么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,从而将参数紧邻适当的名词.
Apple的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_, "@@:@")) {
NSLog(@"Couldn't add selector '%@' to class %s.",
NSStringFromSelector(take_andRun),
class_getName(self));
}
} else {
NSLog(@"Couldn't find method …Run Code Online (Sandbox Code Playgroud) 我们都知道(或应该知道)Haskell默认是懒惰的.在必须对其进行评估之前,不评估任何内容.那么什么时候必须评估一下?Haskell必须严格要点.我把这些称为"严格点",虽然这个术语并不像我想象的那么广泛.据我说:
Haskell中的减少(或评估)仅发生在严格点处.
所以,问题是:什么,准确地说,是Haskell的严格点?我的直觉说main,seq/爆炸模式,模式匹配以及IO通过执行的任何动作main都是主要的严格点,但我不知道为什么我知道这一点.
(另外,如果他们不叫"严点",什么是他们叫什么名字?)
我想一个好的答案将包括一些关于WHNF等的讨论.我也想象它可能触及lambda演算.
编辑:关于这个问题的其他想法.
正如我在这个问题上的反思,我认为在严格点的定义中添加一些东西会更清楚.严格点可以具有不同的上下文和不同的深度(或严格性).回到我的定义"Haskell的减少只发生在严格点",让我们在这个定义中添加这个子句:"只有在评估或减少周围环境时才会触发严格点."
所以,让我试着让你开始我想要的那种答案.main是严格的一点.它被特别指定为其上下文的主要严格点:程序.当main评估程序(的上下文)时,激活main的严格点.主要深度是最大的:必须进行全面评估.Main通常由IO动作组成,它们也是严格点,其背景是main.
现在你尝试:seq用这些术语讨论和模式匹配.解释功能应用的细微差别:它是如何严格的?怎么回事?怎么样deepseq?let和case陈述?unsafePerformIO?Debug.Trace?顶级定义?严格的数据类型?邦模式?等等.这些项目中有多少只能用seq或模式匹配来描述?
为什么友谊至少可以在C++中继承?由于显而易见的原因,我认为传递性和反身性是被禁止的(我说这只是为了避开简单的常见问题解答引用答案),但缺乏一些令virtual friend class Foo;我困惑的东西.有谁知道这个决定背后的历史背景?友谊真的只是一个有限的黑客,从那以后,它已经进入一些不起眼的可敬用途吗?
编辑澄清:我说的是以下场景,而不是 A的孩子接触B或B及其子女的情况.我还可以想象可以选择授予访问朋友功能等的覆盖的权限.
class A {
int x;
friend class B;
};
class B {
// OK as per friend declaration above.
void foo(A& a, int n) { a.x = n; }
};
class D : public B { /* can't get in A w/o 'friend class D' declaration. */ };
Run Code Online (Sandbox Code Playgroud)
接受的答案:正如Loki所说,通过在受限制的基类中创建受保护的代理函数,可以或多或少地模拟效果,因此不需要向类或虚方法层次结构授予友谊.我不喜欢需要样板代理(有条件的基础有效地成为),但我认为这被认为比大多数时候更容易被滥用的语言机制更可取.我想这可能是我购买和阅读Stroupstrup的C++的设计和演变的时候了,我已经看到这里有足够多的人推荐,以便更好地洞察这些类型的问题......
我在这里看到一些关于静态与动态类型的有趣讨论.我通常更喜欢静态类型,因为编译类型检查,更好的文档代码等.但是,我确实同意,如果像Java那样完成代码,它们会使代码混乱.
所以我即将开始构建自己的功能样式语言,类型推断是我想要实现的事情之一.我确实理解这是一个很大的主题,我并不是想创造一些以前没有做过的东西,只是基本的推理......
什么阅读的任何指针将帮助我这个?优选更实用/实用的东西,而不是更理论的范畴理论/类型理论文本.如果有一个实现讨论文本,使用数据结构/算法,那将是可爱的.
compiler-construction functional-programming type-inference language-design
快速问题:从设计的角度来看,为什么在C++中,没有母语所有的基类,通常object在其他语言中是什么?
language-design ×10
c++ ×4
java ×2
break ×1
case ×1
friend ×1
haskell ×1
inheritance ×1
javascript ×1
null ×1
objective-c ×1
rust ×1
selector ×1
strictness ×1
types ×1