这两天一直在看coffeescript相关的东西,也帮一个朋友搞了个生产者-消费者模型的C语言实现。想到还没用coffeescript真正意义上写过程序,那就尝试做一下吧。
其实《CoffeeScript小书》是暑假实习时就买了,一直比较向往着函数式编程却拖延了很久没行动起来。小书只有几十页,本是github上一个开源的项目,我喜欢这种轻巧的文字。语法部分看下来,再看下类与继承,只花了半天的时间,而且心情非常愉悦,然后就可以开始我菜鸟的第一次试飞了。
生产者-消费者模型没什么好说的了,就是读写共享缓冲区,pv操作控制是否冲突。更多的就是冲着coffeescript来的。下面是一些凌乱但自认为有思考价值的记录,或许后续我会继续写一些coffeescript的学习笔记,再做深入的研究。
demo,可尝试点击“生产”“消费”按钮
litten如是想:
- 我一定要学一门,至少一门函数式风格编程语言,没有太深远的想法,就觉得它就是我的菜
- 这个程序是66行的coffeescript代码,最后编译后得到了122行的js代码,说明编程效率提升显著
- 括号,方括号,花括号,还有逗号有时候会多烦人,特别是使用过ExtJs的人,而coffeescript可以没有
- 用法简洁的jquery在coffeescript里面会更简洁
- 关于coffeescript的循环,它不推荐你使用for循环,而是使用“推导”,暴露在底层的循环只有while语法
- 事件绑定时,使用=>可以免去js上下文切换this的麻烦
- coffeescript的数组迭代方法非常的酷,三言两语说不清
- javascript会是下一个JVM吗?
- 站在产品的角度,我认为coffeescript这名字太长了-_-!
附上源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| N = 10
class ProCon data: mutex:1 empty:N full:0 front:0 rear:0 buf: [] init:-> i = 0 while i<N newDom = $('<div class="bufBox"><div class="bufCover">'+i+'</div>'+i+'</div>') $('#buf').append(newDom) @data.buf.push 'e' i++ $('#produce').click => @producer() $('#consume').click => @consumer() p:(num)-> return --num v:(num)-> return ++num produceItem:-> $('<p class="desPro">生产了产品</p>').insertBefore $("#des p:first") return 'm' consumeItem:-> $('<p class="desCon">消费了产品</p>').insertBefore $("#des p:first") enterItem:(item) -> @data.front = (@data.front+1)%N @data.buf[@data.front] = item; str = "存入产品#{@data.buf[@data.front]}到缓冲区#{@data.front}" $("<p class='desPro'>#{str}</p>").insertBefore $("#des p:first") $($('.bufCover')[@data.front]).animate "height":"50px" removeItem:-> @data.rear = (@data.rear + 1) % N; @data.buf[@data.rear] = 'e'; str = "取出产品#{@data.buf[@data.rear]}从缓冲区#{@data.rear}" $("<p class='desCon'>#{str}</p>").insertBefore $("#des p:first") $($('.bufCover')[@data.rear]).animate "height":"0px" producer:-> if @data.full==N $("<p class='desSpe'>缓冲区已全满</p>").insertBefore $("#des p:first") return item = @produceItem() @data.empty = @p(@data.empty) @data.mutex = @p(@data.mutex) @enterItem(item) @data.mutex = @v(@data.mutex) @data.full = @v(@data.full) consumer:-> if @data.empty==N $("<p class='desSpe'>缓冲区已空</p>").insertBefore $("#des p:first") return @data.full = @p(@data.full) @data.mutex = @p(@data.mutex) @removeItem() @data.mutex = @v(@data.mutex) @data.empty = @v(@data.empty) @consumeItem() procon = new ProCon procon.init();
|