Lua

  • 高速
    • JSは爪の垢を煎じて飲むべき。
function fib(n) return n < 2 and n or fib(n-1) + fib(n-2) end

n, t = io.read'*n', os.clock()
print('fib('.. n ..') = '.. fib(n) ..'\n'.. os.clock() - t ..' sec.')
function fib(n) n < 2 ? n : fib(n-1) + fib(n-2);

n = readline(), t = new Date;
print('fib('+ n +') =', fib(n), '\n'+ (new Date - t)/1e3, 'sec.');
$ echo 30| lua fib.lua
fib(30) = 832040
0.609 sec.

$ echo 30| js fib.js
fib(30) = 832040
3.837 sec.
  • 名前
    • カワイイ。
  • 環境
    • 対話モードでいちいち print() 書かされるのヒドイと思っていたが,実は「 = 」で出力できることが判明*1
    • でもtableの中身が見れないと不便なので一工夫必要。
-- i.lua --
_PROMPT  = 'Lua> '
_PROMPT2 = '---> '
say = print
escapees = {['\a']='a', ['\b']='b', ['\f']='f', ['\n']='n',
            ['\r']='r', ['\t']='t', ['\v']='v', ['\\']='\\', ["'"]="'"}
function puts(...) for _,v in pairs{...} do say(v) end end
function peek(tbl) for k,v in pairs(tbl) do say(k, '\n', v) end end
function uneval(v) -- ToDo: circular reference detection
  local t = type(v)
  if 'table' == t then
    t = {}
    for k,x in pairs(v) do
      t[#t+1] = (type(k) == 'number' and '' or tostring(k)..' = ')..uneval(x)
    end
    return '{ '..table.concat(t, ', ')..' }'
  elseif 'string' == t then
    return "'"..v:gsub("['%c]", function(c)
      return '\\'..(escapees[c] or c:byte())
    end).."'"
  else
    return tostring(v)
  end
end
function print(...) for _,v in pairs{...} do say(uneval(v)) end end
$ lua -li
Lua 5.1.3  Copyright (C) 1994-2008 Lua.org, PUC-Rio
Lua> ={42, [3]=1e3, 'hoge', fuga = 'piyo'}
{ 42, 'hoge', 1000, fuga = 'piyo' }
Lua> peek(table)
setn
        function: 00928918
insert
        function: 00928898
getn
        function: 00928818
foreachi
        function: 009287F8
maxn
        function: 00928858
foreach
        function: 00927990
concat
        function: 00927950
sort
        function: 00928958
remove
        function: 009288D8
  • 構文
    • 明らかにゴルフに向いてない。メソッド名はそこそこ短いのだが…。

*1:マニュアルに書いておいて欲しいものである。