coreBugZJ

此 blog 已弃。

马虎浏览完一遍 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?

 



  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
12case 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
37case 2 ok
38(begin
39        (var fs (lambda (x) (+ x x)))
40        (put-line (integer->string (fs 3)))
41)
42
43
44
45case 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

posted on 2012-04-20 16:19 coreBugZJ 阅读(2001) 评论(2)  编辑 收藏 引用 所属分类: ProgrammingLanguageLisp

Feedback

# re: 马虎浏览完一遍 SICP ,设计一个玩具Lisp方言,用C++实现一个玩具解释器,勿笑 2012-04-21 14:48 bennycen

Orz!!!仰慕啊  回复  更多评论   

# re: 马虎浏览完一遍 SICP ,设计一个玩具Lisp方言,用C++实现一个玩具解释器,勿笑 2012-04-21 16:35 coreBugZJ

@bennycen
仰慕你的 AnyC 呀,强太多了!!!我们这学期才开编译原理的课,还不会,所以用了 类Lisp 的语法(当然我也挺喜欢这种语法的),仰慕你的 类C 语法呀!和虚拟机!  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理