MoonScript 代表月亮消灭你

MoonScript 代表月亮消灭你

简介

用一个类比,说清它是什么: MoonScript:Lua=CoffeeScript:JavaScript

MoonScript 可以直接运行(生成Lua中间代码),也可以生成lua,还可以作为包加载到lua中使用require "moonscript"

例子

  1. 定义一个模块module.moon
#!/usr/bin/env moon


export module
module = {}
M = module
M.length = (x, y) -> math.sqrt x*x + y*y

M.print_result = (x, y) ->
  print "Length is ", M.length x, y

-- return M (不必要)
  1. main.moon中调用模块(中的函数)
#!/usr/bin/env moon

moudle = require "module"
import print_result from module

print_result 4, 5 -- prints the result
  1. 运行 运行moon /path/to/main.moon 结果是Length is 6.4031242374328

  2. 编译,生成lua文件 运行moonc /path/to/main.moon 运行moonc /path/to/module.moon

再运行lua Programming/MoonScript/main.lua 结果是Length is 6.4031242374328

生成的Lua代码往往看上去有点杂乱,但是效率很高。

资源

关于语法,可以看它的主页,或者去交互界面玩一下

个人习作

定义模块

#!/usr/bin/env moon

freqdist = {}
M = freqdist

M.count =(array)->
    t = {} -- 记录统计次数信息
    for i, a in ipairs array
        if t[a]     -- t 中存在 a
            t[a] = t[a] + 1  -- 计数 + 1
        else        -- t 中不存在 a
            t[a] = 1   -- 开始计数,a放入表中
    return t

M.ordered_count=(array)->
    set = {}
    count = {}
    for i, a in ipairs array
        if set[a]
            for k, v in ipairs count
                word, times = v[1], v[2]
                if word == a
                    k0=k
                    v0= {a, times+1}
                    break
            k=k0-1
            while k>0
                v = count[k]
                if v[2]>times
                    table.remove count, k0
                    table.insert count, k+1, v0
                    break
                k -=1
            if k==0 then
                table.remove count, k0
                table.insert count, 1, v0
        else
            set[a] = true
            count[#count+1]={a, 1}
    return count


M.freq=(array)->
    -- 计算频率
    t = count array
    N = #array
    for i, a in pairs t
        t[i] = a / N
    return t


M.ngram=(array, n)->
    if n==nil
        n=2
    t={}
    N = #array
    for i=1, N-n
        s ={}
        for j=1, n
            s[j]=array[j+i-1]
        t[i]=s
    return t

return M

注意,没有用export,因此return 是必要的。

调用

#!/usr/bin/env moon

freq = require "freq"

t = freq.count {4, 5,3,1,2,3,4}

for k, a in pairs t
    print k, a

运行moon Programming/MoonScript/hello.moon

1 1 2 1 3 2 4 2 5 1

点赞