https://github.com/cppcxy/luasyntax
standard lua implement
https://github.com/cppcxy/luasyntax
Last synced: 12 months ago
JSON representation
standard lua implement
- Host: GitHub
- URL: https://github.com/cppcxy/luasyntax
- Owner: CppCXY
- Created: 2019-06-20T08:53:51.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2019-06-26T14:07:41.000Z (about 7 years ago)
- Last Synced: 2025-01-18T20:07:53.650Z (over 1 year ago)
- Language: Lua
- Size: 6.84 KB
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# lua标准语法实现的新语法
* 如何使用这个库?
```lua
require "luaSyntax.init"
```
* 声明一个命名空间
```lua
require "luaSyntax.init"
_ENV=namespace "test"
```
1. 声明命名空间之后,所有的定义都会存在于当前命名空间之中
2. 声明命名空间之后,使用的变量会优先访问当前命名空间中已经定义的对象,然后访问using 过的命名空间中的对象,最后访问_G中的对象
3. 在一个命名中间中定义的对象,可以通过使用 命名空间.对象名称 的方式引用比如
```lua
--文件 test
require "luaSyntax.init"
_ENV=namespace "test"
a=123456
--文件 test2
require "test"
--会自动生成在test空间中的test2空间
_ENV=namespace "test.test2"
print(test.a) --123456
```
* using 命名空间
```lua
--文件test
require "luaSyntax.init"
_ENV=namespace "test"
var=996
--文件test2
require "test2"
_ENV=namespace "test2"
using_namespace "test"
print(var) --996
```
1. using 命名空间之后,你可以不加前缀的使用这个空间中的对象
2. 相同命名空间中的对象不必 using
3. using_namespace 不是全局变量,只能跟在namespace 声明之后用
* 装饰器
声明一个装饰器
```lua
require "luaSyntax.namespace"
_ENV=namespace "decorator"
--装饰器也用装饰器来声明
__decorator__()
--装饰器的实现和python差不多
function __TestTime__(params)
return function (luafunction,functionName)
return function(...)
local startTime=os.clock()
local result={luafunction(...)}
local endTime=os.clock()
print("function "..functionName.." cost time "..(endTime-startTime).." s")
return table.unpack(result)
end
end
end
```
* 说明
```lua
__decorator__ 属于元装饰器,定义于namespace中,使用他来声明其他装饰器。
```
* 使用装饰器
```lua
require "luaSyntax.namespace"
require "luaSyntax.decorator.TestTime"
_ENV=namespace "test"
using_namespace "decorator"
__TestTime__()
---@param count number
function FOR_TEST(count)
local t={}
for i=1,count do
t[i]=i
end
end
FOR_TEST(999999)
```
* 放在声明于命名空间中的函数的定义之前,函数就被包装了。
* 其他装饰器介绍
```lua
__deprecated__(info)
--这个装饰器用于当函数被弃用,并且被使用的时候,打印出弃用信息
```
```lua
__NamedArgs__(...)
--这个装饰器修饰函数后函数可以使用具名参数的方式
--另外在装饰器参数中可以声明默认参数 bool 变量也可以
--例如
__NamedArgs__(
PARAM(1,"people","mayun"),
PARAM(2,"text","996 is your reward")
)
function speak(people,text)
print(people,text)
end
--会得到参数 "mayun" ,"996 is your reward"
speak()
--普通调用方式
speak("laozi","xixixixxixixixi")
--text会被传入参数 "不行啊",people使用默认参数"mayun"
speak(ARG.text("不行啊"))
--people使用第一个参数,text被传入具名参数
speak("laozi",ARG.text("hahahaha"))
```
PARAM 这是一个函数,第一个参数是对应的参数位置,第二个参数是具名时候的名字,第三个参数是默认值。只能1对1,不能1对多想要1对多自己实现去。
* 目前就写到这里