将'cond'改为特殊形式而不是语法糖会有什么样的优势?
保罗格雷厄姆写道:
例如,类型似乎是取之不尽的研究论文来源,尽管静态类型似乎排除了真正的宏 - 否则,在我看来,没有语言值得使用.
宏有什么大不了的?我没有花很多时间与他们在一起,但是从我使用过的旧版C/C++开始,他们似乎在模板/泛型存在之前主要用作黑客.
这很难想象
DECLARELIST(StrList, string);
StrList slist;
Run Code Online (Sandbox Code Playgroud)
在某种程度上比较好
List<String> slist;
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
然后有作为伪函数的用法,如MAKEPOINTS:
POINTS MAKEPOINTS(
DWORD dwValue
);
Run Code Online (Sandbox Code Playgroud)
为什么不将它定义为函数呢?这是一些优化,您可以避免代码重复,而不会增加另一个堆栈帧的开销吗?
然后还有涉及GOTO的棘手的控制流程,这似乎是值得怀疑的.
宏的优点是什么?它们的类型安全性较低(在C和C++中)(对吧?).没有他们,保罗格雷厄姆为什么不计划?
什么是[函数]参数?它们用于什么?
我最近开始学习Python; 我是编程的新手,我为这个基本问题道歉.
在每个Python教程中,我都会讨论参数.我已经找到了这个问题的答案,并找到了很多答案,但对我来说,这些答案有点难以理解.我可能只是缺少一些概念背景.
所以...当我定义一个函数时,括号中的东西用于什么?例:
def hi( This is the part that i dont get):
print 'hi'
Run Code Online (Sandbox Code Playgroud)
编辑:
与此相关的两个后续问题后来在这里被关闭和合并,因此部分答案的部分脱离背景特征.
后续问题是:[转述]
可能重复:
为什么数组不可扩展?
我开始学习Java,因为我的计算机科学学校的任务需要这种语言,我喜欢这门语言.但是,我已经看到Java数组不可扩展 - 也就是说 - 在使用它们之前必须声明它们的长度,并且它不能进一步更改.
我想知道为什么会这样?为什么Java语言设计者选择这样制作数组呢?我想这是出于性能问题,但我不确定.
提前谢谢大家.
将rvalue引用引入C++的典型原因是在评估复杂的C++表达式时消除(优化)多余的复制.
但是,C++ 98/C++ 03 有两种编译器优化技术,它们基本上用于相同的目的,即
有没有任何真实的用例,当上述技术(使用适当编写的代码)无法消除多余的复制,但右值引用可以成功吗?
本博客的最后一部分解释了以下内容:http://lostechies.com/jimmybogard/2010/05/18/caveats-of-c-4-0-optional-parameters/
但我仍然想知道为什么.
我最近遇到了Scala的默认参数.
在Scala中,被调用者为具有默认值的参数提供实际值.因此,不必重新编译所有调用者以使用更新的默认参数值.
如果Scala可以做到,我猜C#也可以做到.
所以为什么?他们为什么设计它容易出错?
编辑:
容易出错可能过于强烈,所以我的问题更像是这样:
为什么它的设计方式是默认参数的版本控制不会影响调用者?
c# scala language-design optional-parameters default-parameters
更新1
看起来我的英语非常糟糕,或者人们只是不吝啬...了解我的要求或只是看帖子的标题.
C#5规范明确规定:
由于支持字段不可访问,因此只能通过属性访问器读取和写入,即使在包含类型中也是如此.这意味着自动实现的只读或只写属性没有意义,并且是不允许的.
public string MyProperty {get;}没有任何意义,但编译器发出getter甚至没有对缺乏setter的争论也没有任何代价.备用字段将使用默认值进行初始化.这是什么意思?这意味着设计人员花了一些精力来实现验证,以引入可能遗漏的功能.
我们现在考虑C#6:
在C#6中,引入了自动实现属性的初始化.
public string FirstName { get; set; } = "Jane";
Run Code Online (Sandbox Code Playgroud)
要么
public string FirstName { get; } = "Jane";
Run Code Online (Sandbox Code Playgroud)
在后一种情况下,属性也可以在构造函数中设置:
public class Program
{
public string ImagePath { get; }
public static void Main()
{
}
public Program()
{
ImagePath = "";
}
}
Run Code Online (Sandbox Code Playgroud)
但只能在声明属性的类的构造函数中.派生类不能设置属性的值.
现在问问自己这个属性意味着什么,如果它没有在构造函数中初始化:
property string My {get;}
Run Code Online (Sandbox Code Playgroud)
这是C#5禁止财产的100%等价物.没有任何意义.
但是这种在C#5中无效的声明在C#6中变得有效.然而,语义根本没有改变:没有显式初始化,这个属性是无用的.
这就是我要问的原因:
为什么不在c#6中显式初始化readonly自动实现的属性?
我希望看到的答案是:
我发现答案It's by design完全无关紧要.这只是一个事实.我寻找原因.我不相信编译器设计者只需抛硬币就可以决定编译器行为的变化.
这是一个很好的答案的 …
在Rust中,您只能使用特征来指定类型限制,例如:<T: A + B>,A和B必须是traits,它们不能是i32或者是原始类型f64.
trait Foo {}
impl Foo for i32 {}
fn blah<T: i32>(val: T) {
// ^^^ works if this is Foo
println!("hello\n");
}
fn main() {
let toast: i32 = 33;
blah(toast);
}
Run Code Online (Sandbox Code Playgroud)
你可以通过实现原语的特征来解决这个问题,但为什么语言的设计者不会让你使用原语作为限制呢?
我知道问题看起来是广泛和主观的,但我对IronPython的这个定义无处不在 - " IronPython是Python编程语言的实现 "如果有任何SO帖子准确回答这个问题,请随意将其标记为重复.
到目前为止,我对此的理解是:
1)Iron python只是用C#编写的托管库(IronPython.dll)并使用CLR
2)Iron python托管代码在内部使用标准Python库(作为Iron Python的一部分安装)来使用DLR弥补差距.
这里的任何python代码的实际执行运行时间是多少?是Python解释器吗?这个解释器是否在不同的进程中运行?
3)IronPython.dll公开api以与任何其他.net语言集成python代码.
我确信某些地方我的理解是不正确的 - " IronPython是Python编程语言的一种实现 "因为从这看起来像Python语言是一种契约,它规定了你如何编写检查条件if condition和实现者如铁python照顾将其转换为IL代码.是这样的吗?
感谢任何帮助或指针.
c# python ironpython dynamic-language-runtime language-design