例如,为什么没有语言支持来检查vtable?为什么我不能用新的成员函数替换成员函数?我有一种直觉,认为有很多方法可以很好地利用这些功能.
有没有其他语言可以让我做这些事情?
我们可以使用像这样的功能
public static List<T> New<T>(params T[] items) {
return new List<T>(items);
}
Run Code Online (Sandbox Code Playgroud)
更重要的是它更好
var list = new List<int> {1,2,3};
var list = List.New(1,2,3);
Run Code Online (Sandbox Code Playgroud)
那么,当我们真的需要使用它时?
字典
public static Dictionary<T, K> New<T, K>(T key, K value) {
return new Dictionary<T,K>().FAdd(key, value);
}
var dict = new Dictionary<int, string>(){
{1, "a"},
{2, "b"}
};
var dict = Dict.New(1,"a").FAdd(2, "b");
Run Code Online (Sandbox Code Playgroud)
为什么它更好,键入推断
var x = new Dictionary<string, List<int>>(){
{"a", new List<int>{1}},
{"b", new List<int>{2}},
}
var x = Dict.New("a", List.New(1)).FAdd("b", List.New(2));
Run Code Online (Sandbox Code Playgroud) c# language-agnostic language-features programming-languages language-design
即:http://en.wikipedia.org/wiki/Wirth_syntax_notation
似乎大多数人使用BNF/EBNF ......
我正在用Python创建一种编程语言,而我基本语言中缺少的一个主要组件就是能够解析数学方程式.我有解析数学的函数,但我需要能够检查输入是否是数学方程式.我正在寻找匹配3*x ^(4*y)+ 1-(7*y*z/x)之类的正则表达式.
有时,我有一个控制结构(if,for,...),并且根据条件我要么使用控制结构,要么只执行主体.作为一个简单的例子,我可以在C中执行以下操作,但它非常难看:
#ifdef APPLY_FILTER
if (filter()) {
#endif
// do something
#ifdef APPLY_FILTER
}
#endif
Run Code Online (Sandbox Code Playgroud)
如果我在运行时只知道apply_filter,它也不起作用.当然,在这种情况下,我只需将代码更改为:
if (apply_filter && filter())
Run Code Online (Sandbox Code Playgroud)
但这在任意控制结构的一般情况下不起作用.(我手边没有一个很好的例子,但最近我有一些代码可以从这样的功能中获益很多.)
是否有任何语言我可以应用条件来控制结构,即具有更高阶的条件?在伪代码中,上面的例子是:
<if apply_filter>
if (filter()) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
或者更复杂的例子,如果一个varable在函数中设置了包装代码并将其作为一个线程启动:
<if (run_on_thread)>
void thread() {
<endif>
for (int i = 0; i < 10; i++) {
printf("%d\n", i);
sleep(1);
}
<if (run_on_thread)>
}
start_thread(&thread);
<endif>
Run Code Online (Sandbox Code Playgroud)
(实际上,在这个例子中,我可以想象为meta条件赋一个名称甚至是有用的,以确保顶部和底部s同步.)
我可以想象这样的东西是LISP中的一个功能,对吧?
我正在努力学习命令式和函数式语言之间的差异.
而且,我想了解闭包以及如何实现垃圾收集器.所以我决定尝试为函数式语言实现解释器.
由于我不熟悉函数式语言,因此我很难设计它.是否有一些关于简单函数语言的语法和语义的资源?有关如何执行此操作的教程将非常有用.
functional-programming language-design language-implementation
为什么在C#am中我需要指定我覆盖的方法的访问修饰符,如果我不更改它?在这种情况下,根本不指定任何访问修饰符会不会更简单,更合乎逻辑?
(只是为了澄清:我写这个问题并不是因为我认为我比语言设计师更聪明,但因为我确信他们有充分的理由让我无法理解.)
编辑:我不是在问我们为什么不能改变访问修饰符,而是为什么我们必须冗余地指定它.
有没有人知道是否有计划为类变量添加隐式getter和setter?
我正在考虑当前的Scala代码,它已经允许这样做了.类似下面的内容,如果你没有定义一个getter/setter它会使用该值,但是如果你为它使用的值定义一个getter/setter而不是一个直接变量调用.
class A{
int value = 3;
}
class B{
int value = 3;
public int value(){
return value;
}
}
// in some method
A a = new A();
System.out.println(a.value);
B b = new B();
System.out.println(b.value); // <-- no () for accessing value even though it uses the getter
Run Code Online (Sandbox Code Playgroud) 当我们编写时,synchronized(some_object){}我们可以看到两个JVM指令monitorenter/monitorexit作为字节代码发出.
当我们编写时,synchronized(some_object){some_object.wait()}我希望看到特殊的JVM指令wait,但是没有 - 而是wait/notify实现为本机C函数.
为什么会出现这种不一致(要么将它们全部作为JNI还是作为java字节代码)?是否存在特定(历史)原因或仅仅是品味问题?
上下文:我对此感兴趣,因为monitorenter/monitorexit/wait/notify在字节码中包含所有内容将允许"不处理JNI的JavaByteCode程序正确性验证程序"来验证不使用JNI的并发Java程序.目前,这种假设工具必须解决等待/通知.
我知道无法从静态上下文中引用非静态变量.我想知道为什么Java设计师做出了这个限制.
我已经检查了Stack Overflow,并且有很多类似的问题和答案,但我想知道确切的原因.
language-design ×10
java ×3
c# ×2
parsing ×2
bytecode ×1
c++ ×1
inheritance ×1
math ×1
overriding ×1
python ×1
regex ×1
scala ×1
static ×1
syntax ×1
vtable ×1