z语言仓库目的是开发一个开箱即用(尤其是web项目),简单容易上手的语言,支持面向对象等等的语言
目前在开发阶段,请使用源码安装的方式,依赖go,请提前安装好,后续会慢慢实现自举以及支持下载安装包。
1、克隆仓库
git clone git@github.com:z-dev-group/zlang.git
zlang/src/go/
make
2、设置Z_ROOT
cd ../../
export Z_ROOT=$(pwd)
3、执行z代码
./dist/z examples/hello.z
成功输出:
hello world
z语言使用隐形变量申明方式,根据值反推变量类型,目前支持的类型比较简单,integer,float,string,boolean,object,array,null,error,function等
let age = 12
let height = 160.1
let name = "seven"
let address = {
"province": "guangdong",
"city": "guangzhou"
}
let fruits = ["apple", "banana"]
let is_passed = true
let do = fn() {
}
1、申明
源码
使用let关键字申明变量,无需指明变量类型
let hello = "world"
var_dump(hello)
输出:
world
2、表达式
源码
支持+,-,*,/,++,>, <, ==等常用表达式
let i = 0
i++
var_dump(i)
let compare = i == 1
var_dump(compare)
输出:
1
true
3、条件判断
源码
使用if,else判断
let age = 36
if (age > 35) {
var_dump("too old")
} else {
var_dump("so young")
}
输出:
too old
4、循环
支持while和for两种形式,支持break结束跳出循环
while
源码
let i = 0
let total = 0
while (i < 10) {
i++
total = total + i
}
var_dump(total)
var_dump(i)
i = 0
total = 0
while (i < 10) {
i++
total = total + i
if (i > 5) {
break
}
}
var_dump(total)
var_dump(i)
输出:
55
10
21
6
for
源码
let total = 0
for (let i = 0; i <= 10; i++) {
total = total + i
}
var_dump(total)
total = 0
for (let j = 0; j <= 10; j++) {
total = total + j
if (j > 5) {
break
}
}
var_dump(total)
输出:
55
21
5、文件引入
加入有一个 import.z,需要在另外一个文件use_import.z使用import.z的内容,可以使用import导入
import.z
let name = "seven"
use_import.z
import "./import.z"
var_dump(name)
执行use_import.z
输出:
seven
6、包隔离
使用package关键字申明包,可以里面定义函数,类,变量
申明package
package string
let concat = fn(str_one, str_two) {
return str_one + " " + str_two
}
使用package中函数,需要在函数前携带上包名
import "./package.z"
var_dump(string.concat("hello", "world"))
输出:
hello world
7、对象
z语言支持常规的面向对象编程,支持关键字class,new,interface,extends,implement,->等等操作
使用class申明类
class User {
fn sayHello(name) {
return "hello " + name
}
}
使用new实例化对象
let user = new User()
使用->调用对象的方法
var_dump(user->sayHello("seven"))
输出:
hello seven
对象方法支持this关键字返回对象本身
class User {
let _name = "seven"
fn setName(name) {
_name = name
return this
}
fn dump() {
var_dump(_name)
}
}
let u = new User()
u->setName("xxx")->dump()
输出:
xxx
支持__init 构造函数
class User {
let _name = "seven"
fn __init(name) {
_name = name
}
fn dump() {
var_dump(_name)
}
}
let u = new User("yyy")
u->dump()
输出
yyy
z语言使用变量携带错误信息的方式来实现异常处理,就一个普通的变量,我们可以给这个变量带上错误信息(抛出异常),可以检查一个变量是否带有错误信息(捕获异常),可以获取到异常的错误信息,避免go语言这种需要返回多个字段,以及java这种需要try catch 包裹的麻烦。
源码
let name = "seven"
if (is_with_error(name)) {
var_dump("find error")
} else {
var_dump("not find error")
}
with_error(name, "this is user error")
if (is_with_error(name)) {
var_dump("find error after with_error")
var_dump(get_error_message(name))
}
预计输出:
not find error
find error after with_error
this is user error
块级别的defer支持,只要是在{}代码块里面定义defer{}的代码块,该代码块都会在该defer关键定义的代码块执行完调用。
源码
fn hello() {
var_dump("first hello")
defer {
var_dump("world")
}
var_dump("hello")
}
hello()
输出
first hello
hello
world
可以看到world是在hello 之后输出,defer代码块延迟执行。
在举例在if代码块中
fn hello_if() {
let a = 1;
if (a > 0) {
defer {
if (a > 0) {
var_dump("end print")
}
}
var_dump("big than 0")
}
}
hello_if()
输入如下:
big than 0
end print
可以看到 end print的输出是延迟执行的。
使用系统调用扩展z语言功能,包括文件处理,进程控制等等
源码
fn getpid() {
let result = syscall(20)
result["result1"]
}
fn getppid() {
let result = syscall(39)
result["result1"]
}
var_dump(getpid())
var_dump(getppid())
输出不确定,根据当时运行情况决定