我正在为我正在编写的Web应用程序编写一个简单的文本模板语言(想想google的ctemplate).完成后,它将只包含少量可能的操作,简单的事情,如"评估和执行","评估和打印","评估和逃避HTML","评论".我正在考虑从头开始编写整个解析器,但我开始查看解析器生成器,如lex,flex和antlr.对于我的简单语法,这些似乎比我需要的更多.所以问题是,在什么时候使用解析器生成器是切实可行的?
我一直在研究一个轮询TCP守护进程.最近,我已经读过非阻塞套接字有时会在send()或recv()期间抛出EWOULDBLOCK错误.我的理解是,如果recv()抛出一个EWOULDBLOCK,这(通常)意味着没有东西可以接收.但是我不清楚的是在什么情况下send()会抛出一个EWOULDBLOCK,以及处理这样一个事件的正确程序是什么?
如果send()抛出一个EWOULDBLOCK,守护进程是否应该从该事件继续前进到下一个事件?使用像epoll这样的轮询接口,当描述符准备好写入时会触发一个新事件吗?
对于C应用程序(在*nix环境中),我需要在内存中缓存大量(但可变)的小(1千字节到10兆字节)文件.因为我不想吃掉所有内存,所以我想设置硬内存限制(例如,64兆字节)并将文件推送到以文件名为键的哈希表中,并以最少的使用率处理条目.我认为我需要的是一个LRU缓存.
真的,我宁愿不自己动手,所以如果有人知道我在哪里可以找到一个可行的图书馆,请指明方向?如果不这样,有人可以在C中提供LRU缓存的简单示例吗?相关帖子表明一个哈希表有一个双向链表,但我甚至不清楚双链表如何保持LRU.
旁注:我意识到这几乎就是memcache的功能,但它不适合我.我还看了一下希望在LRU缓存上启发自己的消息来源,但没有成功.
我在一个C应用程序中使用Lua,我有两个表.我想创建一个第三个表,它是空的,将索引前两个表中的值.我在Lua中写了以下简单示例 -
a = { one="1", two="2" }
b = { three="3", four="4" }
meta = { __index = function(t,k)
if a[k] == nil then return b[k]
else return a[k] end
end }
c = {}
setmetatable(c, meta)
print(c.one) -- prints "1"
print(c.four) -- prints "4"
Run Code Online (Sandbox Code Playgroud)
我的问题是,从C API执行此操作的最有效方法是什么?我已经能够通过创建一个新表,将上面的Lua代码块推送到该表,然后在其上调用setmetatable(),但这似乎不是最佳的.有没有更好的办法?