Tony Huang's profileSouline PLUS planBlogListsNetwork Tools Help

Blog


    24 December

    曾经的腾讯,你在哪里

    还记得当初完全不懂英语时,看到OICQ的中文界面时的兴奋。
     
    市场运营的手段无可厚非
     
    但是他以如此粗暴而缺乏良知的行为对待当初的“战友”实在让我汗颜。。。
     
    那个有梦想的青年,现在的你为何会变成这样?
     
    陈寿福可能会很快地从我们的视野中消失,从我们的记忆中消失,但是若干年以后,我们会告诉我们的孩子,曾经有一个珊瑚虫的插件,非常棒,非常好。
     
    “那后来呢?”
     
    我们只能摇摇头,无奈地说,那人被腾讯告了。。。。
     
    曾经看到icq告腾讯的oicp侵权,于是腾讯起了个讨巧的名字qq,再后来icq就再也没有出现在中国的大地上
     
    或许未来的某个时候,我们也会发现,qq已经成为一个被历史埋没的词,而腾讯也不复存在了。。。。
    21 December

    Souline Script Engine : Specified Functions, Class Inherit, Class Extension

    今天下午没有课,就乘机把昨天公布的Features做了一下,主要包含以下部分:
     
    (1) Specified Functions
        我称之为函数特例话,但是函数式编程语言中有一个更加形象(或者说更加数学)的单词来形容他:Currying,其实我们做的是一样的东西,只是语法上有所不同而已:)
        下面我放出一个这个功能的一个例子:
        function plus(a, b)
        {
            return a + b;
        }
     
        var plus_five = specific plus(5,);
     
        plus_five(10); //This function call will return 15
     
    (2) Class Inherit
        这个没有什么好说的,无非就是传统面向对象语言中常见的继承,暂时不考虑做多集成支持。。。
     
    (3) Class Extension
        这个和C# 3.0中的Extension Method很相似,不过在Souline Script中的语法有所不同(因为W认为C#3.0中的语法实在是比较怪异啦)
        在Souline Script中,W使用语法就是一个类继承自己,比如原先由一个类A,那么我只要写 class A : A { function methodXXXX() {} } 就可以给A类添加一个methodXXXX()方法。
        其实从这个语法的实现上W也是这么做的,感觉上比较像A = A + methodXXXX; 呵呵:)
    最后,W很荣幸地告诉大家,Souline Script的主要功能都已经实现了,接下来,W将会把它应用到一些项目中去(比如数字图像处理的Project中):)
     
    下面W要解决的燃眉之急就是要把数字图像处理的Projects做掉(一共4个的说。。。。)
    20 December

    Souline Script Engine : Anoymous Functions, Object-Oriented Features

    从昨天晚上到今天早上,我又给Souline Script Engine加入了一些新的功能,一些语法的细节也做了改进:
     
    先说说语法的改进吧~~
     
    现在的var已经不仅仅可以定义变量了,还可以给变量赋初值(这个貌似很简单的样子嘛。。。),比如原来必须;
    var i;
    i = 1;
    现在可以用
    var i = 1;
    来代替了,也算是个语法甜头吧。
     
    接着再说说Anoymous Functions,现在的Souline Script Engine已经支持匿名函数了,比如:
    function GenericCalc(oper, num1, num2)
    {
        return oper(num1, num2);
    }
     
    GenericClac(function(num1, num2) { return num1 + num2; }, 5, 10);
     
    再说说面向对象特性,Souline Script Engine已经加入了部分面向对象的特性,其实也就是支持类了,比如:
    class Souline.Animals.Cat {
        function SayHello() {
            return "Hello, this is " + this.Name;
        }
    }
     
    var cat = new Souline.Animals.Cat;
    cat.Name = "Tony Huang";
    cat.SayHello();
     
    很不幸地是,函数结果的缓存功能可能暂时不会出现在Souline Script Engine中了,主要原因是算法和数据结构选择的问题,因为确实很难找到适合的算法,如果大家有什么建议的话,可以给我留言。
     
    再说说Script Engine即将加入的Feature:
    (1)特例化函数变量
        这个名字听起来挺古怪的,实际上它的思想很简单,举个例子:
        假设现在有一个数组,我想对里面的所有元素都加1,那么只要:
        function plus(num1, num2)
        {
            return num1 + num2;
        }
     
        function each(numberArray, oper)
        {
            var keys = keys(numberArray);
            var len = length(keys);
            for(var i = 0; i < len; i = i + 1)
                oper(numberArray, keys[i], numberArray[keys[i]]);
        }
     
        function each_process(numberArray, oper)
        {
            var callback_function = function(array, key, value, oper) { array[key] = oper(key, value) };
     
            each(numberArray, specific callback_function(,,,oper));
        }
     
        each_process(numberArray, specific plus(1));
     
    (2) 类的继承
        现在的面向对象的功能,我只实现了类,还没有实现类的继承,设计的语法是这样的:
        class A { function methodA() { } }
        class B : A {function methodB() { } }
        这样B类就既有methodA方法,也有methodB方法
     
    (3)Extension Method
        这是借鉴C# 3.0的一个设计,就是类是可以扩展的,比如:
        class A { function methodA() {} }
        class A : A { function methodB() {} }
        这样A类就同时具有methodA和methodB了
    14 December

    Souline Script Engine : Collections

    今天第二节的课调整了时间,就干脆坐下来,开发了这个Souline Script Engine的Collections功能,放一段测试用的脚本吧(好像我酷爱计算素数嘛。。。):
    function countPrime2(max)
    {
       var i;
       var j;
       var col;
       var cnt;
       cnt = max - 1;
       for(i = 2; i <= max; i = i + 1)
           col[i] = 1;
       for(i = 2; i < (sqrt(max) + 1); i = i + 1)
           if(col[i] == 1)
               for(j = i + i; j <= max; j = j + i)
               {
                   if(col[j] == 1) cnt = cnt -1;
                   col[j] = 0;
               }
       return cnt;
    }
     
    前段时间,我为了要把Souline Script Engine发扬光大,把它集成到了一个无限小车的上位机控制端上, 发两张截图吧:

    main

    这是主控制界面

    script editor

    这是可以让用户自己编缉脚本的带语法显亮功能的编辑环境:)

    10 December

    Souline Script Engine : EXTERNAL FUNCTIONS, LIBRARIES

    最近一直在自习自动控制原理,终于第1次把书看完了,这个礼拜开发Souline Script Engine的时间也比较少,说说最近的更新吧:
     
    1) External Functions:
    说白了,就是让Souline Script Engine 可以调用dotNet中的函数啦,比如我写了一个类:
    public class MathLibrary
    {
        public static double sqrt(double num)
        {
            return Math.Sqrt(num);
        }
    }
     
    然后让Script Engine加载这个库
    scriptEngine.AppendLibrary(typeof(MathLibrary));
     
    这样,就可以在脚本中使用这个库里面的函数了:
    a = readNumber();
    println("Sqrt(" + a + ") = " + sqrt(a));
     
    2. Libraries
    Library在Souline Script Engine中分为2种类型:
    1) Souline Script Library
        其实就是一般的Souline Script脚本,这是可以被其他的程序所引用,假设有一个Console.sslib库,其他程序想要引用它只要在程序中调用require_lib函数:
        require_lib("Console");
     
        println("Hello, world!");
    2) Dot Net Library
        这个和上面的External Function类似,而且也是利用上面的External Function实现的,它的主要特点是,可以通过配置文件加载到程序中。
    在这里放上一个Script Engine的配置文件,大家就一目了然了:
    文件Souline.Script.config清单:
    <?xml version="1.0"?>
    <Souline>
      <Services>
        <Script>
          <Libraries>
            <DotNetLibrary name="ConsoleLibrary" version="1.0" assemblyName="Souline.FinanceScript.dll" className="Souline.FinanceScript.InternalLibraries.ConsoleLibrary" />
            <SoulineScriptLibrary name="Console" version="1.0" fileName="console.sslib" />
          </Libraries>
        </Script>
      </Services>
    </Souline>
     
    下一步的开发计划:
    1) 加入Collection功能
        这不仅仅包括了数组,也包括了map
    2) 加入Function Call Cache功能
        对一些结果和输入有确定关系的函数实行缓存,以提高运算速度,通过加入新的关键字cache实现,比如:
        function cache abs(num)
        {
            if(num < 0)
                return -num;
            else
                return num;
        }
        假设第一次调用的时候使用了
        b = abs(-1);
        那么这个函数会被实际调用,进行计算。
        当第二次调用他时,引擎就会自动从缓存的数据中读出来,避免重复计算了:)
    02 December

    Souline Script Engine

    神奇的Tony Huang又重出江湖啦~~~
    兜了一圈又回到了Windows Live Space(以前叫msn space来着?)
    Mr. W最近在做的是一个脚本引擎,其实也就是一个类似javascript的脚本,这也是我们的Souline Server Foundation的一个组件,起初只是想着要用它做一些金融计算,现在看了ror的教学视频后,决定干脆让它更加牛X点,就改称为Souline Script吧,呵呵
    现在放一些我自己测试用的脚本,让大家尝尝鲜,呵呵:
    1) TestVariable
    RESULT: 5
    _max = 2 + 6 / 2;
    _max
    2)  TestVariable3
    RESULT: 2
    i = 5; j = 3; (i % j)
    3)  TestBreak
    RESULT: 1229
    i = 1;
    max = 10000;
    for(j = 3; j < max; j = j + 2)
    {
        k = 1;
        for(l = 2; (l * l) < (j + 1); l = l + 1)
            if((j % l) == 0)
            {
                k = 0;
                break;
            }
        if (k == 1)
            i = i + 1;
    }
    i
    4) TestFunction3
    RESULT: 1229
    function isPrime(a)
    {
        var i;
        for(i = 2; (i * i) < (a + 1); i = i + 1)
            if((a % i) == 0)
                return 0;
        return 1;
    }
    function countPrime(max)
    {
        var count;
        count = 0;
        for(i = 2; i < (max + 1); i = i + 1)
            if(1 == isPrime(i))
                count = count + 1;
        return count;
    }
    countPrime(10000);

    至于这个脚本的执行效率嘛,就基本只能算是马马虎虎啦,呵呵
     
    名词解释:
    Mr. W  我打游戏的时候的id是wzhjs,于是就被称为W了。。。