Skip to content

Commit 2ee6253

Browse files
authored
Merge pull request #18 from codefuse-ai/lhk_dev
[doc] Add contents in doc/4_godelscript_language.md
2 parents 74a1979 + edec314 commit 2ee6253

File tree

1 file changed

+58
-33
lines changed

1 file changed

+58
-33
lines changed

doc/4_godelscript_language.md

Lines changed: 58 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
11
# GödelScript 查询语言
22

3+
## 目录
4+
5+
- [GödelScript 基本概念和语法](#gödelscript-基本概念和语法)
6+
- [简介](#简介)
7+
- [基本程序构成](#基本程序构成)
8+
- [基础类型和编译器内建函数](#基础类型和编译器内建函数)
9+
- [函数](#函数)
10+
- [语句](#语句)
11+
- [Schema](#schema)
12+
- [数据库](#数据库)
13+
- [Trait](#trait)
14+
- [Import](#import)
15+
- [Query](#query)
16+
- [Ungrounded Error: 未赋值/未绑定错误](#ungrounded-error-未赋值未绑定错误)
17+
- [查询示例](#查询示例)
18+
- [Java](#java)
19+
- [Python](#python)
20+
- [JavaScript](#javascript)
21+
- [XML](#xml)
22+
- [Go](#go)
23+
- [查询调试和优化技巧](#查询调试和优化技巧)
24+
- [Schema 传参导致笛卡尔积过大](#schema-传参导致笛卡尔积过大)
25+
- [多层 for 导致笛卡尔积过大](#多层-for-导致笛卡尔积过大)
26+
- [不要滥用`@inline`](#不要滥用inline必须用inline的优化策略)
27+
- [在本机使用查询脚本流程](#在本机使用查询脚本流程)
28+
329
## GödelScript 基本概念和语法
430

531
### 简介
@@ -30,13 +56,13 @@ GödelScript 编译器主要应用场景为:
3056

3157
GödelScript 程序可能包含:
3258

33-
- 模块和符号[引用语句](#import)
34-
- Schema [类型声明](#schema)
35-
- 数据库[类型声明](#数据库)
36-
- Trait [声明](#trait)
37-
- [方法实现](#方法实现)
38-
- 函数[声明和实现](#函数)
39-
- Query [声明](#query)
59+
- [模块和符号引用](#import)
60+
- [Schema 类型声明](#schema)
61+
- [数据库类型声明](#数据库)
62+
- [Trait 声明](#trait)
63+
- [Schema 方法实现](#方法实现)
64+
- [函数声明和实现](#函数)
65+
- [Query 声明](#query)
4066

4167
包含以上所有组成内容的样例:
4268

@@ -99,15 +125,14 @@ GödelScript 采用类 C 语言的注释方式。
99125
/*
100126
* 1. 多行注释
101127
* 2. 多行注释
102-
* 3. 多行注释
103128
*/
104129
```
105130

106131
#### `main` 函数
107132

108133
GödelScript 查询脚本可以包含`main`函数,该函数无返回值。在不实现`main`函数,且没有写 query 声明的情况下,程序不会输出。
109134

110-
更多详细内容请看 [`main`函数](#gödelscript-main-函数)
135+
更多详细内容请看 [main 函数](#gödelscript-main-函数)
111136

112137
```rust
113138
fn main() {
@@ -496,9 +521,9 @@ fn a() -> int {
496521
}
497522

498523
fn b() -> *int {
499-
yield 1
500-
yield 2
501-
yield 3
524+
yield 1
525+
yield 2
526+
yield 3
502527
}
503528
```
504529

@@ -536,9 +561,9 @@ GödelScript 使用如下方式来声明和实现`schema`的相关方法:
536561
impl File {
537562
// 静态方法
538563
fn f1() -> ... {...}
539-
// 成员方法,第一个参数必须为 self
540-
fn f2(self) -> ... {...}
541-
...
564+
// 成员方法,第一个参数必须为 self
565+
fn f2(self) -> ... {...}
566+
...
542567
}
543568
```
544569
##### 静态方法
@@ -678,7 +703,7 @@ schema File {
678703
impl File {
679704
@data_constraint
680705
fn __all__() -> *File {...}
681-
fn getId(self) -> int {...}
706+
fn getId(self) -> int {...}
682707
fn staticMethod() -> string {return "File"}
683708
}
684709

@@ -947,11 +972,11 @@ database MyDB {
947972

948973
```rust
949974
query example from
950-
coref::java::Location loc in coref::java::Location(coref::java::JavaDB::load("..."))
975+
coref::java::Location loc in coref::java::Location(coref::java::JavaDB::load("..."))
951976
where
952-
...
977+
...
953978
select
954-
...
979+
...
955980
```
956981

957982
- schema 静态方法调用
@@ -971,12 +996,12 @@ Query 用于进行一些简单的查询,编写的 query 一定会被输出,
971996

972997
```rust
973998
query 名字 from
974-
变量名 in 初始值,
999+
变量名 in 初始值,
9751000
变量名 in 初始值,
9761001
变量名 in 初始值
9771002
where 条件
9781003
select 值 as 输出的列名
979-
as 输出的列名,
1004+
as 输出的列名,
9801005
as 输出的列名,
9811006
as 输出的列名
9821007
```
@@ -987,7 +1012,7 @@ from 列表中的变量声明无需加上类型标注,编译器会进行自动
9871012

9881013
```rust
9891014
query hello_world from
990-
info in "hello world"
1015+
info in "hello world"
9911016
select info as greeting
9921017
```
9931018

@@ -1063,14 +1088,14 @@ fn class_method(className: string, methodName: string, methodSignature: string)
10631088
GödelScript 会将未与数据绑定的符号判定为`ungrounded(未赋值/未绑定)`。基本判定规则为:
10641089

10651090
- 未初始化的/未被使用的/未与集合绑定的符号
1066-
- 未被绑定的`int``string`参数
1091+
- 未被绑定的`int` `string`参数
10671092
- 未被使用的 database 类型的参数
10681093
- 函数体有语句,但是没有任何返回语句
10691094
- 在取非运算块中进行绑定的符号
10701095
- 例如 `!(__tmp = 1)`,`__tmp`会被认为是未绑定的
10711096
- 在取非运算块中调用 inline 函数或数据构造函数
10721097

1073-
#### 未使用的 database/基础类型参数
1098+
#### 1. 未使用的 database/基础类型参数
10741099

10751100
函数代码块中,如果有一个语句分支没有使用参数中的`database`或者基础类型参数,则一定会导致`ungrounded`:
10761101

@@ -1091,7 +1116,7 @@ impl XXX {
10911116
if (self.hasAttribute(attributeName)) {
10921117
return self.getValueByAttributeName(attributeName)
10931118
}
1094-
if (!self.hasAttribute(attributeName) {
1119+
if (!self.hasAttribute(attributeName)) {
10951120
return "null"
10961121
}
10971122
}
@@ -1104,7 +1129,7 @@ fn xxx() -> xx {
11041129
}
11051130
```
11061131

1107-
#### 函数体有语句的情况下无返回语句
1132+
#### 2. 函数体有语句的情况下无返回语句
11081133

11091134
GödelScript 允许一个函数体不包含任何语句,即空函数体。但是如果函数体中有其他语句,则 GödelScript 会要求必须有至少一个返回语句,否则就会出现 ungrounded error。
11101135

@@ -1118,7 +1143,7 @@ fn test() -> int {
11181143
}
11191144
```
11201145

1121-
#### 取非运算块中使用 inline 函数或数据构造函数
1146+
#### 3. 取非运算块中使用 inline 函数或数据构造函数
11221147

11231148
上文提到了可以通过`@inline`注解来规避 ungrounded error。但是如果在取非运算中使用了含有该注解的函数,则必然会导致 ungrounded error。
11241149

@@ -1142,7 +1167,7 @@ if (!check(for_test())) {
11421167
}
11431168
```
11441169

1145-
#### 对链式调用的取非运算
1170+
#### 4. 对链式调用的取非运算
11461171

11471172
GödelScript 未对该情况执行`ungrounded`检测,但是该写法会导致在 Soufflé 中报`ungrounded`错误:
11481173

@@ -1226,7 +1251,7 @@ fn main() {
12261251
use coref::java::*
12271252

12281253
fn default_java_db() -> JavaDB {
1229-
return JavaDB::load("coref_java_src.db")
1254+
return JavaDB::load("coref_java_src.db")
12301255
}
12311256

12321257
/**
@@ -1243,7 +1268,7 @@ fn class_hierarchy(className : string, superClassName : string) -> bool {
12431268
}
12441269

12451270
fn main() {
1246-
output(class_hierarchy())
1271+
output(class_hierarchy())
12471272
}
12481273
```
12491274

@@ -1254,7 +1279,7 @@ fn main() {
12541279
use coref::java::*
12551280

12561281
fn default_java_db() -> JavaDB {
1257-
return JavaDB::load("coref_java_src.db")
1282+
return JavaDB::load("coref_java_src.db")
12581283
}
12591284

12601285
// Find all methods of the class
@@ -1268,7 +1293,7 @@ fn methods(className : string, methodName : string) -> bool {
12681293
}
12691294

12701295
fn main() {
1271-
output(methods())
1296+
output(methods())
12721297
}
12731298
```
12741299

@@ -2191,7 +2216,7 @@ fn getByIndex(self) -> Expression {
21912216
return e
21922217
}
21932218
}
2194-
}
2219+
}
21952220
}
21962221
```
21972222

0 commit comments

Comments
 (0)