青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    Kernel FP已經可以運行小程序了。現在還處于測試階段,過于復雜的程序估計是跑不過的。先簡單介紹一下如何在C++調用Kernel FP的代碼。

    首先貼出一段Kernel FP的代碼:
 1 module startup
 2 import system
 3 
 4 data maybe T = return T | error T
 5 
 6 def add a b = 
 7   let
 8     def xadd = iadd a b
 9   in xadd
10 
11 def foo a =
12   select a of
13     case 0 : return 100
14     case 1 : return 200
15     case 2 : return 300
16     else : error a
17   end
18 
19 def translate a =
20   select a of
21     case return t : iadd 10000 t
22     case error t : iadd 1000 t
23   end
24 
25 def main = translate (foo (add 1 2))

    程序非常直白。add 1 2返回3,經過foo選擇返回error 3,經過translate變成iadd 1000 3,最后輸出1003。現在Kernel FP的對外api還沒寫,只是在調試內核代碼。為什么只有iadd呢?因為我只實現了iadd……其他的等以后再說。先看看如何調用一個main函數。在沒有對外api的情況下,只能對內核的對象進行裸調……

   
 1 void RunProgram(VL_KfpRuntimeProgram::Ptr Program)
 2 {
 3     VL_KfpRuntimeEnvironment Environment;
 4     Environment.Program=Program;
 5 
 6     MyPlugin Plugin(&Environment);
 7     Environment.Plugins.Add(&Plugin);
 8 
 9     VL_KfpRuntimeFunction* Function=&Program->Functions[Program->FunctionIDMap[L"startup.main"][0]];
10 
11     VL_KfpRuntimeValueEnvironment ValueEnvironment;
12     ValueEnvironment.Environment=&Environment;
13     ValueEnvironment.SetTable(new VL_KfpRuntimeValueTable(new VL_KfpRuntimeValueTable(0,0),Function->Instance));
14 
15     VL_KfpRuntimeExpression* Expression=Function->AssociatedExpression;
16     VL_KfpRuntimeValue* Value=Expression->CreateRuntimeValue(&ValueEnvironment);
17     Value->Increase();
18     VL_KfpRuntimeEvaluateResult Result;
19     Value->EvaluateUntilGetType(&Environment,Result);
20     if(Result.HasError)
21     {
22         GetConsole()->Write(L"發生錯誤:"+Result.ErrorMessage+L"\r\n");
23     }
24     else
25     {
26         if(Result.Value.GetValue()->Kind==VL_KfpRuntimeValue::vkekInteger)
27         {
28             GetConsole()->Write(L"返回值:"+VUnicodeString(((VL_KfpRuntimeIntegerValue*)Result.Value.GetValue())->Data)+L"\r\n");
29         }
30         else
31         {
32             GetConsole()->Write(L"返回值不是整數。\r\n");
33         }
34     }
35     Value->Decrease();
36 }

    首先程序經過先前實現的類型推導,得到編譯后的程序VL_KfpRuntimeProgram,然后取出startup.main的函數指針。得到了函數指針之后,將函數的上下文和函數綁定的表達式都保存起來,然后將表達式轉換為VL_RuntimeValue。最后對VL_RuntimeValue與上下文結合進行求值。

    當然了,程序會調用到iadd,這是一個外部函數,實現兩個整數的加法。所以還得實現一個插件來執行iadd:

 1 class MyPlugin : public VL_KfpRuntimePlugin
 2 {
 3 public:
 4     VL_KfpRuntimeEnvironment*        Environment;
 5     VInt                            External_IAdd;
 6 
 7     MyPlugin(VL_KfpRuntimeEnvironment* aEnvironment)
 8     {
 9         Environment=aEnvironment;
10 
11         External_IAdd=Environment->Program->ExternalIDMap[L"kernelfp::iadd"];
12     }
13 
14     VLE_KfpPluginResult Invoke(VInt ExternalID , InParams& In , OutParams& Out)
15     {
16         if(ExternalID==External_IAdd)
17         {
18             if(In.Parameters.GetCount()==2)
19             {
20                 VL_KfpRuntimeEvaluateResult r1,r2;
21 
22                 In.Parameters[0].GetValue()->EvaluateUntilGetType(Environment,r1);
23                 if(r1.HasError)
24                 {
25                     Out.ErrorMessage=r1.ErrorMessage;
26                     return vkprFail;
27                 }
28                 if(r1.Value.GetValue()->Kind!=VL_KfpRuntimeValue::vkekInteger)
29                 {
30                     Out.ErrorMessage=L"iadd函數的參數必須是兩個int。";
31                     return vkprFail;
32                 }
33 
34                 In.Parameters[1].GetValue()->EvaluateUntilGetType(Environment,r2);
35                 if(r2.HasError)
36                 {
37                     Out.ErrorMessage=r2.ErrorMessage;
38                     return vkprFail;
39                 }
40                 if(r2.Value.GetValue()->Kind!=VL_KfpRuntimeValue::vkekInteger)
41                 {
42                     Out.ErrorMessage=L"iadd函數的參數必須是兩個int。";
43                     return vkprFail;
44                 }
45 
46                 VInt Value1=((VL_KfpRuntimeIntegerValue*)r1.Value.GetValue())->Data;
47                 VInt Value2=((VL_KfpRuntimeIntegerValue*)r2.Value.GetValue())->Data;
48                 Out.Result.SetValue(new VL_KfpRuntimeIntegerValue(Value1+Value2));
49                 return vkprSuccess;
50             }
51             else
52             {
53                 Out.ErrorMessage=L"iadd函數的參數必須是兩個int。";
54                 return vkprFail;
55             }
56         }
57         else
58         {
59             return vkprPass;
60         }
61     }
62 
63     VLE_KfpPluginResult GetParameterCount(VInt ExternalID , VInt& Count)
64     {
65         if(ExternalID==External_IAdd)
66         {
67             Count=2;
68             return vkprSuccess;
69         }
70         else
71         {
72             return vkprPass;
73         }
74     }
75 };

    這也就是MyPlugin類的內容了。
