far编程语言
far
介绍
far是一款可以运行在,Jvm,GraalVM上的编程语言,自带跨平台属性.
数据类型
far基本数据类型
int long string array float double byte
对象类型
object
混合类型
var(模糊类型) 包括了基本类型和对象类型
数组
数组定义和赋值
string *data = ([1,2,3]);
数组可以存储不同的数据类型
data=([1,2,"字符串"])
map
map data = ({"name":"far"});
表达式
解构表达式
(a,b) = test();
(a,b) = array;
(a,b) = ([1,2]);
三元表达式
var a = x==1 ? 100 : 99;
when 表达式
代替switch 的表达式,比switch 更强大,更方便! when表达式具有返回值,每个分支的最后一个表达式作为返回值
->左边的表达式 只接受bool表达式的情况,比如
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-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只能导出方法
import (Name) in "xxx/xxxx";
return 语句
return 语句后面只能跟表达式或留空
for 语句
基本结构
for(初始器;循环条件表达式;计数器) {代码块}
初始器和计数器支持逗号表达式
for(int a=0,q=1;a<100;i++,c++) {u+user();}
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语句
for(;bool表达式;){
}
if else
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的匿名函数可以捕获外部变量,如果匿名函数要修改外部的变量,只能是对象类型,基本类型无法修改.
var func = (x,y)-> println(x);
匿名方法在编译器处理阶段,会识别创建他时上下文中的变量。假设方法A创建了匿名方法B
void A(){
int data =1;
var B = ()->{
println(data);
}
}
如果匿名方法B创建了匿名方法C,C方法内部是无法使用data变量的
void A(){
int data =1;
var B = ()->{
var C=()->{
println(data);
}
}
}
除非在B方法中使用一次data
void A(){
int data =1;
var B = ()->{
int data1=data;
var C=()->{
println(data1);
}
}
}
匿名函数分为创建阶段和调用阶段
如何在创建时就实现调用并传入多个参数?
var a = ([2,5,3]);
var b = 5;
var idx = findNumber(a,([b]),(x,v)->{
if(x<v[0]) return true;
return false;
});
int findNumber(var o,var v,var f){
for(int i;i<o.size();i++){
if( f(o[i]),v ){
return i;
}
}
return -1;
}
上面代码展示了如何使用findNumber函数查找数组中值小于5的数的索引。
findNumber的第一个参数是原数组,b作为被查找的数,放在数组里传入匿名函数。
异常处理
void test1(){
throw("test1方法抛出的异常");
}
void test(){
test1();
}
void main()
{
try {
println("触发异常");
test();
test_throw();
throw ("far");
println("此处不会执行的!");
return 1;//这个return 无效了...
} catch (e) {//可选执行
println(e.getMessage());
for (int i;i < e.stackElements().size();i++)
{
println(e.stackElements().get(i).file() + ":" + e.stackElements().get(i).methodName() + ":" + e.stackElements().get(i).line());
}
println("catch代码执行了");
try {
println("try嵌套代码执行了");
} catch (e1) {
println("catch嵌套代码执行了");
} finally {
println("finally嵌套代码执行了");
}
} finally {
println("外层finally执行了1");
throw ("这个异常会是什么??");
println("外层finally执行了2");
}
println("主体代码.....");
}
更简单的异常处理
try(a=test(),err){println("出错了"+err);}
//下面还会运行
int b=1;
静态方法和静态字段
静态字段
static string name;
调用时使用文件名::name 比如当前文件名是A 调用 A::name
静态方法
static void test(){
}
调用方式和调用静态字段一样
多线程
far可以轻松创建千万级线程,不输go语言的协程 thread
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。