社区精选 |终于实现了一门属于自己的编程语言
今天小编为大家带来的是社区作者 crossoverJie 的文章。
前言
特性
println("hello world");
❯ gscript hello_world.gs
hello world

例子
void 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 < 5; i++){
println(f());
}
0
1
1
2
3
// fib returns a function that returns
// successive Fibonacci numbers.
func fib() func() int {
a, b := 0, 1
return func() int {
a, b = b, a+b
return a
}
}
func main() {
f := fib()
// Function calls are evaluated left-to-right.
fmt.Println(f(), f(), f(), f(), f())
}
语法
基本类型
先来看看基本类型,目前支持 int/string/float/bool 四种基本类型以及 nil 特殊类型。
变量声明语法和 Java 类似:
int a=10;
string b,c;
float e = 10.1;
bool f = false;
数组
// 声明并初始化
int[] a={1,2,3};
println(a);
// 声明一个空数组并指定大小
int[] table = [4]{};
println();
// 向数组 append 数据
a = append(a,4);
println(a);
for(int i=0;i<len(a);i++){
println(a[i]);
}
// 通过下标获取数组数据
int b=a[2];
println(b);
int[] a=[2]{};
println("数组大小:"+len(a));
a = append(a,1);
println("数组大小:"+len(a));
println(a);
a[0]=100;
println(a);
数组大小:2
数组大小:3
[<nil> <nil> 1]
[100 <nil> 1]
Class
class ListNode{
int value;
ListNode next;
ListNode(int v, ListNode n){
value =v;
next = n;
}
}
// 调用构造函数时不需要使用 new 关键字。
ListNode l1 = ListNode(1, nil);
// 使用 . 调用对象属性或函数。
println(l1.value);
class Person{
int age=10;
string name="abc";
int getAge(){
return 100+age;
}
}
// 无参构造函数
Person xx= Person();
println(xx.age);
assertEqual(xx.age, 10);
println(xx.getAge());
assertEqual(xx.getAge(), 110);
// 大小为 16 的 Person 数组
Person[] personList = [16]{};
函数
普通的全局函数。 类的函数。
// 判断链表是否有环
bool hasCycle(ListNode head){
if (head == nil){
return false;
}
if (head.next == nil){
return false;
}
ListNode fast = head.next;
ListNode slow = head;
bool ret = false;
for (fast.next != nil){
if (fast.next == nil){
return false;
}
if (fast.next.next == nil){
return false;
}
if (slow.next == nil){
return false;
}
if (fast == slow){
ret = true;
return true;
}
fast = fast.next.next;
slow = slow.next;
}
return ret;
}
ListNode l1 = ListNode(1, nil);
bool b1 =hasCycle(l1);
println(b1);
assertEqual(b1, false);
ListNode l4 = ListNode(4, nil);
ListNode l3 = ListNode(3, l4);
ListNode l2 = ListNode(2, l3);
bool b2 = hasCycle(l2);
println(b2);
assertEqual(b2, false);
l4.next = l2;
bool b3 = hasCycle(l2);
println(b3);
assertEqual(b3, true);
add(int a){}
闭包
// 外部变量,全局共享。
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);
}
0
varInner=21, varExternal=11
1
varInner=22, varExternal=12
=======
0
varInner=21, varExternal=13
1
varInner=22, varExternal=14
func int(int) f2 = f1();
标准库
MapString
int count =100;
MapString m1 = MapString();
for (int i=0;i<count;i++){
string key = i+"";
string value = key;
m1.put(key,value);
}
println(m1.getSize());
assertEqual(m1.getSize(),count);
for (int i=0;i<count;i++){
string key = i+"";
string value = m1.get(key);
println("key="+key+ ":"+ value);
assertEqual(key,value);
}
内置函数
int[] a={1,2,3};
// len 返回数组大小
println(len(a));
// 向数组追加数据
a = append(a,4);
println(a);
// output: [1,2,3,4]
// 断言函数,不相等时会抛出运行时异常,并中断程序。
assertEqual(len(a),4);
// 返回 hashcode
int hashcode = hash(key);
总结

项目源码:https://github.com/crossoverJie/gscript
下载地址:https://github.com/crossoverJie/gscript/releases/tag/v0.0.6


关注公众号:拾黑(shiheibook)了解更多
赞助链接:
关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- Gmail客户端获“摘要卡”特性更新 智能将邮件内关键信息整合为卡片
- Manjaro 好用桌面环境的Linux操作系统
- 港币对人民币汇率2024年1月31日
- 日元对人民币汇率2023年8月25日
- SegmentFault Hackathon 回归!国内首个 AIGC 黑客马拉松来了
- AVS领衔,全自主8K专业摄像机研发启动
- 中端机用旗舰屏幕?Redmi Note 11T系列要重振LCD荣光!
- 出货量暴降41%! 5G手机为何卖不动了?
- 微软三星英伟达皆被黑 背后主谋竟是 16 岁少年?
- 首批特色化示范性软件学院名单公布
- 深挖地 广积粮 :华为一口气组建四个军团组织
- 【大公司创新情报】吉利汽车:已找到与沃尔沃最佳合并方案
赞助链接