LiveScript 1.2.0 发布!

2013年8月2日 - George Zahariev

LiveScript 是一种编译成 JavaScript 的语言。它与 JavaScript 具有简单的映射关系,允许您编写简洁的代码,避免重复的样板代码。虽然 LiveScript 添加了许多功能来辅助函数式编程,但它也对面向对象和命令式编程进行了许多改进。

更多信息,请查看LiveScript 网站

1.2.0

LiveScript 1.2.0 添加了新功能,删除了已弃用的功能,改进了编译,并修复了许多错误。

for let

这是循环结构的新增内容,其作用类似于使用 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

如果您的文件名以 .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

prelude.ls 进行了重大更新,现在版本为 1.0.3。随着新版本的发布,-d/--prelude 标志需要进行一些更改。如果与 REPL 一起使用,则该标志现在仅需要并导入所有 prelude.ls。如果正在编译,它不再添加自动 require prelude.ls 的代码 - 您必须自己执行此操作,使用新的指南,这些指南建议仅导入所需的内容。

REPL

现在,在不打印帮助信息的情况下,只需调用 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)、killdreamclkaoviclibdtinthracklin 对此版本的贡献!

有关 LiveScript 的更多信息,请查看LiveScript 网站


有关 LiveScript 和 prelude.ls 的更多信息,

Disqus 提供支持的评论