是否可以在Coffeescript中进行代码生成?

时间:2011-11-18 22:45:01

标签: metaprogramming coffeescript

说我有一些Coffeescript(混合了Underscore.js),如下所示:

someData =
  hello: 'haha'
_(3).times (index) ->
  someData["key-#{index}"] = index

someData的值将是:

hello: 'haha'
key-0: 0
key-1: 1
key-2: 2

如果Coffeescript有一些语法糖可以让我写下这样的话会很好:

    someData =
      hello: 'haha'
<%
    _(3).times (index) ->
%>
      key-#{index}: index

会生成someData,其值与原始值相同。

Coffeescript中有这样的设施吗?

3 个答案:

答案 0 :(得分:5)

简短回答:不。

更长的答案:这种语法将超越CoffeeScript的意图,即使用JavaScript作为一个简单的语言,约为1:1。但是,您可以在CoffeeScript之上使用另一种模板语言。实际上,使用Rails 3.1,拥有.coffee.erb文件非常简单,其中Ruby代码可用于生成CoffeeScript代码,就像您的假设示例一样。

答案 1 :(得分:1)

补充Trevor的答案:代码生成(a'la Lisp)确实很强大,但你也可以使用一些基本的抽象来构建结构。对于您的示例(它使用了此underscore mixin中的一些函数):

data = _(
  hello: 'haha'
).merge(_([0..2]).mash (x) -> ["key-" + x, x])

答案 2 :(得分:0)

简短回答:是的,等等。

稍微简短的回答: 由于coffeescript是用coffeescript编写的(用coffeescript编写的),你可以用精美的风格做OP所追求的东西。像ERB模板一样,如果你的用例很简单,可能是一个更好的选择,但没有什么比编程操作AST结构更真实强大的&amp;可重复使用的代码生成。

在这方面,Coffeescript显示出几乎有点像http://en.wikipedia.org/wiki/Homoiconicity(lisps的喜悦)的中途,但不是真的。

这是一个例子: http://blog.davidpadbury.com/2010/12/09/making-macros-in-coffeescript/

怀旧的沉思

“javascript”的灵感来自于http://en.wikipedia.org/wiki/Scheme_(programming_language) ...之前它被称为javascript ...所以coffeescript有点将JS带回其根源,消除了其语法中的营销乱码,因为Sun&amp; amp; amp; amp; amp; amp; amp; amp; amp; Netscape高管。