Skip to content

Commit 75d040c

Browse files
committed
!1019 [216_55] 在 (liii base) 中导出更多 s7 内置函数
1 parent 9c91fdd commit 75d040c

8 files changed

Lines changed: 247 additions & 0 deletions

File tree

goldfish/liii/base.scm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
procedure-arglist
3131
arity
3232
defined?
33+
object->string
34+
eval-string
35+
signature
3336
; Keywords
3437
keyword?
3538
string->keyword

tests/liii/base-test.scm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
;; procedure-arglist - 获取过程的参数列表
2424
;; arity - 获取过程可接受的参数数量范围
2525
;; defined? - 检查符号是否已定义
26+
;; object->string - 将对象转换为字符串表示
27+
;; eval-string - 将字符串作为 Scheme 代码求值
28+
;; signature - 获取函数的类型签名
2629
;; keyword? - 判断是否为关键字
2730
;; string->keyword - 字符串转关键字
2831
;; symbol->keyword - 符号转关键字
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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)

tests/liii/base/loose-car-test.scm

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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)

tests/liii/base/loose-cdr-test.scm

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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)
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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)

tests/liii/base/signature-test.scm

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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)

0 commit comments

Comments
 (0)