源码下载:learnLivescript-cn.lsLiveScript是一门具有函数式特点的语言,编译成JavaScript,可以对应JavaScript的基本语法。还有其他功能,例如:柯里化、复合函数、模式匹配,以及从Haskell、F#和Scala借来的许多功能。LiveScript诞生于Coco,Coco诞生于CoffeeScript。LiveScript目前已经发布了稳定版,正在开发中的新版本会增加更多的功能。非常期待您的反馈,您可以通过@kurisuwhyte与我联系:)#与CoffeeScript一样,LiveScript使用#单行注释。/*多行注释和C一样,使用注解避免被输出为JavaScript。*/#部分语法,LiveScript使用缩进而不是{}来定义块,#使用空格而不是()来执行函数。#############################################################################1.值类型#############################################################################`void`代替`undefined`表示未定义的值void#等同于`undefined`但更安全(不会被覆盖)#空值表示为Null。null#最基本的值类型数据是罗辑类型:truefalse#罗辑类型的一些别名,相当于前者:on;关闭;no#数字用双精度浮点数表示,和JS一样。100.4#开头的0是必须的#可以使用下划线和单位后缀提高可读性,编译器会自动跳过下划线和单位后缀。12_344km#和JS一样,字符串是一个不可变的字符序列:"Christina"#单引号也可以!"""多行字符串也可以。"""#前面加一个\符号也可以表示一个字符串:\keyword#=>'keyword'#数组是值的有序集合。fruits=*\apple*\orange*\pear#[]可以简洁的表示数组:fruits=[\apple,\orange,\pear]#可以更方便的创建字符串数组,用空格分隔元素。fruits=<[appleorangepear]>#从0开始的数组下标获取元素:fruits[0]#=>"apple"#该对象是键值对的无序集合(更多细节将在后面的章节中给出)讨论)。person=name:"Christina"likes:*"kittens"*"andothercutestuff"#你也可以用更紧凑的方式表示对象:person={name:"Christina",likes:["kittens","andothercutestuff"]}#你可以通过key获取值:person.name#=>"Christina"person["name"]#=>"Christina"#使用与JavaScript相同的正则表达式:trailing-space=/\s$/#dashed-words变成dashedWords#你也可以用多行描述表达式!(注释和空格将被忽略)funRE=//function\s+(.+)#name\s*\((.*)\)\s*#arguments{(.*)}#body//##############################################################################2.基本操作###########################################################################数值运算符和JavaScript一样:1+2#=>32-1#=>12*3#=>64/2#=>23%2#=>1#大多数比较运算符都是相同,除了`==`相当于JS中的`===`,#JS中的`==`相当于LiveScript中的~=`,#`===`启用对象、数组和严格比较。2==2#=>true2=="2"#=>false2~="2"#=>true2==="2"#=>false[1,2,3]==[1,2,3]#=>false[1,2,3]===[1,2,3]#=>true+0==-0#=>true+0===-0#=>false#其他关系运算符包括<、<=、>和>=#罗辑值可以通过`or`、`and`和`not`进行组合:true和false#=>falsefalseortrue#=>truenotfalse#=>true#集合也有一些方便的操作符[1,2]++[3,4]#=>[1,2,3,4]'a'in<[abc]>#=>true'name'of{name:'Chris'}#=>true################################################################################3.函数############################################################################因为LiveScript是一种具有功能特性的语言,所以您可以期望在该语言中以高标准对待功能。add=(left,right)->left+rightadd1,2#=>3#添加!防止函数执行后返回值two=->2two!#LiveScript使用与JavaScript相同的函数作用域,并具有相同的Closure属性。#与JavaScript的不同之处在于,当赋值`=`变量时,左边的对象永远不会声明为变量。#`:=`运算符允许*重新分配*父作用域中的变量。#你可以解构函数的参数,从可变长度的参数结构中得到有趣的值。tail=([head,...rest])->resttail[1,2,3]#=>[2,3]#您还可以使用一元或二元运算符转换参数。当然你也可以预先设置传入的参数值foo=(a=1,b=2)->a+bfoo!#=>3#可以通过copy方式传入参数,避免副作用,例如:copy=(^^target,source)->fork,vofsource=>target[k]=vtargeta={a:1}copya,{b:2}#=>{a:1,b:2}a#=>{a:1}#使用长箭头替换短箭头来柯里化函数:add=(left,right)-->left+rightadd1=add1add12#=>3#函数中有一个隐含的`it`变量,这意味着你不必声明它。identity=->itidentity1#=>1#operator在LiveScript中不是函数,但你可以简单地将它们转换为函数!#输入运算符分段:divide-by-2=(/2)[2,4,8,16].map(divide-by-2).reduce(+)#LiveScript中不仅有apply函数,比如其他好处在函数式语言中,您可以组合函数以获得更多发挥:double-minus-one=(-1)。(*2)#除了结合`f的常见数学公式。g`,还有`>>`和`<<`运算符定义函数合并的顺序。double-minus-one=(*2)>>(-1)double-minus-one=(-1)<<(*2)#谈到合并函数的参数,LiveScript使用`|>`和`<|`运算符传入参数:map=(f,xs)-->xs.mapf[123]|>map(*2)#=>[246]#也可以选择填写value,只需要使用底线_标记:reduce=(f,xs,initial)-->xs.reducef,initial[123]|>reduce(+),_,0#=>6#您还可以使_将任何函数变成部分函数应用程序:div=(left,right)->left/rightdiv-by-2=div_,2div-by-24#=>2#最后但并非最不重要,LiveScript有一个call-behind特性,可以是基于回调的代码#(你可以尝试其他具有函数特性的解决方案,比如Promises):readFile=(name,f)->fnamea<-readFile'foo'b<-readFile'bar'console.loga+b#等价于:readFile'foo',(a)->readFile'bar',(b)->console.loga+b#############################################################################4.模式、判断和过程控制###########################################################################流程控制可以使用`if...else`表达式:x=ifn>0then\positiveelse\negative#除了`then`你还可以使用`=>`x=ifn>0=>;\positiveelse\negative#过于复杂的过程可以用`switch`表达式代替:y={}x=switch|(typeofy)是\number=>\number|(typeofy)是\string=>\string|y的“长度”=>\array|otherwise=>\object#`otherwise`和`_`是等价的#函数体、声明和赋值都可以表示为`switch`,这样就省去了一些代码:take=(n,[x,...xs])-->|n==0=>[]|_=>[x]++取(n-1),xs#############################################################################5.推导##########################################################################在JavaScript中标准库中有一些辅助函数来帮助处理列表和对象#(LiveScript带有一个prelude.ls作为标准库的补充),#派生允许你使用优雅的语法并快速处理这些东西:oneToTwenty=[1to20]evens=[xforxinoneToTwentywhenx%2==0]#`when`and`unless`可以用作推导中的过滤器。#对象推导的使用方式相同,区别在于你使用的是对象而不是数组:copy={[k,v]fork,vofsource}#############################################################################6.面向对象###########################################################################尽管LiveScript是一种函数式语言,但它具有一些命令式和面向对象的特性。#类语法和类类继承的一些类继承语法糖借用自CoffeeScript:classAnimal(@name,kind)->@kind=kindaction:(what)->"*#{@name}(a#{@kind})#{what}*"classCatextendsAnimal(@name)->super@name,'cat'purr:->@action'purrs'kitten=newCat'Mei'kitten.purr!#=>"*Mei(acat)purrs*"#除了类别的单一继承模式外,它还提供了像混入(Mixins)这样的特性。#Mixins在语言中被视为普通对象:Huggable=hug:->@action'ishugged'classSnugglyCatextendsCatimplementsHuggablekitten=newSnugglyCat'Purr'kitten.hug!#=>"*Mei(acat)ishugged*"进一步阅读LiveScript有更多的力量,但这应该足以激发你写一些小的功能程序。LiveScript有更多关于LiveScript的资料和在线编译器等你来试试!您还可以参考prelude.ls和一些#livescript网络聊天频道。有什么建议吗?还是发现了什么不对?在Github上打开一个问题,或者发起一个pullrequest!最初由克里斯蒂娜·怀特(ChristinaWhyte)撰写,由0位善良的人编辑。?2022ChristinaWhyte翻译:ShengDaLyu本作品采用CCBY-SA3.0许可协议授权。