posted on 2008-12-10 23:03 陳梓瀚(vczh) 閱讀(1734) 評論(2)  編輯 收藏 引用 所屬分類: 腳本技術

評論:
# re: Kernel FP成功運行小程序 2008-12-10 23:58 | kuafoo
還在等你發布界面庫呢  回復  更多評論
  
# re: Kernel FP成功運行小程序 2008-12-11 01:44 | 陳梓瀚(vczh)
界面庫啊,自從Preview之后就很少升級了。因為剩下的那幾個控件實在是懶的去封裝……不過這應該是遲早的事情。等需要為kernel fp做Demo的時候,估計就開始了吧……  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            中日韩在线视频| 欧美aaaaaaaa牛牛影院| 亚洲欧美精品伊人久久| 日韩视频在线观看一区二区| 久久久91精品国产| 久久精品亚洲一区| 国产专区精品视频| 久久精视频免费在线久久完整在线看| 欧美电影免费观看大全| 欧美激情国产精品| 亚洲精品综合| 欧美区亚洲区| 日韩一级在线观看| 亚洲专区在线| 国内成+人亚洲| 毛片一区二区| 亚洲婷婷在线| 欧美福利网址| 亚洲综合三区| 国产欧美日韩一区二区三区| 久久国产视频网| 欧美高清在线视频观看不卡| 亚洲五月六月| 在线成人av.com| 欧美精品一区二区三区视频| 亚洲最新在线视频| 久久久精品一区二区三区| 一区二区三区中文在线观看| 欧美黄色小视频| 亚洲欧美日本国产专区一区| 欧美成人有码| 午夜影院日韩| 99re66热这里只有精品4| 国产精品专区h在线观看| 猛干欧美女孩| 欧美在线|欧美| 日韩视频三区| 欧美福利视频在线观看| 欧美在线黄色| 亚洲免费在线看| 亚洲激情偷拍| 激情久久中文字幕| 国产精品久久久久av| 免费一区二区三区| 久久激情五月丁香伊人| 亚洲视频在线观看网站| 最新中文字幕亚洲| 久久香蕉国产线看观看av| 亚洲欧美日韩精品一区二区| 亚洲欧洲日本在线| 国产亚洲福利社区一区| 国产精品高清免费在线观看| 欧美韩日高清| 欧美成人中文| 久久夜色精品一区| 久久久精品网| 久久亚洲一区| 久久亚洲精品欧美| 久久综合久久久| 久久精品最新地址| 久久久水蜜桃| 玖玖精品视频| 欧美成人国产| 欧美高清在线| 欧美精品国产精品| 欧美日韩精品久久久| 欧美人与性禽动交情品| 欧美人牲a欧美精品| 欧美日韩国产系列| 国产精品久久久久久户外露出| 亚洲欧美国产va在线影院| 亚洲一二三区在线| 日韩视频中文| 亚洲午夜精品久久久久久app| 亚洲影院色无极综合| 久久久国产视频91| 久久成人精品无人区| 亚洲一区二区三区在线观看视频| 国内精品久久久久久久影视麻豆 | 亚洲美女黄色| 亚洲精品久久久久中文字幕欢迎你| 亚洲资源在线观看| 性色一区二区| 久久久久久久国产| 亚洲电影免费观看高清完整版在线| 99国内精品| 亚洲在线视频网站| 久久精品国产清高在天天线| 久久精品视频在线看| 欧美激情影音先锋| 中文国产成人精品久久一| 欧美在线国产| 久久伊人一区二区| 欧美另类99xxxxx| 国产农村妇女毛片精品久久莱园子| 欧美精品在线一区| 国产精品伊人日日| 伊人婷婷欧美激情| 亚洲图色在线| 欧美成人亚洲成人日韩成人| 在线一区二区三区四区五区| 久久精品99国产精品日本| 欧美精品亚洲精品| 国产在线视频欧美一区二区三区| 国产精品视频在线观看| 亚洲韩国一区二区三区| 午夜精品一区二区三区四区 | 黄色资源网久久资源365| 亚洲伦理在线免费看| 性久久久久久| 亚洲日韩第九十九页| 久久久国产午夜精品| 国产精品区一区二区三区| 激情成人中文字幕| 欧美伊人久久| 日韩一区二区精品视频| 女女同性精品视频| 激情懂色av一区av二区av| 欧美在线3区| 亚洲片在线观看| 另类天堂视频在线观看| 国产亚洲一区二区精品| 欧美一区国产在线| 亚洲一区二区四区| 欧美视频一区二区三区…| 亚洲精选视频在线| 欧美日韩一区二区三区四区五区 | 久久久天天操| 国产精品综合av一区二区国产馆| 国产精品久久久久婷婷| 一本一本a久久| 亚洲第一页自拍| 久久嫩草精品久久久精品一| 国产精品美女久久| 亚洲一级一区| 亚洲最新视频在线| 国产精品v亚洲精品v日韩精品| 国产精品男人爽免费视频1| 亚洲图片欧美日产| 夜色激情一区二区| 欧美午夜精品久久久久久人妖| 国产精品视频网站| 亚洲影音先锋| 午夜久久久久久| 国模大胆一区二区三区| 久久久久久久久久久一区 | 亚洲经典自拍| 欧美暴力喷水在线| 日韩午夜av电影| 99精品免费网| 国产精品嫩草99av在线| 亚洲一区二区在线观看视频| 亚洲精品少妇30p| 欧美日韩在线免费视频| 亚洲欧美日韩国产综合| 久久国产视频网| 日韩亚洲精品电影| 一二三四社区欧美黄| 国产精品激情电影| 久久精彩视频| 欧美成人四级电影| 一片黄亚洲嫩模| 亚洲制服av| 在线国产精品播放| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美aⅴ99久久黑人专区| 日韩一级大片| 亚洲一区免费| 一区在线播放| 91久久精品美女| 欧美视频成人| 美日韩精品免费| 欧美日韩综合视频网址| 久久免费一区| 欧美午夜精品久久久久久浪潮| 日韩视频在线一区| 欧美一级专区| 亚洲区欧美区| 午夜精品福利在线| 亚洲国产天堂久久综合| 亚洲一区二区在线免费观看| 久久成人资源| 亚洲精品网址在线观看| 国产欧美日韩亚洲精品| 亚洲高清不卡一区| 国产精品毛片a∨一区二区三区| 最新亚洲激情| 久久精品欧美| 香蕉乱码成人久久天堂爱免费| 亚洲国产小视频在线观看| 国产农村妇女精品| 亚洲精品小视频| 亚洲人成在线影院| 久久久久久亚洲精品杨幂换脸| 国内外成人免费激情在线视频| 亚洲综合99| 欧美精品在线一区二区| 欧美不卡高清| 国产日韩欧美亚洲| 夜夜狂射影院欧美极品|