這次終于實現了兩個exe,一個是編譯器,一個是提供控制臺API的虛擬機。等提供GUI的虛擬機出來之后就開放出來。
假設有代碼Program.txt:
1 module program
2 import console
3 import list
4
5 def main = take 10 (iterate finc 1.0) ||> sqr ||> ftoa ||> writeln |> ioseq
那么提供Program.xml:
1 <kfpProject>
2 <inherit path="..\..\Include\ConsoleApplication.xml"/>
3 <output path="Executable.xml"/>
4 <report path="Report.txt"/>
5 <code>
6 <include path="Program.txt"/>
7 </code>
8 </kfpProject>
然后執行:
..\..\Release\KfpCompiler.exe Program.xml
..\..\Release\KfpConsole.exe Executable.xml
就可以運行一個程序啦!
讓我們分析一下代碼。首先finc是一個將浮點數加一的函數,那么iterate finc 1.0就是一個從1.0開始,每次遞增1.0的無窮數組,然后take 10返回[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0]。然后||>sqr將所有數字開方,||>ftoa將所有數字轉成字符串,然后||>writeln將所有的字符串變成10個輸出字符串的函數,最后|>ioseq運行這10個函數,結果如下:

接下來打算實現一個VL_CompressedStream用于壓縮產生的可執行鏡像,然后再開發一個支持簡單繪圖功能的虛擬機,就開放出來。所需要的時間應該不久,因為一個新的虛擬機只需要實現API就可以了。偉大的插件系統,滅哈哈……
下面是上面MakeFile所引用到的庫文件(預定義的):
ConsoleApplication.xml
1 <kfpProject>
2 <inherit path="Library.xml"/>
3 <code>
4 <include path="ConsoleModule.txt"/>
5 </code>
6 </kfpProject>
Library.xml
1 <kfpProject>
2 <code>
3 <include path="SysUtils.txt"/>
4 <include path="List.txt"/>
5 </code>
6 </kfpProject>
所需要的代碼文件:
ConsoleModule.txt
1 module console
2 import system
3
4 func read :: (IO string) alias "console::read"
5
6 func write :: (string -> (IO void)) alias "console::write"
7
8 func writeln :: (string -> (IO void)) alias "console::writeln"
9
SysUtils.txt
1 module sysutils
2 import system
3
4 def (+) = iadd
5 def (+) = fadd
6 def (-) = isub
7 def (-) = fsub
8 def (*) = imul
9 def (*) = fmul
10 def (/) = idiv
11 def (/) = fdiv
12 def (>) = igt
13 def (>) = fgt
14 def (>) = cgt
15 def (>=) = iegt
16 def (>=) = fegt
17 def (>=) = cegt
18 def (<) = ilt
19 def (<) = flt
20 def (<) = clt
21 def (<=) = ielt
22 def (<=) = felt
23 def (<=) = celt
24 def (==) = iequ
25 def (==) = fequ
26 def (==) = cequ
27 def (!=) = ineq
28 def (!=) = fneq
29 def (!=) = cneq
30 def (&&) = and
31 def (||) = or
32 def (^) = xor
33 def (|>) param op = op param
34 def oprev op a b = op b a
35
36 def not a = select a of
37 case true : false
38 case false : true
39 end
40
41 def and a b = select a of
42 case true : b
43 case false : false
44 end
45
46 def or a b = select a of
47 case true : true
48 case false : b
49 end
50
51 def xor a b = select a of
52 case true : not b
53 case false : b
54 end
55
56 def if cond t f = select cond of
57 case true : t
58 case false : f
59 end
60
61 def ineg num = isub 0 num
62
63 def fneg num = fsub 0.0 num
64
65 def inc n = iadd n 1
66
67 def dec n = isub n 1
68
69 def finc n = fadd n 1.0
70
71 def fdec n = fsub n 1.0
72
73 def pairfirst p = select p of
74 case pair a b : a
75 end
76
77 def pairsecond p = select p of
78 case pair a b : b
79 end
80
81 def pairop op =\p->
82 select p of
83 case pair a b : op a b
84 end
85
86 func return T :: T -> IO T
87 def return x e = success (pair x e)
88
89 func ioerror T :: string -> IO T
90 def ioerror s = \env->fail(ioemessage s)
List.txt
1 module list
2 import sysutils
3
4 def (+) = concat
5 def (||>) param op = transform op param
6
7 def ioseq = foldr iovoid (>>>)
8
9 {返回列表長度}
10 def length xs =
11 select xs of
12 case list x tail : iadd 1 (length tail)
13 case empty : 0
14 end
15
16 {返回列表的第一個元素}
17 def head xs =
18 select xs of
19 case list x tail : x
20 end
21
22 {返回列表的第二個元素開始的列表}
23 def tail xs =
24 select xs of
25 case list x tail : tail
26 end
27
28 {連接兩個列表}
29 def concat as bs =
30 select as of
31 case list a tail : list a (concat tail bs)
32 case empty : bs
33 end
34
35 {判讀列表是否為空}
36 def isempty xs =
37 select xs of
38 case list x tail : false
39 case empty : true
40 end
41
42 {將列表通過映射函數轉換為另一個列表}
43 def transform mapper xs =
44 select xs of
45 case list x tail : list (mapper x) (transform mapper tail)
46 case empty : empty
47 end
48
49 {將列表反轉}
50 def reverse xs =
51 let
52 def _reverse xs r =
53 select xs of
54 case list x tail : _reverse tail (list x r)
55 case empty : r
56 end
57 in _reverse xs empty
58
59 {為列表插入分隔符}
60 def intersperse spliter xs =
61 select xs of
62 case list x xtail :
63 select xtail of
64 case list y ytail : list x (list spliter (intersperse spliter xtail))
65 case empty : list x empty
66 end
67 case empty : empty
68 end
69
70 {將“列表的列表”的所有元素連接起來成為一個長的新列表}
71 def flatten xs =
72 select xs of
73 case list x tail : concat x (flatten tail)
74 case empty : empty
75 end
76
77 {將兩個列表組合成一個pair的列表}
78 def pairlist as bs =
79 select as of
80 case list a atail :
81 select bs of
82 case list b btail : list (pair a b) (pairlist atail btail)
83 case empty : empty
84 end
85 case empty : empty
86 end
87
88 {將列表應用到一個左結合操作符上}
89 def foldl init op xs =
90 select xs of
91 case list x tail : foldl (op init x) op tail
92 case empty : init
93 end
94
95 {將列表應用到一個右結合操作符上}
96 def foldr final op xs =
97 select xs of
98 case list x tail : op x (foldr final op tail)
99 case empty : final
100 end
101
102 {判斷列表的所有元素是否符合某個約束}
103 def all constraint xs = foldl true and (transform constraint xs)
104
105 {判斷列表的是否存在元素是否符合某個約束}
106 def any constraint xs = foldl false or (transform constraint xs)
107
108 {遞歸無窮列表}
109 def iterate op init = list init (iterate op (op init))
110
111 {重復無窮列表}
112 def repeat x = list x (repeat x)
113
114 {循環無窮列表}
115 def cycle xs = concat xs (cycle xs)
116
117 {取列表前n個元素組成子列表}
118 def take n xs =
119 if (iequ n 0)
120 empty
121 select xs of
122 case list x tail : list x (take (isub n 1) tail)
123 case empty : empty
124 end
125
126 {取列表n個元素以后的字列表}
127 def drop n xs =
128 if (iequ n 0)
129 xs
130 select xs of
131 case list x tail : drop (isub n 1) tail
132 case empty : empty
133 end
134
135 {取列表中符合條件的元素組成的新列表}
136 def takeif constraint xs =
137 select xs of
138 case list x tail : if (constraint x) (list x (takeif constraint tail)) (takeif constraint tail)
139 case empty : empty
140 end
141
142 {取列表中不符合條件的元素組成的新列表}
143 def dropif constraint xs =
144 select xs of
145 case list x tail : if (constraint x) (dropif constraint tail) (list x (dropif constraint tail))
146 case empty : empty
147 end
148
149 {判斷一個列表是否另一個列表的前綴}
150 def isprefix eq as bs =
151 select as of
152 case list a atail :
153 select bs of
154 case list b btail : and (eq a b) (isprefix eq atail btail)
155 case empty : false
156 end
157 case empty : true
158 end
159
160 {判斷一個列表是否另一個列表的后綴}
161 def ispostfix eq as bs = isprefix eq (reverse as) (reverse bs)
162
163 {取出列表中指定位置的元素}
164 def elemof n xs = if (iequ n 0) (head xs) (elemof (isub n 1) (tail xs))
165
166 {判斷符合條件的元素在列表中的位置}
167 def findfirst constraint xs =
168 let
169 def _findfirst n xs =
170 select xs of
171 case list x tail : if (constraint x) n (_findfirst (iadd n 1) tail)
172 case empty : ineg 1
173 end
174 in _findfirst 0 xs
175
176 {判斷符合條件的元素在列表中的位置}
177 def find constraint xs =
178 let
179 def _find indices n xs =
180 select xs of
181 case list x tail : _find (if (constraint x) (list n indices) indices) (iadd n 1) tail
182 case empty : indices
183 end
184 in reverse (_find empty 0 xs)
posted on 2008-12-26 08:07
陳梓瀚(vczh) 閱讀(2052)
評論(5) 編輯 收藏 引用 所屬分類:
腳本技術