上一页 1 2 3 4 5 6 7 8 ··· 10 下一页
摘要: 最近一段时间将原来写的kendynet网络框架重写了大部分的代码,让提供的接口更清晰,对用户更友好。整个框架的架构分层3层:1)单线程,基于原始数据流的网络接口,在这一层上,没有提供封包的处理,定时器事件等等。使用者可以在此之上按自己的需求做进一步的封装。2)单线程,提供connection,封包处理,接收发送超时处理。3)网络逻辑分离的异步网络框架,抽象出三个主要的类型:asynnet_t,sock_ident和msgdisp_t.asynnet_t:网络处理引擎,使用者创建实例的时候可以传入pollercount参数,其中每一个poller都会在单独的线程中运行.sock_ident:逻辑 阅读全文
posted @ 2014-01-13 17:19 sniperHW 阅读(3186) 评论(2) 推荐(1)
摘要: 最近在学习go,对go中网络处理的方式比较喜欢,就用lua coroutine + C 模仿着接口实现一个玩具玩玩.主要框架是lua导入C模块的时候会启动一个网络线程,lua和网络之间通过两个消息队列交互,lua将网络请求通过消息队列发送到C,C将应答和网络事件通过消息队列发送到lua.lua主线程运行在一个coroutine调度循环上,并不断的尝试从队列获得消息,一但收到消息就唤醒等待在此消息上阻塞的lua coroutine.跟go的区别是,go routine是可以在多个处理器核心上运行的.我在设计的时候也考虑过,是否将spwan函数也实现成多线程的,程序启动的时候开N个线程创建N个虚拟 阅读全文
posted @ 2014-01-08 18:46 sniperHW 阅读(1354) 评论(0) 推荐(0)
摘要: Church 整数前驱的推导比其后继复杂得多,wiki中一个前驱的定义据王垠的博客里说,是他一个数学系的同学花一星期时间推导出来的,其定义确实比其它介绍lambda的文章中用pair来实现(据说是图灵的学长花了3个月时间才想出来的)的方式简单许多,本文记录自己学习这个定义的分析过程,Church 整数的详细介绍见:http://zh.wikipedia.org/wiki/%E9%82%B1%E5%A5%87%E6%95%B0pred = λnfx.((n (λgh. h (g f)) (λu. x)) (λu. u)) pred 0 = λnfx.((n (λgh.h (g f)) (λu.. 阅读全文
posted @ 2013-06-20 22:50 sniperHW 阅读(736) 评论(0) 推荐(0)
摘要: 本篇分析continuation的一个著名例子"阴阳迷题",这是由David Madore先生提出的,原谜题如下:(let* ((yin ((lambda (foo) (display "@") foo) (call/cc (lambda (bar) bar)))) (yang ((lambda (foo) (display "*") foo) (call/cc (lambda (bar) bar))))) (yin yang))这里引用了http://www.ibm.com/developerworks/cn/linux/l-sch 阅读全文
posted @ 2013-06-04 12:48 sniperHW 阅读(885) 评论(1) 推荐(0)
摘要: 上一篇文章我参考了很多其它文章,自己对continuation也没有完全吃透,本篇继续贴出自己对continuation的理解,希望大家看完后能理解continuation到底是一个什么东西,当然也希望能得到些反馈,例如看完之后是否能对continuation有个基本的了解,又或者我的解释有没有什么不对的地方.首先看一下tspl中对continuation的介绍:在对scheme表达式求值的过程中,一个scheme实现必须要追踪两样东西:(1)对什么求值(2)对那个值做些什么.考虑下面表达式中的求值过程(null?x).(if (null?x) (quote ()) (cdr x))schem 阅读全文
posted @ 2013-06-03 18:47 sniperHW 阅读(717) 评论(0) 推荐(0)
摘要: continuation是在scheme中被提出和实现的,经典的应用有:no-local exit,exception,back-tracking算法,coroutine等.所谓continuation,其实本来是一个函数调用机制。我们熟悉的函数调用方法都是使用堆栈,采用Activation record或者叫Stack frame来记录从最顶层函数到当前函数的所有context。Continuation则是另一种函数调用方式。它不采用堆栈来保存上下文,而是把这些信息保存在continuation record中。这些continuation record和堆栈的activation reco 阅读全文
posted @ 2013-06-02 16:26 sniperHW 阅读(1905) 评论(0) 推荐(0)
摘要: 这几天继续学习scheme,scheme中虽然有hashtable但没有类似C++中的map,于是把C版本中的红黑树移植到scheme(中间也发现了C版本中的一些问题,暂时懒得调整了^()^)以作为后序set和表格驱动设计中表格的基础数据结构.虽说这个红黑树在C版本中是调试好的了,但移植过来还是花费了我一天多的时间,中间出现各种小问题,苦于并不熟悉如何调试scheme程序,所以进度十分缓慢.(注:代码中大量使用set-car!所以无法再racket中运行,当然也可以调整rbnode的表示形式,不使用list来表示各字段,只使用set!修改字段的内容以使得可以被racket支持)(begin . 阅读全文
posted @ 2013-05-31 12:37 sniperHW 阅读(692) 评论(2) 推荐(0)
摘要: ;pair ;cons可以用于构建pair,如(cons 1 2)->(1 . 2) ;car获得pair中的first,cdr获得pair中的second ;(car (cons 1 2))->1 (cdr (cons 1 2))->2 ;(cons 1 (cons 2 3))->(1 2 . 3)这是scheme输出pair时候的一种简略形式 ;实际上述pair的first是1,second是(2 . 3) ;类似的(cons 1 (cons 2 (cons 3 4)))->(1 2 3 . 4) ;实际的存储形式是(1 . (2 . (... 阅读全文
posted @ 2013-05-29 16:41 sniperHW 阅读(2468) 评论(0) 推荐(0)
摘要: 刚看了sicp的前两章,一直没看到有关于变量赋值,遂以为scheme跟erlang一样,变量是不可改变的.今天下了本"the scheme programming language"看了下第二章,发现原来scheme也是支持变量赋值的。于是写了一段代码测试下,以下代码定义了一个定长数组类型,数组的维度由init确定,例如要定义一个2 X 2的数组(make-array (list (list 0 0) (list 0 0)) ,这里要注意的一点是init必须显式的用list来定义,如果定义成'((0 0)(0 0))则在set的时候会出错,认为被set的列表是不可被 阅读全文
posted @ 2013-05-25 15:38 sniperHW 阅读(2459) 评论(0) 推荐(0)
摘要: 很简单的问题,最笨的算法,自己第一个用scheme写的稍微算长点的程序.废话不多说,直接上代码.(begin (load "ex2.scm") (define (make-maze) (define (for-each proc things) (cond ((null? things) nil) (else (let ((ret (proc (car things)))) (if (null? ret) (for-each proc (cdr things))... 阅读全文
posted @ 2013-05-23 23:11 sniperHW 阅读(318) 评论(0) 推荐(0)
上一页 1 2 3 4 5 6 7 8 ··· 10 下一页