# far **Repository Path**: grateful/far ## Basic Information - **Project Name**: far - **Description**: far文档和下载 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-02 - **Last Updated**: 2025-04-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # far #### 介绍 Far被编译为jvm字节码,运行在JVM,作为一款运行于 JVM 的前沿语言,凭借强大的动态特性,为开发者打造了全新的编程体验。 在微服务架构里,服务间的通信和业务逻辑变更频繁。Far 能在运行时动态调整服务接口和业务规则,极大降低系统维护成本,轻松应对业务的快速变化。面对大数据处理场景,它能根据不同的数据集,灵活调整数据处理算法,搭配丰富的 JVM 生态大数据工具,显著提升数据处理效率。在游戏开发中,使用 Far 可以实时更新游戏元素和玩法,快速响应玩家需求,提升玩家体验。 如果你想突破传统编程的束缚,轻松驾驭复杂多变的业务场景,Far 将是你的不二之选。 ## 数据类型 ### 基本数据类型 - `int long string float double byte bool array` ### 对象类型(程序员自定义类) - `object` ### 混合类型 - `var`(模糊类型) 包括了基本类型和对象类型 ### 数组 #### 数组定义和赋值 `array data = ([1,2,3]);` 数组和Js不一样 数组的元素开始符号`([` 结束符号`])` `array x = ([1,2,3]);` 数组可以存储不同的数据类型 `array x = ([1,2.1,"3"]);` 上面的元素,编译器会自动生成int double string 类型,如果不想编译器定义元素的类型可以使用转换函数。 `array x = ([ toLong(1),toByte(2),"3" ]);` 如果要创建字节数组可以 ```java // 创建有符号字节数组(Byte 范围:-128 ~ 127) array a = byteArrayOf(0x48, 0x65, 0x6C, 0x6C, 0x6F) ; // 十六进制 array a = byteArrayOf(72, 101, 108, 108, 111) ; // 十进 ``` ### 字典 map 字典初始化用`({`作为开始符号 用`})`作为结束符号 `map data = ({"name":"far"})`; ## 表达式 ### 解构表达式 ```js (a,b) = test(); (a,b) = array; (a,b) = ([1,2]); ``` ### 三元表达式 ```js var a = x==1 ? 100 : 99; ``` ### when 表达式 代替switch 的表达式,比switch 更强大,更方便! when表达式具有返回值,每个分支的最后一个表达式作为返回值 `->`左边的表达式 只接受bool表达式的情况,比如 ```js void main(){ var testWhen = when(a=19){ a==2 => {println("下面的分支不会执行....")}; a in (1,2,3)=>{"是得,包含了2";}; a in 1..20 =>println("是得1..20包含了他"); !a =>println(a); _=>"默认分支,这个分支就算不写,编译器也会自动生成,所以when表达式一般默认返回0"; }; println(testWhen); } ``` - 如果test的返回值不是bool类型,就不是有效的bool表达式 - 必须写默认分支`_=>` - when() 括号中的只能是赋值表达式,far的编译器需要做变量捕获 #### when当if使用的情况 ```java var a = 19; when{ a==2 => {println("下面的分支不会执行....")}; a in (1,2,3)=>{"是得,包含了2";}; a in 1..20 =>println("是得1..20包含了他"); !a =>println(a); _=>"默认分支,这个分支就算不写,编译器也会自动生成,所以when表达式一般默认返回0"; }; ``` ### 未来版本 - when 也可以用来取代 if-else if链,从而达到简化的效果, 如果不提供参数,所有的分支条件都是简单的布尔表达式,而当一个分支的条件为真时则执行该分支: ``` when { x.isOdd() => print("x is odd") x.isEven() => print("x is even") _=> print("x is funny") } ``` ## 语句 ### import语句 主要作用是将in后面的字符串存入Name,方便在当前文件全局使用 - 如果括号表达式中的标识符,大于1个时,将以in后面的文件中的export语句导出为准,export只能导出方法 ```js import (Name) in "xxx/xxxx"; ``` ### return 语句 > return 语句后面只能跟表达式或留空 ### for 语句 #### 基本结构 for(初始器;循环条件表达式;计数器) {代码块} - 初始器和计数器支持逗号表达式 ```js for(int a=0,q=1;a<100;i++,c++) {u+user();} ``` ```js for(;a<1;){} for(int a=0,q=1;a<100;i++,c++) {u+user();} for(int x=1;a<1;){} for(int x=1;;){} for(int a=0,q=1;a<100;i++){ for(;a<1;){} for(int a=0,q=1;a<100;i++,c++) {u+user();} for(int x=1;a<1;){} for(int x=1;;){} } ``` 如果for语句的代码块部分,没有代码,花括号也必须要添加 for 语句代替while语句 ```angular2html for(;bool表达式;){ } ``` ### foreach 语句 #### 语法 foreach(ident in ident|expr){ stmt|expr } foreach进行数组和字典(map)的遍历 ```java string *s = (["2","3","4"]); map dats = ({ "我是key":"我是val", "我是key1":"我是val111" }); foreach( k, v in dats ){ dats[k]="999"; println(k+"---"+v); } foreach( v in s ){ println(v); } ``` --- >注意,不管是for还是foreach ,far不支持在循环中添加和删除数组、字典的元素,因为这是不好的编程习惯,容易造成BUG。 ### if else ```c if(a==1){ aa=2; }else aa=3; if(a==1)aa=2; else aa=3; if(x==1) o=2; ``` ### 类的继承 inherit ``` inherit "feature/treemap.c" ``` ## 匿名函数 far的匿名函数可以捕获外部变量,如果匿名函数要修改外部的变量,只能是对象类型,基本类型无法修改. ```js var func = (x,y)-> println(x); ``` ### 匿名方法在编译器处理阶段,会识别创建他时上下文中的变量。假设方法A创建了匿名方法B ``` void A(){ int data =1; var B = ()->{ println(data); } } ``` ### 匿名函数分为创建阶段和调用阶段 ### 如何在创建时就实现调用并传入多个参数? ```java var a = ([2,5,3]); var b = 5; var idx = findNumber(a,([b]),(x,v)->{ if(x{ var bbb = ()->{ println("${s}"); }; bbb(); }; bb(); } ``` ## 调用java库 ```js var th = JLib("java/lang/Thread"); th.startVirtualThread(() -> { println(x); }); th.start(); ```