说我需要一些非常特殊的乘法运算符.它可以在以下宏中实现:
macro @<<!(op1, op2)
{
<[ ( $op1 * $op2 ) ]>
}
Run Code Online (Sandbox Code Playgroud)
我可以像使用它一样
def val = 2 <<! 3
Run Code Online (Sandbox Code Playgroud)
它的工作.
但我真正想要的是现在正在开发的DSL Im的"英语"操作员:
macro @multiply(op1, op2)
{
<[ ( $op1 * $op2 ) ]>
}
Run Code Online (Sandbox Code Playgroud)
如果我试着像它一样使用它
def val = 2 multiply 3
Run Code Online (Sandbox Code Playgroud)
编译器因'expected;'而失败 错误
问题是什么?如何实现这个中缀格式宏?
我想在我的控制台应用程序中创建一个from后隐藏我的控制台.关闭表格后再显示:)或者我想要的时候...
Console.Hide???
Application.Run(nForm());
Console.Show???
Run Code Online (Sandbox Code Playgroud) 我想做类似的东西(Nemerle语法)
def something =
match(STT)
| 1 with st= "Summ"
| 2 with st= "AVG" =>
$"$st : $(summbycol(counter,STT))"
Run Code Online (Sandbox Code Playgroud)
在F#上,F#真的如此吗?
想要在我的代码中编写的内容如下.
c² = a² + b²
Run Code Online (Sandbox Code Playgroud)
首先,我尝试创建一个宏²
.我尝试了以下内容.
macro @² (x)
syntax (x,"²")
{
<[
($x * $x)
]>
}
Run Code Online (Sandbox Code Playgroud)
但是我在期待一个标识符错误,(x)
所以我尝试了
macro @s (x)
syntax (x,"²")
{
<[
($x * $x)
]>
}
Run Code Online (Sandbox Code Playgroud)
现在我得到了不支持的语法令牌错误"²"
.
所以我问1.可以编写运算符²
吗?2.支持的语法标记是什么?
我面对的是"引用"一词,我试图弄清楚一些现实生活中使用它的例子.为每个代码表达式设置AST的能力听起来很棒,但如何在现实生活中使用它?
有谁知道这样的例子?
虽然在某些情况下我会使用方法链编写一些东西(特别是如果它只是一两个方法,比如foo.Where(..).ToArray()),在很多情况下我更喜欢LINQ查询理解语法相反(规范中的"查询表达式"),如下所示:
var query =
from filePath in Directory.GetFiles(directoryPath)
let fileName = Path.GetFileName(filePath)
let baseFileName = fileName.Split(' ', '_').First()
group filePath by baseFileName into fileGroup
select new
{
BaseFileName = fileGroup.Key,
Count = fileGroup.Count(),
};
Run Code Online (Sandbox Code Playgroud)
在一些相当大的块中,我需要将生成的IEnumerable和eager-load加载到数据结构(数组,列表,等等)中.这通常意味着:
添加另一个局部变量,如var queryResult = query.ToArray(); 要么
用parens包装查询并在ToArray(或ToList或其他)上标记.
var query = (
from filePath in Directory.GetFiles(directoryPath)
let fileName = Path.GetFileName(filePath)
let baseFileName = fileName.Split(' ', '_').First()
group filePath by baseFileName into fileGroup
select new
{
BaseFileName = fileGroup.Key,
Count = fileGroup.Count(),
}
).ToArray();
Run Code Online (Sandbox Code Playgroud)
我试图找出其他人的选择1)已经使用或2)可以认为添加一些额外的"上下文关键字"是可行的 - 只是将转换为扩展方法的方式与现有方法相同,好像LINQ关键字是'本地'可扩展的:)
我意识到这很可能意味着要么进行某种预处理(不确定C#的这个领域有什么)或者将编译器改为 …
我正在尝试编写通用的Vector2类型,它将包含float,double等类型并使用算术运算.有没有机会在C#,F#,Nemerle或任何其他或多或少成熟的.NET语言中做到这一点?
我需要一个解决方案
由于原因1和3,我不想使用动态.现在我正在检查F#和Nemerle.
UPD:我希望这种类型有很多数学代码.但是,如果可能的话,我更愿意将代码放在扩展方法中.
UPD2: 'etc'类型包括int(我实际上怀疑我会使用)和decimal(我想我可以使用,但现在不是).使用扩展方法只是一个品味问题 - 如果有充分理由不这样做,请告诉我们.
我想简化表达if(x == 1 || x == 2)
.
我希望我能写,if(x == 1 or 2)
但没有语法.
其他可能性是使用Contains或Any方法,如:if([1,2].Contains(x))
但这涉及不必要的调用.
我可以创建一些允许我这样做的运算符吗?
在Nemerle语言中我可以写宏:
macro @|||(left, right)
match (left)
| <[ $x == $y ]> => <[ $x == $y || $x == $right ]>
| _ => Message.Error("Error"); <[ ]>
Run Code Online (Sandbox Code Playgroud)
然后用法:
if (x == 1 ||| 2) { .. }
Run Code Online (Sandbox Code Playgroud)
我可以在F#中以这种方式创建运算符吗?
我正在寻找将一些较轻的元编程从Nemerle转移到Boo,我试图找出如何定义自定义运算符.例如,我可以在Nemerle中执行以下操作:
macro @<-(func, v) {
<[ $func($v) ]>
}
Run Code Online (Sandbox Code Playgroud)
那么这两个是等价的:
foo <- 5;
foo(5);
Run Code Online (Sandbox Code Playgroud)
我无法在Boo中找到这样做的方法 - 任何想法?
我想知道如何从窗体的控制台获取输入:
M 14 65 99 in nemerle.在C#中,我这样做:
string[] input = System.Console.ReadLine().Split(' ');
ch = System.Char.Parse(input[0]);
a = System.Int32.Parse(input[1]);
d = System.Int32.Parse(input[2]);
m = System.Int32.Parse(input[3]);
Run Code Online (Sandbox Code Playgroud)
但这并不适用于Nemerle.请建议我如何在Nemerle做.