马虎浏览完一遍 SICP ,设计一个玩具Lisp方言,用C++实现一个玩具解释器,勿笑
看归看了,但习题没做,学习效果打了折扣。
基于根搜索的垃圾收集:
内存申请还是用的 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?
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
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
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
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
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
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