看归看了,但习题没做,学习效果打了折扣。
基于根搜索的垃圾收集:
内存申请还是用的 C++ new,垃圾收集只负责在适当的时候 delete 。
变量为动态作用域。
语法也受到 Common Lisp 的影响。
目前支持:
"" 字符串 "" "ab"
# 字符 #c #?
' QUOTE(将其后符号视为符号,而非变量或其它。仅仅是其后的一个(暂时如此))
; 单行注释 ; 这是注释
13 整数 12 +12 -3 0 +0 -0
if if 语句 (if c x) (if c x y)
var 变量定义 (var x) (var x 100)
begin 执行语句序列
func 函数定义 (func f(参数) (语句)(语句)(语句) )
函数可嵌套定义
lambda ((lambda (x) (* x x)) 7) ==> 49 (var fa (lambda () ()))
(set! x y) x = y
(pair x y)
(first x)
(rest x)
(set-first! x z)
(set-rest! x z)
(list a b c d)
(+ ... ) (+ 100 x y) ==> 100 + x + y
(- ... ) (- x) ==> -x (- x y) ==> x - y
(* ... ) (* x y z)
(/ ... ) (/ x y z)
(get-char)
(put-char)
(get-string)
(put-string)
(get-line)
(put-line)
(string->integer)
(integer->string)
(< ...)
(> ...)
(= ...)
(<= ...)
(>= ...)
(!= ...)
nil?
pair?
integer?
bool?
char?
lambda?
func?
1
; TestZ.txt
2
;
3
; Copyright (C) 2012, coreBugZJ, all rights reserved.
4
;
5
; 测试用文件 A
6
; ANSI GB2312 编码
7
;
8
; 测试基本功能
9
;
10
11
12
13
(begin
14
; test output -----------------------------------------
15
(var test-output "test output")
16
(put-line test-output)
17
(put-string test-output)
18
(put-line test-output)
19
(put-string " ")
20
(put-char #c)
21
(put-line "")
22
(var ch #c)
23
(put-char ch)
24
(var sp " ")
25
(put-line sp)
26
27
; test string -----------------------------------------
28
(var test-string "test string")
29
(put-line test-string)
30
31
(var sp " ")
32
(var sa "abc")
33
(var sb)
34
(put-string sa)
35
(put-string sp)
36
(put-line sa)
37
38
(set! sb sa)
39
(put-string sb)
40
(put-string sp)
41
(put-line sb)
42
43
(set! sb "def")
44
(put-string sb)
45
(put-string sp)
46
(put-line sb)
47
48
; test empty string ---------------------------
49
(var test-empty-string "test empty string")
50
(var es "")
51
(put-string test-empty-string)
52
(put-string es)
53
(put-line test-empty-string)
54
55
; test integer ----------------------------------------
56
(var test-integer "test integer")
57
(put-line test-integer)
58
59
(var ia)
60
(var ib 100)
61
(var ic -13)
62
(var id +23)
63
(var ie +0)
64
(var if -0)
65
(var ig (- (+ id ib ic) (+ ib ic)))
66
(var str (integer->string ig))
67
(put-line str)
68
(var ih (- id))
69
(set! str (integer->string ih))
70
(put-line str)
71
(set! ig (* id ib (/ ib id)))
72
(set! str (integer->string ig))
73
(put-line str)
74
75
; test integer <-> string -----------------------------
76
(var test-integer<->string "test-integer<->string")
77
(put-line test-integer<->string)
78
79
(var i 1234)
80
(var s "4321")
81
(put-line (integer->string i))
82
(put-line (integer->string (string->integer s)))
83
84
; test char -------------------------------------------
85
(var test-char "test char")
86
(put-line test-char)
87
88
(var ca #a)
89
(var cb)
90
(put-char ca)
91
(set! cb ca)
92
(put-char cb)
93
(var eline " ")
94
(put-line eline)
95
96
; test input ------------------------------------------
97
(var test-input "test input")
98
(put-line test-input)
99
100
(var input-prompt "input a char")
101
(put-line input-prompt)
102
(var ch (get-char)) ; 重复定义,不判重
103
(put-char ch)
104
(var sp " ")
105
(put-line sp)
106
107
(set! input-prompt "input a string")
108
(put-line input-prompt)
109
(var str (get-string))
110
(put-line str)
111
112
; test func -------------------------------------------
113
(var test-func "test func")
114
(put-line test-func)
115
116
(func square(x) (* x x))
117
(var y 11)
118
(var z (square y))
119
(put-line (integer->string z))
120
121
(func square-sum(x y)
122
(+ (square x) (square y)))
123
(put-line (integer->string (square-sum 3 7)))
124
125
(func fu(x y)
126
(func half(x) (/ x 2))
127
(func double(x) (+ x x))
128
(+ (half x) (double y))
129
)
130
(var x 26)
131
(put-line (integer->string (fu x 11)))
132
133
(var y ((lambda (x) (* x x x)) 3))
134
(func put-integer(i) (put-string (integer->string i)))
135
(func new-line() (var sp "") (put-line sp))
136
137
(put-integer y) ; 27
138
(new-line)
139
140
(put-line "abc")
141
(put-line "")
142
(put-line "def")
143
(put-string " ")
144
(put-char #c)
145
(new-line)
146
(put-integer -13)
147
(new-line)
148
(put-integer (+ 12 7))
149
(put-line "")
150
(func new-line() (put-line ""))
151
(new-line)
152
(put-char #$)
153
154
) ; end
155
1
; TestCompareZ.txt
2
;
3
; Copyright (C) 2012, coreBugZJ, all rights reserved.
4
;
5
; 测试用文件 B
6
; ANSI GB2312 编码
7
;
8
; 测试 基本比较函数
9
10
(begin
11
; char --------------------------------------
12
(var c1 #a)
13
(var c2 #z)
14
(var c3 #u)
15
16
(var c-min (if (< c1 c2) c1 c2))
17
(set! c-min (if (< c3 c-min) c3 c-min))
18
(put-char c-min) ; a
19
(put-line)
20
21
(var c-max (if (> c1 c2) c1 c2))
22
(set! c-max (if (> c3 c-max) c3 c-max))
23
(put-char c-max) ; z
24
(put-line)
25
26
; integer -----------------------------------
27
(func put-integer(i)
28
(put-string (integer->string i))
29
)
30
31
(var i1 1)
32
(var i2 3)
33
(var i3 7)
34
35
(var i-min (if (< i1 i2) i1 i2))
36
(set! i-min (if (< i3 i-min) i3 i-min))
37
(put-integer i-min) ; 1
38
(put-line)
39
40
(var i-max (if (> i1 i2) i1 i2))
41
(set! i-max (if (> i3 i-max) i3 i-max))
42
(put-integer i-max) ; 7
43
(put-line)
44
45
(var i (if (= i1 i-min) i1 i2))
46
(put-integer i) ; 1
47
(put-line)
48
49
)
50
1
; TestScopeZ.txt
2
;
3
; Copyright (C) 2012, coreBugZJ, all rights reserved.
4
;
5
; 测试用文件 C
6
; ANSI GB2312 编码
7
;
8
; 综合测试 作用域,lambda,函数,环境模型
9
10
11
12
; case 3
13
(begin
14
(func fs(fs_x)
15
(lambda (lam_y)
16
(set! fs_x (- fs_x lam_y))
17
(put-line (integer->string fs_x))
18
)
19
)
20
(var fa (fs 71))
21
(fa 3) ; 68
22
(fa 7) ; 61
23
24
(var fb (fs 100))
25
(fb 10) ; 90
26
(fa 3) ; 58
27
(fb 19) ; 71
28
29
30
31
)
32
33
34
35
36
37
; case 2 ok
38
(begin
39
(var fs (lambda (x) (+ x x)))
40
(put-line (integer->string (fs 3)))
41
)
42
43
44
45
; case 1 ok
46
(begin
47
(func put-integer(i)
48
(put-line (integer->string i))
49
)
50
51
(func fa(x) (+ x x))
52
(put-integer (fa 7))
53
54
(lambda (y) (- y y))
55
(put-integer ((lambda (z) (* z z)) 10))
56
57
) ; end
58
1
; TestPairZ.txt
2
;
3
; Copyright (C) 2012, coreBugZJ, all rights reserved.
4
;
5
; 测试用文件 D
6
; ANSI GB2312 编码
7
;
8
; 测试 pair 系列基本函数
9
10
11
(begin
12
(put-string (list #x #a #b #c #d))
13
(put-line (list)) ; xabcd
14
(put-string (pair #x (pair #y nil)))
15
(put-line) ; xy
16
17
(var pa (pair 100 200))
18
(put-line (integer->string (first pa))) ; 100
19
(put-line (integer->string (rest pa))) ; 200
20
21
22
(func length(lis)
23
(if (nil? lis)
24
0
25
(+ 1 (length (rest lis)))
26
)
27
)
28
29
(func put-integer(i)
30
(put-line (integer->string i))
31
)
32
33
(var la (pair 1 (pair 2 nil)))
34
(put-line (integer->string (length la))) ; 2
35
36
(var lb (list 1 2 3 4 5))
37
(put-line (integer->string (length lb))) ; 5
38
39
40
(put-integer (first la)) ; 1
41
(set! la (rest la))
42
(put-integer (first la)) ; 2
43
(set-first! la 6)
44
(put-integer (first la)) ; 6
45
(set-rest! la 7)
46
(set! la (rest la))
47
(put-integer la) ; 7
48
49
(var vn)
50
(put-integer (if (= nil vn) 1000 2000))
51
52
)
53
1
; TestGcZ.txt
2
;
3
; Copyright (C) 2012, coreBugZJ, all rights reserved.
4
;
5
; 测试用文件 E
6
; ANSI GB2312 编码
7
;
8
; 测试垃圾收集
9
10
11
12
(begin
13
(func new(n)
14
(if (= 0 n)
15
nil
16
(pair n (new (- n 1)))
17
)
18
)
19
20
(var ref)
21
22
(func test-gc(n)
23
(if (= 0 n)
24
nil
25
(begin
26
(set! ref (new 2))
27
(test-gc (- n 1))
28
)
29
)
30
)
31
32
(test-gc 2)
33
34
)
35
1
; TestErrorZ.txt
2
;
3
; Copyright (C) 2012, coreBugZJ, all rights reserved.
4
;
5
; 测试用文件 F
6
; ANSI GB2312 编码
7
;
8
; 测试错误定位
9
10
11
(begin
12
(var a "a")
13
(var b 3)
14
(var c $) ; error lin=14 col=16
15
(if (= a b) a b) ; error lin=15 col=13
16
)
17