Skip to content

类型检查器

许兴逸 edited this page Mar 2, 2023 · 4 revisions

类型检查

YukimiScript支持类型检查,如果没有特殊情况,所有的类型均按照any处理。
在宏或外部定义下面,可以使用__type系统宏来定义每个参数的类型,可以在“系统宏参考”中找到关于__type宏的信息。

示例:

- extern A a b c
@__type a string
@__type b real
@__type b int      # 同时允许int和real通过检查,不过这种情况下推荐直接使用number类型,它是int和real的并集
# c没有被设置类型,允许任何类型通过检查

- scene "main"
A --a "abc" --b 1.0 --c true   # 可以通过编译
A --a abc   --b 1.0 --c 1      # 不能通过编译,因为abc是symbol,而a要求传入一个string
A --a "abc" --b 1   --c "abc"  # 不能通过编译,因为1是个int,而a要求传入一个real

基本类型

类型 值示例 描述
int 1 32位有符号整数
real 1.0 64位有符号浮点数
symbol true 符号
string "true" 字符串

和类型

类型 子类型
number int, real
any number, string, symbol

Explicit Symbol类型

Explicit Symbol类型是symbol类型的扩充,可以使用编译器宏__type_symbol允许只传入特定的symbol,示例如下:

- macro checkBool value
@__type_symbol value true
@__type_symbol value false

这里定义的checkBool宏便可允许value参数只能传入truefalse

由于__type__type_symbol是把类型加到已有的类型上,所以如果在这里使用@__type value symbol则会使得value的检查退化为对任意symbol的检查。
因此在使用__type_symbol时不应该使用__type xxx symbol
但依然可以构造一个允许同时传入null和字符串的类型。

如果你需要复用类型定义,你可以定义一个宏仅用于对某个值的类型检查不会产生任何实质的代码。

内置的Explict Symbol类型

类型 可能的值
bool true, false
null null

对于内置的Explicit Symbol类型,直接使用__type宏来使用即可。

类型转换图

graph BT
    number --> any
    string --> any
    symbol --> any
    int --> number
    real --> number
    bool --> symbol
    null --> symbol
    esymbol[Explicit Symbols] --> symbol
    esymbol_true[Explict Symbol 'true'] --> bool
    esymbol_false[Explicit Symbol 'false'] --> bool
    esymbol_null[Explicit Symbol 'null'] --> null
Loading
Clone this wiki locally