# 程序入口

一个 XLang 的代码,必须包含 main 函数,作为程序的入口点。

fn main() {
  // main entry...
}

main 函数还允许你定义一些参数。

fn main(n: number, str: string) {
  // main entry...
}

这些参数可以传入给 XLang 的命令行,在代码编译完成,即将运行时,会自动转换成相应的类型,传入 main 函数中。

# 变量声明

XLang 允许两种变量声明的方式,一种是声明可变变量 let,另一种是声明不可变变量 const

let a = 1, c = true;
const b = "immutable";

没有声明类型?习惯 C/C++Java 等语言风格的人会对此感到困惑。

TypeScriptRust 等语言一样,XLang 会自动推导出 a 的类型是整数,b 的类型是字符串。

XLang 中内置的数据类型有 numberfloatstringbool 四种。

你也手动指定出一个变量的类型,在通常情况下这并不是必要。

let a: number = 1;
const b: string = "immutable";

使用可变变量声明时,若没有初始值,则它的类型会在首次赋值时确定。

使用不可变变量声明时,必须初始化。

如果同时使用了初始化和类型声明,你必须保证类型是兼容的。

let a;
const b: string; // Error: const variable b is not initialized
const c: number = "123"; // Error: variable c's type not match
const d = a; // Error: variable a is not initialized

局部变量的声明存在块状的作用域。

{
  const a = 1;
  {
    const b = a + 1;
  }
  const c = b + 1; // Error: variable b is not defined
}

# 流程控制

类似于 C/C++JavaScript 等语言,你可以写以下这些流程控制语句。

if (a > 1) {
  // code here...
} else if (a > 0) {
  // code here...
} else {
  // code here...
}

let i = 0;
while (i < 10) {
  // code here...
}

for (let i = 0; i < 10; i = i + 1) {
  // code here...
}

注意所有条件判断必须返回 bool 类型,XLang 不会将数字等类型隐式转换为 bool

# 函数声明

在函数体外,你可以声明全局作用域的函数。

使用关键字 fn 开头声明一个函数,圆括号内写参数列表,这里参数必须显式地指明数据类型。

如果函数有返回值,你必须在后面用箭头 -> 标出返回类型。否则,你可以省略这个声明。

fn hello() {
  println("Hello");
}

fn cal(a: number) -> number {
  return a + 1;
}

XLang 在代码生成的过程中,会对有返回值的函数的返回情况做粗略的检查。

在下面的情况中,可能存在一个分支没用返回值,这将无法通过 XLang 的编译。

fn cal(a: number) -> number {
  if (a > 0) {
    return 0;
  } else {
    println("not return"); // Error: function "cal" does not have Return statement
  }
}