-
Notifications
You must be signed in to change notification settings - Fork 3
类型检查器
许兴逸 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类型是symbol类型的扩充,可以使用编译器宏__type_symbol
允许只传入特定的symbol,示例如下:
- macro checkBool value
@__type_symbol value true
@__type_symbol value false
这里定义的checkBool
宏便可允许value
参数只能传入true
或false
。
由于__type
和__type_symbol
是把类型加到已有的类型上,所以如果在这里使用@__type value symbol
则会使得value
的检查退化为对任意symbol
的检查。
因此在使用__type_symbol
时不应该使用__type xxx symbol
。
但依然可以构造一个允许同时传入null和字符串的类型。
如果你需要复用类型定义,你可以定义一个宏仅用于对某个值的类型检查不会产生任何实质的代码。
类型 | 可能的值 |
---|---|
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