國慶7天容易無聊,于是我打算實現(xiàn)一下以前失敗過的一種語言的特性:類型推導(dǎo)。于是順便做一做惰性計算吧。于是我嘗試設(shè)計了一門特性盡可能少的語言,并且強制讓一個函數(shù)的返回值僅跟輸入的參數(shù)有關(guān)。雖然這個特性不適合用來做IO,但是是有辦法解決的,而且不需要修改語言就可以直接支持。
這門語言的定義及其簡單:
1 type TYPE P1 P2..=CTOR T1 T2
| TYPE | 
2
3 func FUNC::TYPE
4 def FUNC P1 P2
= exp
5 
6
7 unit=name
8 unit=value
9 unit=(name->exp)
10 exp=unit
11 exp=exp unit
12 exp=let DECLARATIONS in exp
13 exp=select exp of
14 case value : exp
15 case name : exp
16 case CTOR name/value
: exp
17 else : exp
18 end
需要預(yù)先定義的部分也是很少的:
1 type int;
2 type char;
3 type bool = true | false
4 type list T = empty
5 | list T (list T)
6
7 func iadd::int->int->int call "add"
8 func isub::int->int->int call "sub"
9 func imul::int->int->int call "mul"
10 func idiv::int->int->int call "div"
11 func imod::int->int->int call "mod"
12 func ilg::int->int->bool call "ilg"
13 func ism::int->int->bool call "ism"
14 func iequ::int->int->bool call "iequ"
15 func chr::int->char call "chr"
16 func ord::char->int call "ord
于是我嘗試實現(xiàn)了if、邏輯運算符以及itoa和atoi兩個函數(shù):
1 func not::bool->bool
2 def not a = select a of
3 true : false
4 false : true
5 end
6
7 func and::bool->bool->bool
8 def and a b = select a of
9 case true : b
10 case false : false
11 end
12
13 func or::bool->bool->bool
14 def aor a b = select a of
15 case true : true
16 case false : b
17 end
18
19 func xor::bool->bool->bool
20 def xor a b = select a of
21 case true : not b
22 case false : b
23 end
24
25 func T if::bool->T->T
26 def if cond t f = select cond of
27 case true : t
28 case false : f
29 end
30
31 func ineg::int->int
32 def ineg num = isub 0 num
33
34 func coffset::char->int->char
35 def coffset c i = chr (iadd (ord c) i)
36
37 func itoa::int->list char
38 def itoa a = if (iequ a 0) (list '0' empty) (if (ism a 0)
39 (list '-' (itoa (ineg a)))
40 let
41 func _itoa::int->(list char)->(list char)
42 def _itoa a chs = select a of
43 case 0 : chs
44 case else : _itoa (div a 10) (list (coffset '0' (mod a 10)) chs)
45 end
46 in _itoa a empty)
47
48 func atoi::list char->int
49 def atoi chs = select chs of
50 case empty : 0
51 case list '-' chs : ineg (atoi chs)
52 case c chs : iadd (imul 10 (isub (ord c) (ord '0'))) (atoi chs)
53 end
當然,語法絕大部分抄了haskell和LISP,因為實在不想再重新設(shè)計了,反正到頭來差不多也是這個樣子的。7天應(yīng)該能做完它。
posted on 2008-09-28 07:14
陳梓瀚(vczh) 閱讀(2149)
評論(4) 編輯 收藏 引用 所屬分類:
腳本技術(shù)