C#、求值和自定义编译器中方法的纯度?

C#、求值和自定义编译器中方法的纯度?,c#,.net,compiler-construction,C#,.net,Compiler Construction,当使用调试器单步执行代码时,VisualStudio没有重新计算某些watch表达式,您是否曾对此感到沮丧 我有,这里有人关心纯方法吗?没有副作用的方法?关于C#有很多我喜欢的东西,但我不能编写纯函数,也就是没有副作用的静态方法 如果您要构建自己的C#编译器,在那里您可以编写类似这样的东西,该怎么办 function int func(readonly SomeRefType a, int x, int y) { return /*...*/; } 这不仅是一个免费的函数,唉,我不把它叫做方法

当使用调试器单步执行代码时,VisualStudio没有重新计算某些watch表达式,您是否曾对此感到沮丧

我有,这里有人关心纯方法吗?没有副作用的方法?关于C#有很多我喜欢的东西,但我不能编写纯函数,也就是没有副作用的静态方法

如果您要构建自己的C#编译器,在那里您可以编写类似这样的东西,该怎么办

function int func(readonly SomeRefType a, int x, int y) { return /*...*/; }
这不仅是一个免费的函数,唉,我不把它叫做方法,这个函数保证不会有任何副作用。C#关键字
readonly
在这里可以用来表示这一点,并为纯函数提供契约。这类功能总是可以调节的,不会产生副作用。这是VisualStudio始终在监视中评估我的函数的一种方式,尽管错误地假设所有方法调用和用户操作符都有副作用。所有参数都是按值复制的方法永远不会有副作用,但是Visual Studio无法识别这一点

我喜欢C++在编译时所做的事情,我在C语言中忽略了这些东西,我认为C是一种对用户的一种低沉,基本上不允许某些表达,伤害程序员。很多事情实际上都与你在编译时可以做的事情有关,我想看到更多的元程序,它们是由编译器运行的程序,用来编译你的原始程序

e、 g.虽然C#有布尔值,不允许类似于
的if(var a=obj as MyRefType)
,但它不会生成适当的代码。我仔细研究了一下,发现C#无法为无分支条件生成适当的IL,例如
x>y?1:0
,C#编译器没有使用IL指令


您是希望还是不希望使用开源的.NET编译器?这看起来像C#但就你能用它做什么而言,它是完全不同的,更具表现力,更灵活,而且完全是一个大问题。如果我想要不同的语言选项,我已经有了:

  • F#用于功能弯板
  • 具有自定义编译阶段的DSL帮助程序的Boo
在国际海事组织看来,“委员会设计”(甚至是“单个业余语言设计师设计”)语言与C#一样经过深思熟虑的可能性非常小

能表达更多的东西会好吗?当然

拥有数十万懂同一种语言的人、真正懂这门语言的人的内置VisualStudio集成等,这是否相当方便?绝对是


对我来说,“看起来像C#但是完全不同的东西”听起来像是一个问题,而不是一个解决方案。

不是真的。如果我想要不同的语言选项,我已经有了:

  • F#用于功能弯板
  • 具有自定义编译阶段的DSL帮助程序的Boo
在国际海事组织看来,“委员会设计”(甚至是“单个业余语言设计师设计”)语言与C#一样经过深思熟虑的可能性非常小

能表达更多的东西会好吗?当然

拥有数十万懂同一种语言的人、真正懂这门语言的人的内置VisualStudio集成等,这是否相当方便?绝对是


对我来说,“看起来像C#但是完全不同的东西”听起来像是一个问题,而不是一个解决方案。

为什么要费心编写不同的编译器?您至少可以通过编写PostSharp weaver在编译时更改方法(嗯,函数)来实现这里描述的部分功能。

为什么要编写不同的编译器呢?您至少可以通过编写PostSharp weaver在编译时更改方法(嗯,函数)来实现此处描述的部分功能。

只需遵循以下简单约定:
如果不是void,请不要触摸参数

只需遵循以下简单惯例:
如果不是void,请不要触摸参数

如果你真的想要混合纯度,但你仍然可以使用OOP的命令式方面,那么使用F#。它来自微软,将被产品化并集成到VS2010中

如果你真的想要一个真正的纯函数式编程,你可以确保你的编程结构中有纯函数,并且清楚地区分包括IOs、异常在内的副作用,你可以选择Haskell

对于初学者,您可以从微软研究员Simon Peyton Jones处下载GHC,这是一个开源Haskell编译器。您还可以下载VisualHaskell,它是VS2005的一个插件,用作Haskell的IDE

有关更多信息:


如果你真的想要混合纯度,但你仍然可以使用OOP的命令式方面,那么使用F#。它来自微软,将被产品化并集成到VS2010中

如果你真的想要一个真正的纯函数式编程,你可以确保你的编程结构中有纯函数,并且清楚地区分包括IOs、异常在内的副作用,你可以选择Haskell

对于初学者,您可以从微软研究员Simon Peyton Jones处下载GHC,这是一个开源Haskell编译器。您还可以下载VisualHaskell,它是VS2005的一个插件,用作Haskell的IDE

有关更多信息:


    • 如今,实现一种语言比实现一个编译器要多得多。我个人沉迷于Resharper,甚至由plain Visual Studio提供的更有限形式的语法高亮显示、提示、自动完成和编辑器内编译都非常复杂和有用。所有的UI内容也必须重新实现

      Spec#语言是这方面的一个很好的案例研究。微软并没有在C#中添加更多功能,而是将其转变为