`
zuroc
  • 浏览: 1295194 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

Programming in Lua 读书摘抄

    博客分类:
  • C++
阅读更多

据某某C++的叛徒说"感觉很多地方 lua 都是鄙视 python 的低效"

囧,python的确很慢.是个脚本都喜欢BS它.

lua虽然也很变态,但好歹没有erlang变态

目前还没有看到类似python中dir , help这种好用的函数.还有就是print虽然有语法糖,但是不够甜

不过因为很小,感觉比python清爽不少,很容易就整合到自己的C++程序中间去了.

感觉用给python写扩展是一件很不爽的事情,也难怪那个自称"世界最強絶対無敵電光石火疾風迅雷資料基盤管理器"的Tokyo Cabinet,有 Perl的官方API,有Ruby的官方API,有Java的官方API,有Lua的官方API,就是没有python的官方Api

lua用来写网络也颇有感觉.

以下是 Programming in Lua 读书摘抄,网上有完美的中文pdf,可以找着去下载


1.

lua的不等于 ~=

2.

Lua 语法要求 break 和 return 只能出现在 block 的结尾一句(也就是说:作为 chunk 的最后一句,或者在 end 之前,或者 else前,或者 until前) ,例如:

local i = 1
while a[i] do
  if a[i] == v then break end
  i = i + 1
end

有时候为了调试或者其他目的需要在 block的中间使用 return或者break,可以显式的使用 do..end 来实现:

function foo ()
  return       --<< SYNTAX ERROR
  -- 'return' is the last statement in the next block
  do return end     -- OK
  ...         -- statements not reached
end

3.
Lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足。
function f(a, b) return a or b end

CALL        PARAMETERS

f(3)        a=3, b=nil
f(3, 4)      a=3, b=4
f(3, 4, 5)     a=3, b=4  (5 is discarded)

4.

function foo0 () end           -- returns no results
function foo1 () return 'a' end     -- returns 1 result
function foo2 () return 'a','b' end  -- returns 2 results
第一,当作为表达式调用函数时,有以下几种情况:
1.  当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能
多地返回多个值,不足补 nil,超出舍去。
2.  其他情况下,函数调用仅返回第一个值(如果没有返回值为 nil)
x,y = foo2()        -- x='a', y='b'
x = foo2()         -- x='a', 'b' is discarded
x,y,z = 10,foo2()     -- x=10, y='a', z='b'

x,y = foo0()        -- x=nil, y=nil
x,y = foo1()        -- x='a', y=nil
x,y,z = foo2()      -- x='a', y='b', z=nil

x,y = foo2(), 20      -- x='a', y=20
x,y = foo0(), 20, 30   -- x='nil', y=20, 30 is discarded

5.

Lib = {}
function Lib.foo (x,y)
  return x + y
end
function Lib.goo (x,y)
  return x - y
end

6.
模块内部私有函数
local f = function (...)
  ...
end

7.
for与迭代器

function list_iter (t)
  local i = 0
  local n = table.getn(t)
  return function ()
    i = i + 1
    if i <= n then return t[i] end
  end
end

t = {10, 20, 30}
for element in list_iter(t) do
  print(element)
end

8.
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。

function iter (a, i)
  i = i + 1
  local v = a[i]
  if v then
    return i, v
  end
end

function ipairs (a)
  return iter, a, 0
end

a = {"one", "two", "three"}
for i, v in ipairs(a) do
  print(i, v)
end

当 Lua 调用 ipairs(a)开始循环时,他获取三个值:迭代函数 iter、状态常量 a、控制变量初始值 0;
然后 Lua调用 iter(a,0)返回1,a[1] (除非 a[1]=nil);第二次迭代调用 iter(a,1) 返回 2,a[2]……直到第一个非 nil元素。

9.
协同 : 用途 类似生产者 消费者

co = coroutine.create(function ()
  print("张沈")
  coroutine.yield()
  print("鹏")
end)

print(co)    --> thread: 0x8071d98
协同有三个状态:
    挂起态(suspended)、运行态(running)、停止态(dead)。
   
当我

创建协同程序成功时,其为挂起态,即此时协同程序并未运行。

我们可用 status 函数检查协同的状态:
print(coroutine.status(co))   --> suspended
函数 coroutine.resume使协同程序由挂起状态变为运行态:
coroutine.resume(co)       --> 张沈
coroutine.resume(co)       --> 鹏
任务完成,便进入终止态:
print(coroutine.status(co))   --> dead


协同传入参数

co = coroutine.create(function (a,b,c)
  print("co", a,b,c)
end)
coroutine.resume(co, 1, 2, 3)    --> co  1  2  3

yeild返回参数

co = coroutine.create(function (a,b,c)
  print("co", a,b,c)
end)
coroutine.resume(co, 1, 2, 3)    --> co  1  2  3

yeild获取参数

co = coroutine.create (function ()
  print("co", coroutine.yield())
end)
coroutine.resume(co)
coroutine.resume(co, 4, 5)    --> co  4  5

用来写迭代器

function perm (a)
  local n = table.getn(a)
  return coroutine.wrap(function () permgen(a, n) end)
end

等价于

function perm (a)
  local n = table.getn(a)
  local co = coroutine.create(function () permgen(a, n)  end)
  return function ()  -- iterator
    local code, res = coroutine.resume(co)
    return res
  end
end

10.
阻塞网络
相关文档 http://www.tecgraf.puc-rio.br/~diego/professional/luasocket/tcp.html

require "socket"

function receive (connection)
  return connection:receive(2^10)
end

function download (host, file)
  local c = assert(socket.connect(host, 80))
  local count = 0    -- counts number of bytes read
  c:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
  while true do
    local s, status = receive(c)
    if status == "closed" then break end
    count = count + string.len(s)
  end
  c:close()
  print(file, count)
end

download("www.baidu.com" , "/" )
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics