马虎浏览完一遍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 str
补充:软件开发 , C++ ,