100の言語Spedrdrun:エピソード04:Lua


Luaはブラジルからの小さなプログラミング言語であり、おそらく世界中で大きな影響を与えたブラジルから出てきた唯一の技術である.
他の言語からのLuaを区別する主な特徴は、それが実際に既存のアプリケーションに埋め込まれていることに適しているということです、そして、それは特にテレビゲームのために人気がありますhere's just a partial list ).
原則として、Tcl、Python、JavaScriptなどの既存の言語の任意の仮想マシンについてだけで埋め込むことができます.これはLuaを埋め込むよりはるかに複雑である傾向があります.最近JavaScriptは、その主要なニッチからLuaをますますプッシュしていますが、ゲーム開発やモーディングを取得する場合は、いくつかの基本的なLuaはまだ有用なスキルを持っている.我々はルアを探索するように、なぜそれが人気を失っているいくつかの理由を発見することがあります.

こんにちは、世界!
このコードはあまり驚かないでしょう.
print("Hello, World!")
ここでfibonacciは、あまり奇妙ではない-- コメントと範囲ループ構文
-- Fibonacci function
function fib(n)
  if n < 3 then
    return 1
  else
    return fib(n - 1) + fib(n - 2)
  end
end

for i = 1,30 do
  print(fib(i))
end
そして、フィズバズ
function fizzbuzz(n)
  if n % 15 == 0 then
    return "FizzBuzz"
  elseif n % 5 == 0 then
    return "Buzz"
  elseif n % 3 == 0 then
    return "Fizz"
  else
    return n
  end
end

for i = 1,100 do
  print(fizzbuzz(i))
end

テーブル
Luaは、配列/リストと辞書/ハッシュ/オブジェクトとして役立つ「テーブル」と呼ばれている一つのデータ構造を持ちます.
実際にどのように動作するかを見てみましょう.
local x = {"foo", "bar"}
local y = {"foo", "bar"}

print(x)
print(y)
print(x == y)
私たちがうんざりするだろう
{"foo", "bar"}
{"foo", "bar"}
true
しかし、代わりに我々が得るものは:
table: 0x7fb9cee04080
table: 0x7fb9cee040e0
false
そうですね.Luaは複雑なタイプ(JavaScriptによって共有される同じblight)に取り組んでいる平等を持ちません、そして、それはビルトインさえありませんconsole.log .

我々自身の検査を書きましょう
まあ、自分自身の検査を書くのは難しいことではない.それは驚くべきではなく、かなりきれいな印刷をしません、そして、データがそれ自体にリンクするならば、それは無限ループに入ることができます、そして、その上、それは現在我々の目的に役に立ちます.
function inspect(value)
  if type(value) == "table" then
    local result = ""
    for k, v in pairs(value) do
      if result ~= "" then
        result = result .. ", "
      end
      result = result .. tostring(k) .. "=" .. inspect(v)
    end
    return "{" .. result .. "}"
  else
    return tostring(value)
  end
end

local x = {"foo", "bar"}
local y = {name="Bob", surname="Ross", age=52}

print(inspect(x))
print(inspect(y))
これは
{1=foo, 2=bar}
{age=52, name=Bob, surname=Ross}
私たちは何を学びましたか.
  • type(value) パスの種類を返します."table" 大部分の複合型のために
  • 文字列は.. , ストリング補間はありません
  • != 綴られる~=
  • テーブル内のキーの順序は保存されません
  • 配列番号は1から始まります!
  • 最後の1つは少しのショックかもしれません.今日では、プログラミング言語は0ベースと1ベースのインデックスの間に分割された.Luaは、これらの回の最後の残高については、0ベースのインデックスを獲得している.
    ところで、Perlは陽気に$[ これは配列インデクシングを決定する特別な変数でした.彼らはある時点でこの機能を削除しました.それは実際に全く正気ではありませんでした、それはPerlにawkスクリプトを移植するのを助けるように設計されました.多分、私は若干の点でその話に着きます.

    ユニコード
    LuaがUnicodeでどのように対処するかを見てみましょう.
    a = "Hello"
    b = "Żółw"
    c = "💩"
    
    print(a:lower())
    print(b:upper())
    print(#a)
    print(#b)
    print(#c)
    
    そして、それがわかるように、非常に不十分です.
    hello
    ŻółW
    5
    7
    4
    
    残念ながら:lower() and :upper() ユニコードについて何も知らない# 文字列の長さを返します.string.len(a) と同じです#a , バイト数を返す).

    あなたはLuaを使用する必要がありますか?
    正直に新しいプログラムのためにではなく、実際には、それはまだゲームの開発に興味がある場合は基本を知る価値がある.それはまだゲームのスクリプトで重要な存在感を持っています.あなたが見たように、非常に単純なことをしても、言語の弱さのために問題を起こし続けました.
    Luaはまた、コミュニティの断片化に重大な問題があるようです.Lujit実装はLua 5.1のかなり古いバージョンをサポートしていますが、メイン言語は5.3にすでに移行しました.Luaコードがいくつかのエンジン(通常ゲームエンジン)に埋め込まれる傾向があるので、コードの多くはエンジンによって提供されるいろいろな機能に依存して、他の所で走らないでしょう.Luarocksは3000のパッケージを持っています.そして、それはすべての岩が彼らがそうしないあらゆるルアーで走ったとしても、130 kのRuby Gemsまたは1.3 M NPMパッケージと比較して小さいです.
    たった今、Luaは途中で言語のように見えます、しかし、ものはまだ回ることができました.そして、他のほとんどのソフトウェアとは異なり-ビデオゲームは、リリース後に使用数十年を参照してください、それらのルアコードで.

    コード
    All code examples for the series will be in this repository .
    Code for the Lua episode is available here .