https://github.com/crossoverjie/gscript
💪🏻This is a statically and strongly typed language written in Go.|GScript 是用 Go 编写的静态、强类型的脚本语言。
https://github.com/crossoverjie/gscript
antlr4 compile go golang language programming-language
Last synced: 6 months ago
JSON representation
💪🏻This is a statically and strongly typed language written in Go.|GScript 是用 Go 编写的静态、强类型的脚本语言。
- Host: GitHub
- URL: https://github.com/crossoverjie/gscript
- Owner: crossoverJie
- License: bsd-3-clause
- Created: 2022-05-23T16:02:29.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-11-08T07:51:02.000Z (almost 3 years ago)
- Last Synced: 2025-03-26T23:08:27.704Z (6 months ago)
- Topics: antlr4, compile, go, golang, language, programming-language
- Language: Go
- Homepage: https://gscript.crossoverjie.top/
- Size: 2.73 MB
- Stars: 222
- Watchers: 5
- Forks: 24
- Open Issues: 2
-
Metadata Files:
- Readme: README-ZH.md
- License: LICENSE
Awesome Lists containing this project
README
```
_ _
___ ___ ___ ___|_|___| |_
| . |_ -| _| _| | . | _|
|_ |___|___|_| |_| _|_|
|___| |_|```
🎮[Play](#playground) | 📘[特性](#特性) | 🌰[例子](#例子) | 🔧[安装](#安装) | 👾[REPL](#repl) | 🎉[语法](#语法) | 🎁[标准库](#标准库) | 💡[联系作者](#联系作者) | 🇦🇺[英文文档](https://github.com/crossoverjie/gscript/blob/main/README.md)
# 介绍
这是一门用 `Go` 编写的一款**静态、强类型**的脚本语言,大部分语法参考了 `Java` 以及少量的 `Go`。
## 目标
提供类似于以脚本形式编写 Go 语言的能力,保留 Go 语言优点(goroutine等),新增更多易用性的语法糖。> 当前为 Alpha 版本仅供学习与实验。
运行:
hello_world.gs:
```js
println("hello world");
``````shell
❯ gscript hello_world.gs
hello world
```# Playground
在线地址: [https://gscript.crossoverjie.top/](https://gscript.crossoverjie.top/)
源码地址: [https://github.com/crossoverJie/gscript-homepage](https://github.com/crossoverJie/gscript-homepage)

# 特性
- [x] [class声明](#class)
- [x] [函数声明与调用](#函数)
- [x] [基本类型](#基本类型): `int/string/float/bool/byte`
- [x] [array数组类型](#数组)
- [x] `any` [通用类型](#any)
- [x] 特殊类型 `nil`
- [x] 函数类型
- [x] [闭包:函数一等公民](#闭包)
- [x] [内置函数](#内置函数)
- [x] [标准库](#标准库)
- [x] [Map](#map)
- [x] [可变参数](#可变参数)
- [x] [运算符重载](#运算符重载)
- [x] [原生 `json` 支持](#内置函数)
- [x] [原生 `http` 包支持](#http)
- [x] 案例
- [x] LeetCode
- [x] [判断链表是否有环 ](https://github.com/crossoverJie/gscript/blob/main/example/linked_list_cycle141.gs)
- [x] [两数之和](https://github.com/crossoverJie/gscript/blob/main/example/leetcode/two_sum.gs)
- [x] [打印斐波那契数列 ](#打印斐波那契数列)
- [x] [打印杨辉三角 ](#杨辉三角)
- [x] [HTTP Service](https://github.com/crossoverJie/gscript/blob/main/example/http_server.gs)
- [ ] 包管理
- [ ] 单测命令行工具# 例子
## Hello world
```js
println("hello world");
```## 打印斐波那契数列
```js
func int() fib(){
int a = 0;
int b = 1;
int fibonacci(){
int c = a;
a = b;
b = a+c;
return c;
}
return fibonacci;
}func int() f = fib();
for (int i = 0; i < 10; i++){
println(f());
}
```## 网站应用
这是用 `GScript` 编写的动态网页:
[https://gscript.crossoverjie.top/api/index](https://gscript.crossoverjie.top/api/index)
源码地址:
[https://github.com/crossoverjie/gscript-homepage](https://github.com/crossoverjie/gscript-homepage)## 杨辉三角
```js
int num(int x,int y){
if (y==1 || y ==x) {
return 1;
}
int v1 = num(x - 1, y - 1);
int v2 = num(x - 1, y);
int c = v1+v2;
// int c = num(x - 1, y - 1)+num(x - 1, y);
return c;
}printTriangle(int row){
for (int i = 1; i <= row; i++) {
for (int j = 1; j <= row - i; j++) {
print(" ");
}
for (int j = 1; j <= i; j++) {
print(num(i, j) + " ");
}
println("");
}
}printTriangle(7);
// output:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
```---
更多例子:[https://github.com/crossoverJie/gscript/tree/main/example](https://github.com/crossoverJie/gscript/tree/main/example)
# 安装
## 二进制文件
在这里下载最新的二进制文件 [here](https://github.com/crossoverJie/gscript/releases)
## 🐳Docker
```shell
docker pull crossoverjie/gscript
```### REPL
```shell
docker run --rm -it crossoverjie/gscript:latest gscript
```### 运行脚本
```shell
docker run --rm -v $PWD:/usr/src/gscript -w /usr/src/gscript crossoverjie/gscript gscript {yourpath}/temp.gs
```## 源码构建
```shell
git clone https://github.com/crossoverJie/gscript.git
cd gscript
make build-code
./gscript
```# REPL
```shell
> ./gscript
```
# 语法
## 基本类型
当前版本支持 `int/string/float/bool` 四种基本类型以及 `nil` 特殊类型。
变量声明语法:`type identifier (= expr)?`。
```js
int a=10;
string b,c;
float e = 10.1;
bool f = false;
byte by = 1;
string x = ^
{
"name": "bob",
"age": 20,
"skill": {
"lang": [
{
"go": {
"feature": [
"goroutine",
true
]
}
}
]
}
}^;
```## 数组
数组声明语法:`('[' DECIMAL_LITERAL ']')? '{' (variableInitializer (',' variableInitializer)* (',')? )? '}'`
```js
// 声明并初始化
int[] a={1,2,3};
println(a);// 声明一个空数组并指定大小
int[] table = [4]{};println("");
// 向数组 append 数据
a = append(a,4);
println(a);
for(int i=0;i 当函数没有返回值时,可以声明为 void 或直接忽略返回类型。## 闭包
在 `GScript` 中,函数作为一等公民可以作为变量传递,同时也能实现闭包。
函数类型语法:`func typeTypeOrVoid '(' typeList? ')'`
```js
// 外部变量,全局共享。
int varExternal =10;
func int(int) f1(){
// 闭包变量对每个闭包单独可见
int varInner = 20;
int innerFun(int a){
println(a);
int c=100;
varExternal++;
varInner++;
return varInner;
}
return innerFun;
}// f2 作为一个函数类型,接收的是一个返回值和参数都是 int 的函数。
func int(int) f2 = f1();
for(int i=0;i<2;i++){
println("varInner=" + f2(i) + ", varExternal=" + varExternal);
}
println("=======");
func int(int) f3 = f1();
for(int i=0;i<2;i++){
println("varInner=" + f3(i) + ", varExternal=" + varExternal);
}
```最终输出如下:
```shell
0
varInner=21, varExternal=11
1
varInner=22, varExternal=12
=======
0
varInner=21, varExternal=13
1
varInner=22, varExternal=14```
## 可变参数
`GScript` 支持函数定义可变参数,语法如下:
```js
int add(string s, int ...num){
println(s);
int sum = 0;
for(int i=0;i >=`> 重载函数名称必须是 **operator**,名称后跟上运算符即可重载。
```js
class Person{
int age;
Person(int a){
age = a;
}
}
Person operator + (Person p1, Person p2){
Person pp = Person(p1.age+p2.age);
return pp;
}
Person operator - (Person p1, Person p2){
Person pp = Person(p1.age-p2.age);
return pp;
}
Person operator * (Person p1, Person p2){
Person pp = Person(p1.age * p2.age);
return pp;
}
Person operator / (Person p1, Person p2){
Person pp = Person(p1.age / p2.age);
return pp;
}
bool operator == (Person p1, Person p2){
return p1.age==p2.age;
}
bool operator != (Person p1, Person p2){
return p1.age!=p2.age;
}
bool operator > (Person p1, Person p2){
return p1.age>p2.age;
}
bool operator >= (Person p1, Person p2){
return p1.age>=p2.age;
}
bool operator < (Person p1, Person p2){
return p1.age p2;
println("b3=="+b3);
assertEqual(b3,false);bool b4 = p1 >= p2;
println("b4=="+b4);
assertEqual(b4,false);bool b5 = p1 < p2;
println("b5=="+b5);
assertEqual(b5,true);bool b6 = p1 <= p2;
println("b6=="+b6);
assertEqual(b6,true);
```更多样例请参考:[https://github.com/crossoverJie/gscript/tree/main/example](https://github.com/crossoverJie/gscript/tree/main/example)
# 标准库
标准库源码:[https://github.com/crossoverJie/gscript/tree/main/internal](https://github.com/crossoverJie/gscript/tree/main/internal)
## 内置函数
```js
printf("hello %s ","123");
printf("hello-%s-%s ","123","abc");
printf("hello-%s-%d ","123",123);string s = sprintf("nice to meet %s", "you");
println(s);
assertEqual(s,"nice to meet you");int[] a={1,2,3};
// len 返回数组大小
println(len(a));// 向数组追加数据
append(a,4);
println(a);
// output: [1,2,3,4]// 断言函数,不相等时会抛出运行时异常,并中断程序。
assertEqual(len(a),4);// 返回 hashcode
int hashcode = hash(key);// 序列化 JSON 字符串
class P{
string name;
P(string n){
name = n;
}
}
class Object{
P p;
int x;
Object(P pp, int xx){
p = pp;
x = xx;
}
}
P p1 = P("abc");
Object o1 = Object(p1, 100);
string json = JSON(o1);
println(json); //{"p":{"name":"abc"},"x":100}// 查询 JSON
int x = JSONGet(json,"x");
println(x);
assertEqual(x,100);string name = JSONGet(json,"p.name");
println(name);
assertEqual(name,"abc");// 获取启动参数
System s = System();
string[] args = s.getOSArgs();
```> 更多 JSON 查询语法请参考:[xjson](https://github.com/crossoverJie/xjson#arithmetic-syntax)
# Map
## 函数定义
```js
class Map{
put(any key, any value){}
any get(any key){}
}
```## 用法
```js
int count =100;
Map m1 = Map();
for (int i=0;i
hello
current ^+ local +^
hahaha