VS2013为C++添加了自动格式化.我个人对自动格式化的看法是,它最终对开发人员有害,但我必须接受并非所有人都同意.我的错误是我似乎无法完全禁用自动格式化.我取消选中工具 - >文本编辑器 - > C/C++ - >格式化 - >常规下的每个复选框,但是当我输入时:
void f ()
Run Code Online (Sandbox Code Playgroud)
VS2013取而代之
void f()
Run Code Online (Sandbox Code Playgroud)
这不是这个特定项目的代码标准,这意味着我必须返回并插入一个空格.还有其他一些我必须与VS作斗争的例子.
我不想更改间距设置,因为
我只是希望VS不自动修改我的代码.
PS.我并不反对VS可以格式化代码,但我想手动调用它
对我来说,一个reoccuring宠物项目是在F#中实现基于推送的数据管道.推送管道比LINQ之类的拉管道更简单,更快(尽管它们没有拉管道的所有功能).
让我困惑一段时间的事情是,我似乎没有在C#中实现推送管道,这在F#中作为我的推送管道是有效的.我正在寻找有关如何使我的C#实现更接近F#的输入.
F#中的简单推送管道可以表示如下:
type Receiver<'T> = 'T -> unit
type Stream<'T> = Receiver<'T> -> unit
Run Code Online (Sandbox Code Playgroud)
在C#中我们可以这样写:
public delegate void Receiver<in T>(T v);
public delegate void Stream<out T>(Receiver<T> r);
Run Code Online (Sandbox Code Playgroud)
这里的想法是a Stream<>是一个函数,给定一个值接收器调用接收器,其中包含流中的所有值.
这允许我们map在F#中定义这样的' Select`:
let inline map (m : 'T -> 'U) (s : Stream<'T>) : Stream<'U> =
fun r -> s (fun v -> r (m v))
Run Code Online (Sandbox Code Playgroud)
C#:
public static Stream<U> Map<T, U>(this Stream<T> t, Func<T, U> m) =>
r => t(v => r(m(v)));
Run Code Online (Sandbox Code Playgroud)
我们可以实现其他功能,直到我们可以定义测试开销的数据管道.
let trivialTest n …Run Code Online (Sandbox Code Playgroud) 对于模板函数,我使用完美转发,如下所示:
template<typename T>
void f (T && v)
{
g (std::forward<T> (v));
}
Run Code Online (Sandbox Code Playgroud)
如何auto &&在C++14lambda表达式中完善前向参数?
auto f = [] (auto && v)
{
g (std::forward<??> (v));
};
Run Code Online (Sandbox Code Playgroud)
(尝试谷歌,但没有得到我选择的关键字的任何好点击)
我已经使用SFINAE表达式来测试类型是否支持 operator<<
namespace details
{
template<typename T>
struct sfinae_true : std::true_type
{
};
template<typename T>
sfinae_true<decltype (std::declval<std::ostream &> () << std::declval<T const &> ())> test_for_ostream (int);
template<typename T>
std::false_type test_for_ostream (long);
}
template<typename T>
struct supports_ostream : decltype (details::test_for_ostream<T> (0))
{
};
Run Code Online (Sandbox Code Playgroud)
我想测试的是,如果这种类型T可以像这样迭代
for (auto && v : vs) {} // vs is T const &
Run Code Online (Sandbox Code Playgroud)
困境在于这是一个陈述,而不是一个使其与之不兼容的表达 decltype
我正在考虑使用lambdas将语句转换为这样的表达式
auto x = [] () { for (auto && v : vs) {}; return 0; } (); // vs …Run Code Online (Sandbox Code Playgroud) 我有一个T4模板,可以处理我项目中的几个.tt文件.我还有一些我定义的自定义类来帮助代码转换过程.
<#@ template language="C#" hostspecific="True" debug="True" #>
<#@ output extension="cs" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="$(TargetDir)\MyDependency.dll" #>
Run Code Online (Sandbox Code Playgroud)
这适用于Visual Studio,我有一个VS宏,它正确定义$(TargetDir).
现在,我想在构建过程中执行代码生成过程.我补充说:
<TransformOnBuild>true</TransformOnBuild>
<OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
<IncludeDslT4Settings>true</IncludeDslT4Settings> <ItemGroup>
<T4ReferencePath Include="$(OutputPath)" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />
Run Code Online (Sandbox Code Playgroud)
我的构建运行,但我得到:
C:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets(407):主机在尝试解析程序集引用'$(TargetDir)\ MyDependency时抛出异常. DLL".转换不会运行.抛出以下异常:System.IO.FileLoadException:给定的程序集名称或代码库无效.(来自HRESULT的异常:0x80131047)System.Reflection.AssemblyName.nInit(RuntimeAssembly&assembly,Boolean forIntrospection,Boolean raiseResolveEvent)位于System.Reflection.AssemblyName.nInit()的Microsoft.VisualStudio.TextTemplating.GlobalAssemblyCacheHelper.GetLocation(String strongName)at at Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost.Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences(ITextTemplatingEngineHost主机,TemplateProcessingSession会话)中的ResolveAssemblyReference(String assemblyReference).Line = -1,Column = -1
显然它不会$(TargetDir)在Team构建上下文中解析.
我尝试将TargetDir添加到我的构建配置的属性组中,但无济于事.该值不会传递到T4代码生成器的上下文.
我不想使用环境变量.
如何$(TargetDir)在Team Build上下文中正确设置?
我做了非常简单的C#和F#测试程序.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace ConsoleApplication2
{
class Program
{
static int Remainder(int num)
{
return num % 2;
}
static int SumOfremainders(IEnumerable<int> list)
{
var sum = 0;
foreach (var num in list)
{
sum += Remainder(num);
}
return sum;
}
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
var nums = Enumerable.Range(1, 10000000);
sw.Start();
var a = SumOfremainders(nums);
sw.Stop();
Console.WriteLine("Duration " + (sw.ElapsedMilliseconds));
Console.WriteLine("Sum of remainders: {0}", a);
}
}
} …Run Code Online (Sandbox Code Playgroud) Attempts to pass an Action to F# code is producing the following syntax error in .net 4.6.1, VS2015...
Error CS1503 Argument 1:
cannot convert from 'System.Action<string>' to
'Microsoft.FSharp.Core.FSharpFunc<string, Microsoft.FSharp.Core.Unit>'
Run Code Online (Sandbox Code Playgroud)
The attempts are as follows...
using Microsoft.FSharp.Core;
....
Action<string> logger = Console.WriteLine;
App.perform(new Action<string>(Console.WriteLine), args);
App.perform(logger, args);
App.perform(new Action<string>(msg => Console.WriteLine(msg)), args);
App.perform((new Action<string>(msg => Console.WriteLine(msg))), args);
App.perform((new Func<string,Unit>(msg => Console.WriteLine(msg))), args);
App.perform(new Func<string,Unit>(Console.WriteLine), args);
Run Code Online (Sandbox Code Playgroud)
What is the proper way to pass System.Console.WriteLine from C# to F#?
我想定义一个通用代数数据类型,用于我的parse函数,如下所示:
sealed class Result<T> {
class Success(val value: T, val pos: Int) : Result<T>()
class Failure(val message: String, val pos: Int) : Result<T>()
}
fun <T> parse(t: Parser<T>, input: String, initialPos: Int = 0, collectErrors: Boolean = true) : Result<T> {
Run Code Online (Sandbox Code Playgroud)
但是,这是不允许的,因为这是T一个未定义的引用.
如果我添加T到所有成员类型它工作:
sealed class Result<T> {
class Success<T>(val value: T, val pos: Int) : Result<T>()
class Failure<T>(val message: String, val pos: Int) : Result<T>()
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这有点令人困惑,这让我相信我在这里遗漏了一些东西.T在第一种情况下定义成员类型时为什么没有看到?
另外,在创建Success我希望语法为的实例时:
Result<T>.Success<T>(tv.someValue, pos) …Run Code Online (Sandbox Code Playgroud) 为了学习一点,kotlin我正在松散地在经典的Monadic Parser Combinators
上构建一个解析器组合库.
在我的情况下,由于递归语法,我需要转发声明一个解析器.在准备最终表达式解析器时,我需要更新前向声明
我的第一次尝试是这样的
val addLike = mulLike separatedBy addLikeSeparator
val expression =
forwarded.second(addLike)
addLike
Run Code Online (Sandbox Code Playgroud)
这个想法是执行一个简短的addLike初始化然后返回初始化值.当我进行一些F#编程时,这是一种非常常见的模式,我认为这是一个很好的模式,因为它简化了隐藏初始化细节.
kotlin但是,这不起作用:
Error:(195, 5) Kotlin: Expecting a top level declaration
Run Code Online (Sandbox Code Playgroud)
这种方法也失败了:
val addLike = mulLike separatedBy addLikeSeparator
val expression = forwarded.second(addLike); addLike
Run Code Online (Sandbox Code Playgroud)
问题似乎是;将两者结合expressions成一个statement.
所以我试着,希望它的行为有点像C/C++,但没有运气:
val addLike = mulLike separatedBy addLikeSeparator
val expression = forwarded.second(addLike), addLike
Run Code Online (Sandbox Code Playgroud)
阅读kotlin规范后,我发现没有明确的解决方案,这就是我转向StackOverflow的原因.这种模式可以用惯用的方式实现kotlin吗?
更新
@Eric建议使用run,如果我更新我的代码,最终解决方案最终有点像这样:
val expression = run () …Run Code Online (Sandbox Code Playgroud)