我想缩短以下类型的lambdas:
[] (SomeVeryLongTemplateType<int, float, char, std::string>, AnotherLongType) {};
Run Code Online (Sandbox Code Playgroud)
因为这个lambda的唯一原因是初始化一些类std::function<...>成员 - 它不捕获任何东西,它没有参数名称,它什么都不返回,它什么都不做.
如果缩短操作表示为签名中参数数量的函数,那么我希望此函数具有复杂度O(1).
有没有办法做到这一点?
在McBride和Paterson的"有效的应用程序设计"中,他们介绍了一些可爱的语法糖来提升纯粹的功能:
[| f x y z |]
Run Code Online (Sandbox Code Playgroud)
对于
f <$> x <*> y <*> z
Run Code Online (Sandbox Code Playgroud)
我记得别人的地方使用li f w x y z il或il f v w x y z li,我想/希望,也许是因为它可以使用一些现有的语言功能和狡猾的定义来定义li和il.
我无法找到超越纸本的任何参考,并假设[|并|]不太可能在GHC任何时间很快转起来,是有可能实现li并il不知何故?我不能为他们想出一个合理的类型,所以我假设我需要模板Haskell或类似,但不知道几乎足以实现这一点.[af| f x y ]没关系,但我不知道在我开始尝试它之前是否可能,如果确实需要帮助.
只是想整理一个程序,并想知道是否有人可以在同一行上多次调用一个队列上的成员函数给我一些语法糖.
例如,更改:
queue<int> q;
q.push(0);
q.push(1);
Run Code Online (Sandbox Code Playgroud)
类似于:
q.(push(0), push(1));
//or
q.push(0).push(1);
Run Code Online (Sandbox Code Playgroud)
我知道它看起来有点荒谬,并不实用.但是,如果我想缩短这样的一小部分代码,是否可以选择这样做?从我到目前为止所读到的内容来看,只有在函数具有非void返回值时才能链接方法.
当然,这是一个选项:
q.push(0); q.push(1);
Run Code Online (Sandbox Code Playgroud)
但我试图避免在q那里两次.再次......语法糖:)
这里的目标不是初始化,而是压缩对象/容器在代码块中生成的次数.我引用队列的原因是因为它是动态的.
c++ member-functions syntactic-sugar function-calls method-chaining
这两个结构是否相同?
char[] arr = new char[5];
for (char x : arr) {
// code goes here
}
Run Code Online (Sandbox Code Playgroud)
相比:
char[] arr = new char[5];
for (int i = 0; i < arr.length; i++) {
char x = arr[i];
// code goes here
}
Run Code Online (Sandbox Code Playgroud)
也就是说,如果我在两个循环的主体中放置完全相同的代码(并且它们编译),它们的行为是否完全相同?
完全免责声明:这是受另一个问题的启发(Java:这两个代码是相同的).我的答案结果不是答案,但我觉得Java for-each的确切语义有一些细微差别需要指出.
嗯,问题是自我解释.假设我想实现一些特殊的语法只是为了好玩.可能吗?我应该使用什么工具?
Scala是否有任何语法糖来替换以下代码:
val thread = new Thread(new Runnable {
def run() {
println("hello world")
}
})
Run Code Online (Sandbox Code Playgroud)
更喜欢的东西:
val thread = new Thread(() => println("hello world"))
Run Code Online (Sandbox Code Playgroud)
在特征/接口只需要实现一种方法的情况下?如果没有,将来是否有机会在Scala中使用此功能?当处理Java类时,它特别有用.
我在三年前发现了类似的问题:通常使用Scala闭包实现Java Single-Abstract-Method接口?答案说我们应该在Scala 2.10中使用该功能.我找了单一抽象方法关键字,但我没有找到任何东西.这个功能发生了什么?
JavaScript有一个很棒的功能,您可以使用一条简洁的线条从对象的属性中分配多个变量.它被称为解构赋值语法,它在ES6中添加.
// New object
var o = {p1:'foo', p2:'bar', p3: 'baz'};
// Destructure
var {p1, p2} = o;
// Use the variables...
console.log(p1.toUpperCase()); // FOO
console.log(p2.toUpperCase()); // BAR
Run Code Online (Sandbox Code Playgroud)
我想用C#做类似的事情.
// New anonymous object
var o = new {p1="foo", p2="bar", p3="baz"};
// Destructure (wrong syntax as of C#6)
var {p1, p2} = o;
// Use the variables...
Console.WriteLine(p1.ToUpper()); // FOO
Console.WriteLine(p2.ToUpper()); // BAR
Run Code Online (Sandbox Code Playgroud)
有没有在C#中执行此操作的语法?
python中的扩展切片语法已经向我解释为" a[n:m:k] returns every kth element from n to m".
这让我很清楚当k为正时会发生什么.但是我对如何解释a[n:m:k]负面k 感到迷茫.我知道这会a[::-1]颠倒一个,并且这a[::-k]需要反转a的第k个元素.
但这是对k正定义的概括呢?我想知道a[n:m:k]实际上是如何定义的,所以(例如)我可以理解为什么:
"abcd"[-1:0:-1] = "dcb"
Run Code Online (Sandbox Code Playgroud)
是否正在a[n:m:-k]逆转序列a,然后从m开始,在m之前从一个原始索引开始,然后结束一个?我不这么认为,因为这种模式不适合我尝试过的其他n和m值.但我无法弄清楚这是如何实际定义的,搜索让我无处可去.
实际上这些是两个相关的问题.
我知道C++ 11中有一种新的语法,用于for表单的基于范围的循环:
//v is some container
for (auto &i: v){
// Do something with i
}
Run Code Online (Sandbox Code Playgroud)
第一个问题:我怎样才能推断出我在这个循环中的迭代次数?(假设我想在位置j处填充值为j的向量).
第二个问题:我想知道是否还有其他方法来编写表单的循环
for (int i=0; i<100; i++) { ... }
Run Code Online (Sandbox Code Playgroud)
我发现这种编写方式有点麻烦,我经常这样做,我希望有一个更简洁的语法.一些事情:
for(i in [0..99]){ ... }
Run Code Online (Sandbox Code Playgroud)
会很好.
对于这两个问题,我希望避免使用其他库.
以下AWK格式:
/REGEX/ {Action}
Run Code Online (Sandbox Code Playgroud)
将Action在当前行匹配时执行REGEX.
有没有办法添加一个else子句,如果当前行与正则表达式不匹配将执行,而不使用if-then-else显式,如下所示:
/REGEX/ {Action-if-matches} {Action-if-does-not-match}
Run Code Online (Sandbox Code Playgroud)