MFP编程语言@compulsory_link标注:
当创建一个APK包的时候,可编程科学计算器不是拷贝所有用户自定义的mfps代码文件而仅仅抽取相关的代码。在某些时候,比如调用integrate或者plot_exprs函数时,函数参数是一个字符串或者基于字符串的变量。这样一来,可编程科学计算器在编译的时候无法判断哪些函数在运行时将会被调用。又比如,如果函数的参数是一个对象,该对象的类型在运行前往往无法确定。用户在这种情况下需要在代码中,最好在相关函数调用语句的前一行,增加一个注释指令@complusory_link告知可编程科学计算器哪些用户自定义的函数和类需要链接入APK包。比如
...
@compulsory_link get_functions("::abc::myf_expr1", "myf_expr2(2)")
integrated_result = integrate(expression_str, variable_str)
@compulsory_link get_classes("::def::hij::my_class1", "::my_class2", "my_class3")
...
在上面例子中,::abc::myf_expr1和myf_expr2是用户自定义的函数。它们在运行时将会被integrate函数调用用于计算积分。所有的名字叫做::abc::myf_expr1的函数都会被链接入APK包。但是对于名字叫myf_expr2的函数,当且仅当它是位于一个被使用的引用空间中并且它正好有两个参数或者有可选参数时,该函数才会被链接入APK包。
类似地,::def::hij::my_class1,::my_class2和my_class3是用户自定义的类。需要注意的是类my_class3不包括完整的引用空间路径,所以compulsory_link语句将会搜索引用空间,找到第一个名字符合my_class3的类,如果存在这个类的话。
如果用户想把所有自己定义的函数和类链接入APK包,请用如下语句
@compulsory_link get_all_referred_units()
。这样一来,可编程科学计算器将链接所有函数和类。但是用户创建的应用装载速度会比较慢。并且,用户还必须保证所有的函数和类都必须已经定义,否则打包时会出现编译错误。
需要指出的是,get_functions,get_classes和get_all_referred_units实际上都是MFP语言的函数。但是和普通函数不一样的是,这几个函数位于mfp_compiler引用空间中。该引用空间仅仅在打包链接的时候被加载,一般情况下用户不会用到。
还要注意@compulsory_link指令必须位于一个函数的内部,如果它在function语句前面或者endf语句之后,它不会有任何作用。