apolloxlua 源码内使用macros的使用方式

简介:

本文讲解如何在两种模式下使用macros,首先在apolloxlua下有两种模式, 一种是 web模式另一种是工具模式。 web模式下我们可以在浏览器端来使用,但是有一些限制, 就是比如说某些native的api是无法使用的, 比如说ngx,redis,mysql这种。示例请看 web控制台示例 。而另外一种工具模式, 工具模式没有使用限制。

我们在处理某个领域的问题时候, 会用到条件编译。 条件编译会减少我们代码的体积和增加程序的灵活性。 比如这个示例中展示了如何使用:

macros 宏使用的语法:

1 宏注释

{% if  SCRIPT  == "lua" then %}
     return exports.GetValueByType (eax.value);
{% end %}

{% if  SCRIPT  == "neko" then %}
     return exports.GetValueByType (eax.value);
{% end %}


{% if  SCRIPT  == "c" then %}
     return exports.GetValueByType (eax.value);
{% end %}

2 inline macro

 {-inline_listense-} 
    Copyright (c) 2018 agent.zy@aliyun.com
 {-inline_listense-}

在代码中内联该语法会将不同的inline macro 输出到指定位置

3 函数定义

 {%   
    local lua\_member\_call    ="{{item}}:{{item1}}({{item2}})"
    local lua\_string\_add_val ="\\"{{item}}\\" .. {{item2}}"
    local lua\_string\_add_string ="\\"{{item}}\\" + \\"{{item2**}}\\""
 %}

4 内联函数

{-inline_max-}
function  max (a, b) {
return a>b;
}
{-inline_max-}

如何使用我们定义的内联函数

{_blocks.inline_max_}

5 替换模式

{% 
local string_macro ="\\"{{item}}\\""
%}
{\* MACRO(string_macro)(context) *}
{\* MACRO(string_macro){ item = "string-macro-context" } *}

例子 :

{-inline\_esprima\_parse-}
    var options = {
        attachComment: false,
        range: false,
        loc: false,
        sourceType: "script",
        tolerant: true
    };

    options.tokens = false;
    var result = exports.esprima.parse(buff, options);

{-inline\_esprima\_parse-}

/////
/////  生成code 
/////
{-inline\_generate\_code-}
 exports.lexerGenerateCode(result);
{-inline\_generate\_code-}


////
////   生成字节码
////

{-inline\_generate\_mid-}
 exports.lexerGenerateMidCode(result);
{-inline\_generate\_mid-}



{% if  SCRIPT  == "lua" then %}
exports.Main = function (buff) {
    {% if  DEBUG  then %}
        console.log("lua mode.")
    {% end %}
    ///生成ast解析
    {\*blocks.inline\_esprima\_parse\*} 
    ///生成code
    {\*blocks.inline\_generate\_code\*}       
}
{% end %}


{% if  SCRIPT  == "c" then %}
exports.Main = function (str) {
    {% if  DEBUG  then %}
        console.log("c mode.")
    {% end %}
    {\*blocks.inline\_esprima\_parse\*}
    {\*blocks.inline\_generate\_code\*} 
}
{% end %}

最后在使用的时候, web模式不需要处理, 在tool模式下请使用 luadef工具 进行预编译。

相关文章
|
10月前
|
JSON 前端开发 API
fetchEventSource源码解析
fetchEventSource源码解析
1632 1
|
4月前
|
小程序 JavaScript
小程序bindtap 和 catchtap 的区别以及如何使用
小程序bindtap 和 catchtap 的区别以及如何使用
95 0
|
4月前
|
数据可视化 测试技术 API
阅读源码有哪些好方式与好步骤
阅读源码是理解软件工作原理的关键。首先,了解背景、目的和技术栈。从文件头部的文档注释开始,逐步深入到复杂代码。利用Git、调试器和分析工具辅助理解。保持批判性思维,质疑代码设计并验证理解。拆分代码块,画图展示结构,使用版本控制追踪变更。搜索、阅读文档、API和单元测试以深化理解。参与讨论,做笔记,回顾历史版本,了解上下文,并通过实践加强领悟。每个人的方法可能不同,关键是持续学习和适应。
47 1
|
4月前
|
算法 NoSQL 安全
30万的源码和300的源码有什么区别?
价格差异巨大的源码(30万对300)主要区别在于质量、完整性和技术支持。高质量源码通常有清晰结构、高效算法、良好文档,提供全面的技术支持,安全稳定且来自信誉良好的开发者。而低价源码可能存在问题、缺乏文档和支持。选择时需结合实际需求,注意测试和评估。示例中的AI导诊系统和云HIS系统源码,提供完整文档、数据库和二次开发支持,适用于不同场景,能有效提升开发效率和项目质量。
30万的源码和300的源码有什么区别?
|
4月前
看源码的方法
看源码的方法
80 1
|
前端开发
【面试题】:前端怎么实现组件的封装和上传
前端如何实现组件的封装以及上传
185 0
|
前端开发 API
unstated-next 源码解析
1、介绍 轻量级的React状态管理工具 2、安装 安装 npm install --save unstated-next 3、API 使用及优化
105 0
|
安全 网络安全 网络虚拟化
DMVPN 案例配置及原理分析
DMVPN 案例配置及原理分析
571 0
DMVPN 案例配置及原理分析
|
Scala 开发者
包对象注意事项和细节说明|学习笔记
快速学习包对象注意事项和细节说明。
包对象注意事项和细节说明|学习笔记