aardio 文档

aardio 范例: lambda

//lambda
import dotNet; 
var compiler = dotNet.createCompiler("C#");  
compiler.Source = /****** 
namespace CSharpLibrary
{ 
    public class Object
    {  
        public delegate int TestDelegate(int a,int b);

        public TestDelegate GetDelegate()
        {   
            //lambda 表达式:类似JavaScript 的箭头函数,其实就是个匿名函数
            return (int a,int b)=>{
                return a+b;
            };

            /*
            C#3.0(.NET 3.0) 开始支持 lambda 表达式,注意 Win7自带.Net3.5,Win8,Win10,Win11 自带.Net 4.x
            其实 C#2.0(.NET 2.0) 就支持匿名 delegate,只是写法不一样,例如:
            */ 
            return delegate (int a,int b) { return a+b; };
        } 

        /*
        C# 中函数只是代码执行体,委托里才存放了函数的值(或者说函数地址),
        而  lambda 函数将这两者合二为一,这更像 aardio 中的函数对象。
        */
        public TestDelegate method = (int a,int b)=>{
            return a+b;
        };

        public int SetDelegate(TestDelegate test){
            return test(2,3);
        }
    }
}
******/

/*
注意在 aardio 中编译,调用的是 CLR,而 CLR 只有 2.0 / 4.0 的区别,只支持这两个版本的语法。
例如安装了 .NET 3.5 但没有安装 .NET 4.x ,那么 CLR 2.0 下编译器不支持 var ,lambda 这些语法 (但是能运行编译后的 DLL)。
Win10 至少自带 .NET 4.6,Win7 在市场上已经接近消失,现在开发软件再处处考虑 Win7 兼容是不必要的。 
*/

compiler.import("CSharpLibrary"); //编译 C# 代码并导入名字空间
var netObj = CSharpLibrary.Object();//创建 .NET 对象

//调用 C# 函数,可以在返回值里返回 .NET 委托
var func = netObj.GetDelegate();   
var ret = func(1,2);//直接调用 .NET 委托。

import console;
console.log("调用 C# 委托的返回值",ret);

//调用 C# 对象成员字段里存储的 lambda 函数。
var ret = netObj["method"](22,33);
/*
注意 netObj.method(22,33) 会直接调用成员函数而不取函数值。
如果 netObj.method 不是 C# 函数而是 lambda 值,这样写会报错。
所以我们要写为 netObj["method"] 先取出 lambda 函数。
*/

//C# 委托参数可以指定 aardio 中的 lambda 函数
var ret = netObj.SetDelegate(
    lambda(a,b) a + b
)

//下面的写法与上面是等价的,lambda 就是匿名函数,只是写法上的区别。
var ret = netObj.SetDelegate(
    function(a,b) {
        return a + b;
    }
)

console.log(ret);
console.pause();

Markdown 格式