Correct typo and rewrite the meaning of :=

This commit is contained in:
sdlyu 2014-09-29 10:30:40 +08:00
parent 0c77c29c88
commit 221d72bcb0

View File

@ -9,7 +9,7 @@ lang: zh-cn
--- ---
LiveScript 是一种具有函数式特性且编译成 JavaScript 的语言,能对应 JavaScript 的基本语法。 LiveScript 是一种具有函数式特性且编译成 JavaScript 的语言,能对应 JavaScript 的基本语法。
还有些额外的特性如:柯里化,函式组合,模式匹配,还有借镜于 HaskellF# 和 Scala 的许多特点。 还有些额外的特性如:柯里化,组合函数,模式匹配,还有借镜于 HaskellF# 和 Scala 的许多特点。
LiveScript 诞生于 [Coco][],而 Coco 诞生于 [CoffeeScript][]。 LiveScript 诞生于 [Coco][],而 Coco 诞生于 [CoffeeScript][]。
LiveScript 目前已释出稳定版本,开发中的新版本将会加入更多特性。 LiveScript 目前已释出稳定版本,开发中的新版本将会加入更多特性。
@ -17,7 +17,7 @@ LiveScript 目前已释出稳定版本,开发中的新版本将会加入更多
[Coco]: http://satyr.github.io/coco/ [Coco]: http://satyr.github.io/coco/
[CoffeeScript]: http://coffeescript.org/ [CoffeeScript]: http://coffeescript.org/
非常期待您的反馈,你可以 非常期待您的反馈,你可以
[@kurisuwhyte](https://twitter.com/kurisuwhyte) 与我连系 :) [@kurisuwhyte](https://twitter.com/kurisuwhyte) 与我连系 :)
@ -44,11 +44,11 @@ void # 与 `undefined` 等价但更安全(不会被覆写)
null null
# 最基本的值类型数据是罗辑类型: # 最基本的值类型数据是罗辑类型
true true
false false
# 罗辑类型的一些别名,等价于前者: # 罗辑类型的一些别名,等价于前者
on; off on; off
yes; no yes; no
@ -58,55 +58,55 @@ yes; no
0.4 # 开头的 0 是必要的 0.4 # 开头的 0 是必要的
# 可以使用底线及单位后缀提高可读性,编译器自动略过底线及单位后缀。 # 可以使用底线及单位后缀提高可读性,编译器自动略过底线及单位后缀。
12_344km 12_344km
# 字串与 JS 一样,是一种不可变的字元序列: # 字串与 JS 一样,是一种不可变的字元序列
"Christina" # 单引号也可以! "Christina" # 单引号也可以
"""Multi-line """Multi-line
strings strings
are are
okay okay
too.""" too."""
# 在前面加上 \ 符号也可以表示字串: # 在前面加上 \ 符号也可以表示字串
\keyword # => 'keyword' \keyword # => 'keyword'
# 阵列是值的有序集合。 # 数组是值的有序集合。
fruits = fruits =
* \apple * \apple
* \orange * \orange
* \pear * \pear
# 可以用 [] 简洁地表示阵列: # 可以用 [] 简洁地表示数组:
fruits = [ \apple, \orange, \pear ] fruits = [ \apple, \orange, \pear ]
# 你可以更方便地建立字串阵列,并使用空白区隔元素。 # 你可以更方便地建立字串数组,并使用空白区隔元素。
fruits = <[ apple orange pear ]> fruits = <[ apple orange pear ]>
# 以 0 为起始值的数组下标获取元素: # 以 0 为起始值的数组下标获取元素
fruits[0] # => "apple" fruits[0] # => "apple"
# 物件是无序键值对集合(更多给节将在下面章节讨论) # 对象是无序键值对集合(更多给节将在下面章节讨论)。
person = person =
name: "Christina" name: "Christina"
likes: likes:
* "kittens" * "kittens"
* "and other cute stuff" * "and other cute stuff"
# 你也可以用更简洁的方式表示物件: # 你也可以用更简洁的方式表示对象:
person = {name: "Christina", likes: ["kittens", "and other cute stuff"]} person = {name: "Christina", likes: ["kittens", "and other cute stuff"]}
# 可以透过键值获取值: # 可以通过键值获取值:
person.name # => "Christina" person.name # => "Christina"
person["name"] # => "Christina" person["name"] # => "Christina"
# 正则表达式的使用跟 JavaScript 一样: # 正则表达式的使用跟 JavaScript 一样
trailing-space = /\s$/ # dashed-words 变成 dashedWords trailing-space = /\s$/ # dashed-words 变成 dashedWords
# 你也可以用多行描述表达式!(注解和空白会被忽略) # 你也可以用多行描述表达式!(注解和空白会被忽略)
@ -121,7 +121,7 @@ funRE = //
## 2. 基本运算 ## 2. 基本运算
######################################################################## ########################################################################
# 数值运算子与 JavaScript 一样: # 数值操作符与 JavaScript 一样:
1 + 2 # => 3 1 + 2 # => 3
2 - 1 # => 1 2 - 1 # => 1
2 * 3 # => 6 2 * 3 # => 6
@ -129,9 +129,9 @@ funRE = //
3 % 2 # => 1 3 % 2 # => 1
# 比较运算子大部份也一样,除了 `==` 等价于 JS 中的 `===` # 比较操作符大部份也一样,除了 `==` 等价于 JS 中的 `===`
# JS 中的 `==` 在 LiveScript 里等价于 `~=` # JS 中的 `==` 在 LiveScript 里等价于 `~=`
# `===` 能进行物件、阵列和严格比较。 # `===` 能进行对象、数组和严格比较。
2 == 2 # => true 2 == 2 # => true
2 == "2" # => false 2 == "2" # => false
2 ~= "2" # => true 2 ~= "2" # => true
@ -143,15 +143,15 @@ funRE = //
+0 == -0 # => true +0 == -0 # => true
+0 === -0 # => false +0 === -0 # => false
# 其它关系运算子包括 <<=、> 和 >= # 其它关系操作符包括 <<=、> 和 >=
# 罗辑值可以透过 `or`、`and` 和 `not` 结合: # 罗辑值可以通过 `or`、`and` 和 `not` 结合:
true and false # => false true and false # => false
false or true # => true false or true # => true
not false # => true not false # => true
# 集合也有一些便利的运算子 # 集合也有一些便利的操作符
[1, 2] ++ [3, 4] # => [1, 2, 3, 4] [1, 2] ++ [3, 4] # => [1, 2, 3, 4]
'a' in <[ a b c ]> # => true 'a' in <[ a b c ]> # => true
'name' of { name: 'Chris' } # => true 'name' of { name: 'Chris' } # => true
@ -165,25 +165,25 @@ not false # => true
add = (left, right) -> left + right add = (left, right) -> left + right
add 1, 2 # => 3 add 1, 2 # => 3
# 加上 ! 防止函数执行后的回 # 加上 ! 防止函数执行后的回值
two = -> 2 two = -> 2
two! two!
# LiveScript 与 JavaScript 一样使用函式作用域,且一样拥有闭包的特性。 # LiveScript 与 JavaScript 一样使用函式作用域,且一样拥有闭包的特性。
# 与 JavaScript 不同的地方在于,`=` 变数赋值时,左边的运算元永远不用变数宣告。 # 与 JavaScript 不同的地方在于,`=` 变量赋值时,左边的对象永远不用变量宣告。
# `:=` 运算子在作用域里允许*重用*变数名并创建新的变数作用域 # `:=` 操作符允许*重新賦值*父作用域里的变量
# 你可以解构函数的参数,从不定长度的参数结构里获取感兴趣的值。 # 你可以解构函数的参数,从不定长度的参数结构里获取感兴趣的值。
tail = ([head, ...rest]) -> rest tail = ([head, ...rest]) -> rest
tail [1, 2, 3] # => [2, 3] tail [1, 2, 3] # => [2, 3]
# 你也可以使用一元或二元运算子转换参数。当然也可以预设传入的参数值。 # 你也可以使用一元或二元操作符转换参数。当然也可以预设传入的参数值。
foo = (a = 1, b = 2) -> a + b foo = (a = 1, b = 2) -> a + b
foo! # => 3 foo! # => 3
# 你可以以复制的方式传入参数来避免副作用,例如: # 你可以以拷贝的方式传入参数来避免副作用,例如:
copy = (^^target, source) -> copy = (^^target, source) ->
for k,v of source => target[k] = v for k,v of source => target[k] = v
target target
@ -192,52 +192,52 @@ copy a, { b: 2 } # => { a: 1, b: 2 }
a # => { a: 1 } a # => { a: 1 }
# 使用长箭号取代短箭号来柯里化一个函数: # 使用长箭号取代短箭号来柯里化一个函数
add = (left, right) --> left + right add = (left, right) --> left + right
add1 = add 1 add1 = add 1
add1 2 # => 3 add1 2 # => 3
# 函式里有一个隐式的 `it`,意谓着你不用宣告它。 # 函式里有一个隐式的 `it`,意谓着你不用宣告它。
identity = -> it identity = -> it
identity 1 # => 1 identity 1 # => 1
# 运算子在 LiveScript 里不是一個函数,但你可以简单地将它们转换成函数! # 操作符在 LiveScript 里不是一個函数,但你可以简单地将它们转换成函数!
# Enter the operator sectioning: # Enter the operator sectioning
divide-by-2 = (/ 2) divide-by-2 = (/ 2)
[2, 4, 8, 16].map(divide-by-2) .reduce (+) [2, 4, 8, 16].map(divide-by-2) .reduce (+)
# LiveScript 里不只有应用函数,如同其它良好的函数式语言,你可以合并函数获得更多发挥: # LiveScript 里不只有应用函数,如同其它良好的函数式语言,你可以合并函数获得更多发挥
double-minus-one = (- 1) . (* 2) double-minus-one = (- 1) . (* 2)
# 除了普通的数学公式合并 `f . g` 之外,还有 `>>``<<` 运算子定义函数的合并顺序。 # 除了普通的数学公式合并 `f . g` 之外,还有 `>>``<<` 操作符定义函数的合并顺序。
double-minus-one = (* 2) >> (- 1) double-minus-one = (* 2) >> (- 1)
double-minus-one = (- 1) << (* 2) double-minus-one = (- 1) << (* 2)
# 说到合并函数的参数, LiveScript 使用 `|>``<|` 运算子将参数传入: # 说到合并函数的参数, LiveScript 使用 `|>``<|` 操作符将参数传入:
map = (f, xs) --> xs.map f map = (f, xs) --> xs.map f
[1 2 3] |> map (* 2) # => [2 4 6] [1 2 3] |> map (* 2) # => [2 4 6]
# 你也可以选择填入值的位置,只需要使用底线 _ 标记: # 你也可以选择填入值的位置,只需要使用底线 _ 标记
reduce = (f, xs, initial) --> xs.reduce f, initial reduce = (f, xs, initial) --> xs.reduce f, initial
[1 2 3] |> reduce (+), _, 0 # => 6 [1 2 3] |> reduce (+), _, 0 # => 6
# 你也能使 _ 让任何函数变成偏函数应用: # 你也能使 _ 让任何函数变成偏函数应用
div = (left, right) -> left / right div = (left, right) -> left / right
div-by-2 = div _, 2 div-by-2 = div _, 2
div-by-2 4 # => 2 div-by-2 4 # => 2
# 最后也很重要的LiveScript 拥有後呼叫特性, 可以是基於回调的代码 # 最后也很重要的LiveScript 拥有後呼叫特性, 可以是基於回调的代码
# (你可以试试其它函数式特性的解法,比如 Promises): # (你可以试试其它函数式特性的解法,比如 Promises
readFile = (name, f) -> f name readFile = (name, f) -> f name
a <- readFile 'foo' a <- readFile 'foo'
b <- readFile 'bar' b <- readFile 'bar'
console.log a + b console.log a + b
# 等同於: # 等同於
readFile 'foo', (a) -> readFile 'bar', (b) -> console.log a + b readFile 'foo', (a) -> readFile 'bar', (b) -> console.log a + b
@ -245,14 +245,14 @@ readFile 'foo', (a) -> readFile 'bar', (b) -> console.log a + b
## 4. 模式、判断和流程控制 ## 4. 模式、判断和流程控制
######################################################################## ########################################################################
# 流程控制可以使用 `if...else` 表达式: # 流程控制可以使用 `if...else` 表达式
x = if n > 0 then \positive else \negative x = if n > 0 then \positive else \negative
# 除了 `then` 你也可以使用 `=>` # 除了 `then` 你也可以使用 `=>`
x = if n > 0 => \positive x = if n > 0 => \positive
else \negative else \negative
# 过於复杂的流程可以用 `switch` 表达式代替: # 过於复杂的流程可以用 `switch` 表达式代替
y = {} y = {}
x = switch x = switch
| (typeof y) is \number => \number | (typeof y) is \number => \number
@ -260,7 +260,7 @@ x = switch
| 'length' of y => \array | 'length' of y => \array
| otherwise => \object # `otherwise``_` 是等价的。 | otherwise => \object # `otherwise``_` 是等价的。
# 函数主体、宣告式和赋值式可以表式成 `switch`,这可以省去一些代码: # 函数主体、宣告式和赋值式可以表式成 `switch`,这可以省去一些代码
take = (n, [x, ...xs]) --> take = (n, [x, ...xs]) -->
| n == 0 => [] | n == 0 => []
| _ => [x] ++ take (n - 1), xs | _ => [x] ++ take (n - 1), xs
@ -270,15 +270,15 @@ take = (n, [x, ...xs]) -->
## 5. 推导式 ## 5. 推导式
######################################################################## ########################################################################
# 在 JavaScript 的标准函式库里有一些辅助函数能帮助处理列表及物件 # 在 JavaScript 的标准函式库里有一些辅助函数能帮助处理列表及对象
#LiveScript 则带有一个 prelude.ls ,作为标准函式库的补充 #LiveScript 则带有一个 prelude.ls ,作为标准函式库的补充
# 推导式能让你使用优雅的语法且快速地处理这些事: # 推导式能让你使用优雅的语法且快速地处理这些事
oneToTwenty = [1 to 20] oneToTwenty = [1 to 20]
evens = [x for x in oneToTwenty when x % 2 == 0] evens = [x for x in oneToTwenty when x % 2 == 0]
# 在推导式里 `when``unless` 可以当成过滤器使用。 # 在推导式里 `when``unless` 可以当成过滤器使用。
# 物件推导式在使用上也是同样的方式,差别在于你使用的是物件而不是阵列: # 对象推导式在使用上也是同样的方式,差别在于你使用的是对象而不是数组:
copy = { [k, v] for k, v of source } copy = { [k, v] for k, v of source }
@ -286,8 +286,8 @@ copy = { [k, v] for k, v of source }
## 6. OOP ## 6. OOP
######################################################################## ########################################################################
# 虽然 LiveScript 是一门函数式语言,但有具自一些命令式及面向物件语言的特性。 # 虽然 LiveScript 是一门函数式语言,但具有一些命令式及面向对象的特性。
# 像是 class 语法和一些借镜於 CoffeeScript 的类别继承语法糖: # 像是 class 语法和一些借镜於 CoffeeScript 的类别继承语法糖
class Animal class Animal
(@name, kind) -> (@name, kind) ->
@kind = kind @kind = kind
@ -300,8 +300,8 @@ class Cat extends Animal
kitten = new Cat 'Mei' kitten = new Cat 'Mei'
kitten.purr! # => "*Mei (a cat) purrs*" kitten.purr! # => "*Mei (a cat) purrs*"
# 除了类别的单一继承模式之外,还提供了像混入 Mixins 这种特性。 # 除了类别的单一继承模式之外,还提供了像混入 (Mixins) 这种特性。
# Mixins 在语言里被当成普通物件: # Mixins 在语言里被当成普通对象:
Huggable = Huggable =
hug: -> @action 'is hugged' hug: -> @action 'is hugged'
@ -315,8 +315,8 @@ kitten.hug! # => "*Mei (a cat) is hugged*"
LiveScript 还有许多强大之处,但这些应该足够启发你写些小型函数式程式了。 LiveScript 还有许多强大之处,但这些应该足够启发你写些小型函数式程式了。
[LiveScript](http://livescript.net/)有更多关于 LiveScript 的资讯 [LiveScript](http://livescript.net/)有更多关于 LiveScript 的资讯
和线上编译器等着你来试! 和线上编译器等着你来试
你也可以参考 你也可以参考
[prelude.ls](http://gkz.github.io/prelude-ls/),和一些 `#livescript` [prelude.ls](http://gkz.github.io/prelude-ls/),和一些 `#livescript`
的网聊天室频道。 的网聊天室频道。