Lua strings
字符串或串(String)是由数字、字母、下划线组成的一串字符。Lua 语言中字符串可以使用以下三种方式来表示:
单引号间的一串字符。
双引号间的一串字符。
[[和]]间的一串字符。
转义字符用于表示不能直接显示的字符,比如后退键,回车键,等。如在字符串转换双引号可以使用 “””。
所有的转义字符和所对应的意义:
转义字符
意义
ASCII码值(十进制)
a
响铃(BEL)
007
b
退格(BS) ,将当前位置移到前一列
008
f
换页(FF),将当前位置移到下页开头
012
n
换行(LF) ,将当前位置移到下一行开头
010
r
回车(CR) ,将当前位置移到本行开头
013
t
水平制表(HT) (跳到下一个TAB位置)
009
v
垂直制表(VT)
011
代表一个反斜线字符’’’
092
’
代表一个单引号(撇号)字符
039
”
代表一个双引号字符
034
tolua++安装
<a href="/2015/11/11/lua_cpp_bind/" rel="next" title="C++与Lua本质原始交互API">
<i class="fa fa-chevron-left"></i>
<p class="post-nav-pre-next-title">
C++与Lua本质原始交互API
</p>
</a>
</div>
<span class="post-nav-divider"></span>
<div class="post-nav-prev post-nav-item"> ...
tolua++安装
<a href="/2015/11/10/kmp/" rel="next" title="KMP查找子字符串">
<i class="fa fa-chevron-left"></i>
<p class="post-nav-pre-next-title">
KMP查找子字符串
</p>
</a>
</div>
<span class="post-nav-divider"></span>
<div class="post-nav-prev post-nav-item">
&l ...
Goto in LuaJIT
Lua 在 5.2 之后的版本,加入了 goto 这个关键字,用来控制程序跳转到指定 label。我们可以利用这个特性,来模拟 continue 的实现。需要注意的是 goto 只能跳转到 label,而 ::name:: 的格式就可以设置一个 label。
for i=1,5 do
if i == 3 then
goto continue
end
print(i)
::continue::
end
这样就简单实现了 continue。但是有些同学可能会有疑问,这是 Lua 5.2 的特性,我们都知道 OR 中使用的 Lua 5.1,那如何使用?
其实我们只需要使用 LuaJIT 就可以解决这个问题了。在 LuaJIT 的主页上有这个介绍:
LuaJIT supports some language and library extensions from Lua 5.2. Features that are unlikely to break existing code are unconditionally enabled:
...
Lua 学习 chapter16
目录
编译
错误
You must try your best. Then you will have a good improvement.
编译
dofile函数,加载文件并且执行文件中的代码。其实dofile并不是运行lua代码的核心,核心是loadfile函数。
1
2
3
4
function dofile(filename)
local f = assert(loadfile(filename))
return f()
end
如果loadfile执行失败,那么函数assert会引发一个错误。相较于dofile,loadfile在发生错的时候会返回nil以及错误信息。而且在多次运行这个文件的时候,loadfile只需要加载一次后面可以多次调用。
函数load函数和loadfile函数非常的相似,但是加载的不是文件而是字符串。函数load总是在全局环境中编译代码片段,所以里面的值也都是针对于全局变量的。
错误
可以通过assert函数来判断一个函数是否成功执行,没有成功执行则会返回错误信息。assert函数第二个参数为可选的错误信息,可以输出你想要输 ...
How TLA+ Evaluation Next Action
TLC是如何计算状态的
当TLC计算一个invariant,直接计算值,返回TRUE/FALSE
当TLC计算Init和Next,返回一个状态集合(这个集合被加入到sq中):
Init: 所有可能的初始状态;
Next:所有可能的后继状态;
TLC如何计算Next
状态:是对变量的赋值;
TLC计算一个状态s的后继状态:
对所有unprimed变量进行赋值;
对所有的primed变量赋值为null;
开始计算next Action;
TLC在计算Next Action和普通的表达式是不同的
第一个不同点
TLC对‘或’表达式并不是从左到右计算:
当计算 A1 / … / An,首先拆分成n个子表达式;
当计算E x in S : p,对于S中的每个元素,拆分成若干个子表达式;
P => Q,等价于(非P) / Q
举个例子
<div class="highlighter-rouge"& ...
An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling
目录:
TCN 论文总结
基础知识
1. 时间序列
2. RNN, LSTM, GRU
3. CNN
TCN
Causal Convolutions
Dilate Convolutions
Residual Convolutions
TCN 的结构
实验
总结
参考文献
基础知识
对于大多数深入学习的实践者来说,序列建模是循环网络的同义词。然而,最近的研究结果表明,卷积结构在音频合成和机器翻译等任务上可以优于循环网络。给定一个新的序列建模任务或数据集,应该使用哪个体系结构?作者对用于序列建模的通用卷积和循环体系结构进行了系统评估。实验表明,一个简单的卷积结构在不同的任务和数据集范围内都优于典型的循环网络(如LSTM),同时显示出更长的有效记忆。
TCN的特点:
...
Lua 排序算法
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
算法步骤
从数列中挑出一个元素,称为 “基准”(pivot)
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
对 “基准” 左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
动画演示
Lua 实现
local function partition(list, low, high)
local low = low
local high = high
local pivotKey = list[low] -- 定义一个中介值
<span class="c1">-- 下面将中介值移动到 ...
Lua 的标准输出与缓存
最近我遇到了个奇怪的问题,我的一个 Lua 脚本需要通过 shell 的重定向将输出追加到一个日志文件中。但是那个 Lua 脚本的输出在日志文件里看来却不是实时的,输出的文本直到脚本结束时才能看到。
在 shell 下运行这个程序,是可以看到实时输出的:
-- buffer_test.lua
local socket = require "socket"
local const = 100
for i=1, const, 1 do
print(i)
socket.select(nil, nil, 1)
end
但是当通过重定向时,只有脚本结束后才能看到文件:
# lua buffer_test.lua >>log.txt 2>&1 &
# tail -f log.txt
看来当 Lua 的标准输出 stdout 连接的是终端时,采用了行缓存模式,而重定向到文件时则变成了完全缓存。翻遍了 Lua 的官方文档也没有找到这样的说明。但是在查看 stdio 的手册页时发现了下面的一段话:
The stdio library is a ...
浅析C++与Lua数据交互层
背景
C++作为服务器端开发的主流语言,相比其他语言有明显的性能优势,但是它的技术门槛比较高,不支持热更新,无法进行迅速的需求迭代和线上问题的响应。另外,C++内存管理的特点,技术人员对指针的使用不当,可能会造成宕机。因此,现在越来越多的技术团队会选择在C++中嵌入脚本语言,C++提供底层支持,脚本语言进行业务逻辑的开发。这样的好处,一方面将开发人员进行划分,C++代码的维护只由核心人员进行。业务层的脚本代码开发,相对比较简单,可以交由经验比较浅的新人,甚至外包给其他团队;另外一方面,脚本语言的灵活性,可热更新,又弥补了C++的不足。
Lua作为一门非常轻量的脚本语言,被大量的游戏团队使用。我们就来说一说,C++是如何与Lua进行数据交互的。
已有的类似系统有LuaBinder、LuaTinker、CppToLua等。
基本原理
Lua提供了虚拟栈的概念,C/C++可以通过push/pop从栈上逐一存取基本的数据类型,也可以通过pushcfunction/pushcclosure,将函数注册给Lua,供其调用。但对于C++来说,数据结构比较复杂,有类和对象的概念,类有成 ...