LiveScript 是一种编译成 JavaScript 的语言。它与 JavaScript 具有简单的映射关系,允许您编写简洁的代码,避免重复的样板代码。虽然 LiveScript 添加了许多功能来辅助函数式编程,但它也对面向对象和命令式编程进行了许多改进。
更多信息,请查看LiveScript 网站。
LiveScript 1.2.0 添加了新功能,删除了已弃用的功能,改进了编译,并修复了许多错误。
这是循环结构的新增内容,其作用类似于使用 let
语句包装 for
循环体。这允许您在循环内创建函数,这些函数使用循环变量的当前值(而非最终值)。它还可以防止循环变量暴露到周围作用域。
functions = for let x in [1 2 3] -> x functions[0]() #=> 1 functions[1]() #=> 2 functions[2]() #=> 3
var functions, res$, i$, len$; res$ = []; for (i$ = 0, len$ = [1, 2, 3].length; i$ < len$; ++i$) { res$.push((fn$.call(this, [1, 2, 3][i$]))); } functions = res$; functions[0](); functions[1](); functions[2](); function fn$(x){ return function(){ return x; }; }
如果您的文件名以 .json.ls
结尾,则该文件将自动编译成 json,扩展名为 .json
,无需专门使用 -j/--json
选项指定您正在编译 JSON。
例如,lsc -c file.json.ls
会生成 file.json
您目前可以通过在整个函数定义前面添加一个感叹号 !
来静默函数(这意味着阻止它们自动添加 return 语句)。例如,!-> ...
或 !(x) -> ...
。为了简化操作,您现在只需在箭头前面添加 !
即可。这允许您将来向函数添加参数,而无需处理移动 !
。
(x) !-> x (x) !~> x (x) !--> x (x) !~~> x
我们现在改进了对部分应用函数和组合运算符调用的编译。
当您调用部分应用函数时,如果只有一个参数剩余,则会优化编译。
2 |> pow _, 3 |> mod _, 3 #=> 2
mod(pow(2, 3), 3);
组合运算符不再使用辅助函数,而是编译成您手动编写的完全相同的代码。
h = f . g
var h; h = function(){ return f(g.apply(this, arguments)); };
现在会在生成的 JavaScript 文件顶部添加一条注释,显示使用哪个版本的 LiveScript 生成了该文件。// Generated by LiveScript 1.2.0
prelude.ls 进行了重大更新,现在版本为 1.0.3。随着新版本的发布,-d/--prelude
标志需要进行一些更改。如果与 REPL 一起使用,则该标志现在仅需要并导入所有 prelude.ls。如果正在编译,它不再添加自动 require prelude.ls 的代码 - 您必须自己执行此操作,使用新的指南,这些指南建议仅导入所需的内容。
现在,在不打印帮助信息的情况下,只需调用 lsc
即可自动启动 REPL。您仍然可以使用 -h/--help
选项打印帮助信息。
REPL 提示符现在简化为 ls>
。
$ lsc LiveScript 1.2.0 - use 'lsc --help' for more information ls>
已删除几个已弃用的功能。
已删除不存在运算符 !?
,因为它会导致与在感叹号 !
调用上使用存在运算符不一致。请改用存在运算符的否定 - 将 x!?
更改为 not x?
。
长连接运算符 +++
已替换为 ++
,因为它更短。请改用它 - 将 xs +++ ys
更改为 xs ++ ys
。请注意,您必须像前面的示例一样双空格,或者根本不空格:xs++ys
。在运算符的一侧有一个空格,而在另一侧没有空格,不仅看起来很糟糕,而且表示使用了增量运算符,例如 f ++x
使用递增的 x
调用 f
。
已删除 undefined
作为 void
的别名 - 该别名是不必要的。请将 undefined
更改为 void
。
已删除 where
语句。它无法以预期的方式实现 - 如果可以正确实现,它可能会在将来恢复。请改用 let
语句或局部变量。请更改
x = y + z where y = 1, z = 2
至
x = let y = 1, z = 2 y + z
单行级联也被删除了。它们不是很有用,并且与多行级联语法产生了歧义。将 obj..name = 2
更改为 obj <<< name: 2
。
感谢 Nami-Doc 对此版本的众多贡献!还要感谢 satyr(通过 coco)、killdream、clkao、viclib、dtinth 和 racklin 对此版本的贡献!
有关 LiveScript 的更多信息,请查看LiveScript 网站。
有关 LiveScript 和 prelude.ls 的更多信息,关注 @gkzahariev。
由 Disqus 提供支持的评论