File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 3030 procedure-arglist
3131 arity
3232 defined?
33+ object->string
34+ eval-string
35+ signature
3336 ; Keywords
3437 keyword?
3538 string->keyword
Original file line number Diff line number Diff line change 2323; ; procedure-arglist - 获取过程的参数列表
2424; ; arity - 获取过程可接受的参数数量范围
2525; ; defined? - 检查符号是否已定义
26+ ; ; object->string - 将对象转换为字符串表示
27+ ; ; eval-string - 将字符串作为 Scheme 代码求值
28+ ; ; signature - 获取函数的类型签名
2629; ; keyword? - 判断是否为关键字
2730; ; string->keyword - 字符串转关键字
2831; ; symbol->keyword - 符号转关键字
File renamed without changes.
Original file line number Diff line number Diff line change 1+ (import (liii check))
2+ (import (liii base))
3+
4+ (check-set-mode! 'report-failed )
5+
6+ ; ; eval-string
7+ ; ; 将字符串作为 Scheme 代码进行求值。
8+ ; ;
9+ ; ; 语法
10+ ; ; ----
11+ ; ; (eval-string str)
12+ ; ; (eval-string str env)
13+ ; ;
14+ ; ; 参数
15+ ; ; ----
16+ ; ; str : string?
17+ ; ; 包含 Scheme 代码的字符串。
18+ ; ;
19+ ; ; env : let?,可选,默认为 (rootlet)
20+ ; ; 要在其中求值代码的环境。
21+ ; ;
22+ ; ; 返回值
23+ ; ; ------
24+ ; ; 字符串中最后一个表达式的求值结果。
25+
26+ ; ; 测试基本表达式
27+ (check (eval-string " 42" ) => 42 )
28+ (check (eval-string " (+ 1 2 3)" ) => 6 )
29+
30+ ; ; 测试字符串
31+ (check (eval-string " \" hello\" " ) => " hello" )
32+
33+ ; ; 测试符号
34+ (check (eval-string " 'symbol" ) => 'symbol )
35+
36+ ; ; 测试列表
37+ (check (eval-string " '(1 2 3)" ) => ' (1 2 3 ))
38+
39+ ; ; 测试 lambda 和调用
40+ (check (eval-string " ((lambda (x) (* x x)) 5)" ) => 25 )
41+
42+ ; ; 测试复杂表达式
43+ (check (eval-string " (let ((a 3) (b 4)) (+ a b))" ) => 7 )
44+
45+ ; ; 测试 if 表达式
46+ (check (eval-string " (if #t 1 2)" ) => 1 )
47+ (check (eval-string " (if #f 1 2)" ) => 2 )
48+
49+ ; ; 测试比较操作
50+ (check (eval-string " (> 5 3)" ) => #t )
51+ (check (eval-string " (< 5 3)" ) => #f )
52+
53+ (check-report)
Original file line number Diff line number Diff line change 1+ (import (liii check))
2+ (import (liii base))
3+
4+ (check-set-mode! 'report-failed )
5+
6+ ; ; loose-car
7+ ; ; 宽松地获取列表的第一个元素(car)。
8+ ; ; 与标准 car 不同,当传入空列表时返回空列表而不是报错。
9+ ; ;
10+ ; ; 语法
11+ ; ; ----
12+ ; ; (loose-car pair-or-empty)
13+ ; ;
14+ ; ; 参数
15+ ; ; ----
16+ ; ; pair-or-empty : pair? 或 null?
17+ ; ; 一个配对(非空列表)或空列表。
18+ ; ;
19+ ; ; 返回值
20+ ; ; ------
21+ ; ; 如果参数是非空列表,返回其第一个元素;
22+ ; ; 如果参数是空列表,返回空列表。
23+
24+ ; ; 测试非空列表
25+ (check (loose-car ' (1 2 3 )) => 1 )
26+ (check (loose-car ' (a b c)) => 'a )
27+ (check (loose-car ' (" hello" " world" )) => " hello" )
28+
29+ ; ; 测试空列表(这是 loose-car 的主要用途)
30+ (check (loose-car '() ) => '() )
31+
32+ ; ; 测试嵌套列表
33+ (check (loose-car ' ((1 2 ) 3 4 )) => ' (1 2 ))
34+
35+ ; ; 测试单元素列表
36+ (check (loose-car ' (only)) => 'only )
37+
38+ (check-report)
Original file line number Diff line number Diff line change 1+ (import (liii check))
2+ (import (liii base))
3+
4+ (check-set-mode! 'report-failed )
5+
6+ ; ; loose-cdr
7+ ; ; 宽松地获取列表的剩余部分(cdr)。
8+ ; ; 与标准 cdr 不同,当传入空列表时返回空列表而不是报错。
9+ ; ;
10+ ; ; 语法
11+ ; ; ----
12+ ; ; (loose-cdr pair-or-empty)
13+ ; ;
14+ ; ; 参数
15+ ; ; ----
16+ ; ; pair-or-empty : pair? 或 null?
17+ ; ; 一个配对(非空列表)或空列表。
18+ ; ;
19+ ; ; 返回值
20+ ; ; ------
21+ ; ; 如果参数是非空列表,返回除第一个元素外的剩余部分;
22+ ; ; 如果参数是空列表,返回空列表。
23+
24+ ; ; 测试非空列表
25+ (check (loose-cdr ' (1 2 3 )) => ' (2 3 ))
26+ (check (loose-cdr ' (a b c)) => ' (b c))
27+ (check (loose-cdr ' (" hello" " world" )) => ' (" world" ))
28+
29+ ; ; 测试空列表(这是 loose-cdr 的主要用途)
30+ (check (loose-cdr '() ) => '() )
31+
32+ ; ; 测试嵌套列表
33+ (check (loose-cdr ' ((1 2 ) 3 4 )) => ' (3 4 ))
34+
35+ ; ; 测试单元素列表
36+ (check (loose-cdr ' (only)) => '() )
37+
38+ ; ; 测试双元素列表
39+ (check (loose-cdr ' (first second)) => ' (second))
40+
41+ (check-report)
Original file line number Diff line number Diff line change 1+ (import (liii check))
2+ (import (liii base))
3+
4+ (check-set-mode! 'report-failed )
5+
6+ ; ; object->string
7+ ; ; 将对象转换为字符串表示。
8+ ; ;
9+ ; ; 语法
10+ ; ; ----
11+ ; ; (object->string obj)
12+ ; ; (object->string obj write)
13+ ; ; (object->string obj write max-len)
14+ ; ;
15+ ; ; 参数
16+ ; ; ----
17+ ; ; obj : any?
18+ ; ; 要转换为字符串的对象。
19+ ; ;
20+ ; ; write : boolean? 或 :readable,可选,默认为 #t
21+ ; ; 如果为 #t,使用 write 风格(可被 read 解析);
22+ ; ; 如果为 :readable,生成可读的字符串表示。
23+ ; ;
24+ ; ; max-len : integer?,可选,默认为很大的数
25+ ; ; 输出字符串的最大长度。
26+ ; ;
27+ ; ; 返回值
28+ ; ; ------
29+ ; ; string?
30+ ; ; 对象的字符串表示。
31+
32+ ; ; 测试基本类型
33+ (check (object->string 42 ) => " 42" )
34+ (check (object->string " hello" ) => " \" hello\" " )
35+ (check (object->string 'symbol ) => " symbol" )
36+ (check (object->string #t ) => " #t" )
37+ (check (object->string #f ) => " #f" )
38+
39+ ; ; 测试列表
40+ (check (object->string ' (1 2 3 )) => " (1 2 3)" )
41+ (check (object->string '() ) => " ()" )
42+
43+ ; ; 测试向量
44+ (check (object->string #(1 2 3 )) => " #(1 2 3)" )
45+
46+ ; ; 测试过程
47+ (check (string? (object->string (lambda (x ) x))) => #t )
48+
49+ ; ; 测试 write 参数为 #f(使用 display 风格)
50+ (check (object->string " hello" #f ) => " hello" )
51+ (check (object->string 42 #f ) => " 42" )
52+
53+ ; ; 测试嵌套结构
54+ (check (object->string ' (1 (2 3 ) 4 )) => " (1 (2 3) 4)" )
55+
56+ (check-report)
Original file line number Diff line number Diff line change 1+ (import (liii check))
2+ (import (liii base))
3+
4+ (check-set-mode! 'report-failed )
5+
6+ ; ; signature
7+ ; ; 获取函数的类型签名(参数类型和返回值类型的约束)。
8+ ; ;
9+ ; ; 语法
10+ ; ; ----
11+ ; ; (signature func)
12+ ; ;
13+ ; ; 参数
14+ ; ; ----
15+ ; ; func : procedure?
16+ ; ; 要获取类型签名的函数。
17+ ; ;
18+ ; ; 返回值
19+ ; ; ------
20+ ; ; pair? 或 #f
21+ ; ; 返回一个点对,表示函数的签名 (return-type . arg-types);
22+ ; ; 如果函数没有签名信息,返回 #f。
23+ ; ;
24+ ; ; 说明
25+ ; ; ----
26+ ; ; 签名可能包含循环结构(用 #1=... 表示),表示接受可变数量的参数。
27+ ; ; 例如 #1=(number? . #1#) 表示返回 number? 并接受任意数量的 number? 参数。
28+
29+ ; ; 测试 car/cdr 的完整签名(返回任意类型,需要 pair? 参数)
30+ (check (signature car) => ' (#t pair?))
31+ (check (signature cdr) => ' (#t pair?))
32+
33+ ; ; 测试 cons 函数签名(返回 pair?,接受两个任意类型参数)
34+ (check (signature cons) => ' (pair? #t #t ))
35+
36+ ; ; 测试基本算术函数(返回 number?,接受可变 number? 参数)
37+ (check (car (signature +)) => 'number? )
38+ (check (car (signature -)) => 'number? )
39+ (check (car (signature *)) => 'number? )
40+ (check (car (signature /)) => 'number? )
41+
42+ ; ; 测试比较函数(返回 boolean?,接受可变 real? 参数)
43+ (check (car (signature =)) => 'boolean? )
44+ (check (car (signature <)) => 'boolean? )
45+ (check (car (signature >)) => 'boolean? )
46+
47+ ; ; 测试 string-append 函数(返回 string?,接受可变 string? 参数)
48+ (check (car (signature string-append)) => 'string? )
49+
50+ ; ; 测试自定义函数(没有签名)
51+ (check (let ((f (lambda (x ) (+ x 1 )))) (signature f)) => #f )
52+
53+ (check-report)
You can’t perform that action at this time.
0 commit comments