[ Fennel ]: Lua Primer

  • 重要なトップレベル関数

  • io モジュール

  • テーブル モジュール

  • その他の重要なモジュール

  • 不足しているもの

  • 高度な機能

  • Lua の読み込み

  • わかりにくい機能

チュートリアルを読み終えたら、Fennel と Lua の関係について疑問に思うかもしれません。これまで Lua でプログラミングしたことがない方もご心配なく。Lua は最もシンプルなプログラミング言語の 1 つです。Lua コードを書かずに Fennel を学ぶことは可能ですが、特定の概念については Lua のドキュメントに代わるものはありません。

『Programming in Lua』という本は、入門書として最適です。第 1 版 はオンラインで無料で入手でき、モジュールに関するセクション以外は今でも役立ちます。ただし、かなり長いので、他の言語でプログラミングしたことがある場合は、Lua が他の言語と大きく異なる特定の領域に焦点を当てると、より早く理解できるようになります。

Lua の型には次のものがあります。

  • nil: 何も表さず、条件文では false として扱われます

  • ブール値: true と false

  • 数値: 5.3 で整数が追加されるまでは倍精度浮動小数点のみ

  • 文字列: 不変、任意のバイナリ データを含めることができます

  • テーブル: 唯一のデータ構造

  • コルーチン: プリエンプティブ マルチタスクのメカニズム

  • ユーザーデータ: C コードから派生した型を表す

これらのうち、テーブルは最も複雑で、他の言語で慣れているものと最も異なります。最も重要な考慮事項は、テーブルがシーケンシャル データ (リスト、ベクター、配列など) と連想データ (マップ、辞書、ハッシュなど) の両方に使用されることです。同じテーブルを両方の役割で使用できます。テーブルがシーケンシャルか連想かは、テーブル自体の固有のプロパティではなく、特定のコードがテーブルとどのようにやり取りするかによって決まります。`ipairs` を使用してテーブルを反復処理すると、テーブルは配列として扱われ、`pairs` は順序なしのキー/値マップとして扱われます。

Lua リファレンス マニュアル では、より簡潔な形式で言語全体 (新しいバージョンの詳細を含む) をカバーしており、特定のものを探すときに便利です。このドキュメントの残りの部分では、標準ライブラリの非常に簡単な概要を説明します。

他の Lua ランタイムまたは埋め込みコンテキストでは、通常、ここで説明されていないものが導入されます。

重要なトップレベル関数

  • `tonumber`: 文字列引数を数値に変換します。オプションの基数を取る

  • `tostring`: 引数を文字列に変換

  • `print`: タブ文字で区切られたすべての引数の `tostring` を出力

  • `type`: 引数の型を説明する文字列を返す

  • `pcall`: 関数を保護モードで呼び出すため、エラーは致命的ではない

  • `error`: 実行を停止し、最も近い `pcall` にブレークする

  • `assert`: 条件が nil/false の場合はエラーを発生させ、それ以外の場合はそれを返す

  • `ipairs`: 連続したテーブルを反復処理する

  • `pairs`: 連続しているかどうかに関係なく、任意のテーブルを未定義の順序で反復処理する

  • `unpack`: 連続したテーブルを複数の値に変換する (5.2 以降では table.unpack)

  • `require`: 指定されたモジュールをロードして返す

テーブルに対して `tostring` を使用すると、満足のいく結果が得られないことに注意してください。 REPL でテーブルを評価するだけで、`fennel.view` が呼び出され、人間が読める形式のテーブル ビューが表示されます (または、コード内で `fennel.view` を明示的に呼び出すこともできます)。

io モジュール

このモジュールには、ファイル システムを操作する関数が含まれています。ディレクトリ リストが存在しないことに注意してください。そのためには、luafilesystem ライブラリが必要です。

ファイルを開くには、`io.open` を使用します。これは、成功した場合はファイル記述子を返し、失敗した場合は nil とメッセージを返します。この失敗時の振る舞いにより、`assert` でラップして失敗をエラーに変換するのに適しています。ファイル記述子でメソッドを呼び出し、`f:close` で終了することができます。

    (let [f (assert (io.open "path/to/file"))]
      (print (f:read)) ; reads a single line by default
      (print (f:read "*a")) ; you can read the whole file
      (f:close))

また、`:w` を 2 番目の引数として `io.open` を呼び出してファイルを書き込みモードで開き、ファイル記述子に対して `f:write` と `f:flush` を呼び出すこともできます。

このモジュールのもう 1 つの重要な関数は `io.lines` 関数で、これはファイルのすべての行の反復子を返します。

    (each [line (io.lines "path/to/file")]
      (process-line line))

ファイルの終わりを検出すると、自動的にファイルを閉じます。また、`io.open` を使用して取得したファイル記述子に対して `f:lines` を呼び出すこともできます。

テーブル モジュール

これには、いくつかの基本的なテーブル操作関数が含まれています。これらの関数はすべて、一般的なキー/値テーブルではなく、連続したテーブルに対して動作します。最も重要な関数を次に説明します。

`table.insert` 関数は、テーブル、オプションの位置、および要素を受け取り、その位置に要素をテーブルに挿入します。位置は、デフォルトでテーブルの末尾になります。同様に、`table.remove` は、テーブルとオプションの位置を受け取り、その位置にある要素を削除して返します。位置は、デフォルトでテーブルの最後の要素になります。連続していないテーブルから何かを削除するには、そのキーを nil に設定するだけです。

`table.concat` 関数は、オプションの区切り文字を使用してすべての要素を連結した文字列を返します。

    (let [t [1 2 3]]
      (table.insert t 2 "a") ; t is now [1 "a" 2 3]
      (table.insert t "last") ; now [1 "a" 2 3 "last"]
      (print (table.remove t)) ; prints "last"
      (table.remove t 1) ; t is now ["a" 2 3]
      (print (table.concat t ", "))) prints "a, 2, 3"

`table.sort` 関数は、副作用として、テーブルをその場でソートします。最初の引数が 2 番目の引数より小さい場合に true を返すオプションの比較関数を取ります。

`table.unpack` 関数は、テーブル内のすべての要素を複数の値として返します。`table.unpack` は、Lua 5.1 では `unpack` にすぎないことに注意してください。

これは `table` モジュールの一部ではありませんが、`next` 関数はテーブルで機能します。これは、テーブルが空かどうかを検出するために最もよく使用されます。単一のテーブル引数で呼び出すと、空のテーブルに対して nil が返されるためです。ただし、反復子なしでテーブルをステップスルーするためにも使用できます。例:

    (fn find [t x ?k]
      (match (next t ?k)
        (k x) k
        (k y) (find t x k)))

その他の重要なモジュール

モジュールを REPL で評価して、含まれるすべての関数と値を表示することで、モジュールを調べることができます。

  • `math`: すべての標準的な数学関数、三角関数、疑似乱数ジェネレータなど

  • `string`: 一般的な文字列操作

  • `os`: `exit`、`time`、`getenv` などのオペレーティング システム関数

不足しているもの

ほとんどのプログラミング言語には、Lua よりもはるかに大きな標準ライブラリがあります。当たり前だと思っているものが Lua でサードパーティのライブラリを必要とすることに気付くと驚くかもしれません。

Lua は正規表現を実装していませんが、`string.find`、`string.match` などに対して、より限定された独自の パターン 言語を実装しています。

`string.split` 関数がないことに多くの人が驚きます。ただし、`icollect` で使用される `string.gmatch` 関数は、文字列をテーブルに分割するために使用できます。または、ループするためのイテレータだけが必要な場合は、`string.gmatch` を直接使用して `icollect` をスキップできます。

    (let [str "hello there, world"]
      (icollect [s (string.gmatch str "[^ ]+")] s))
    ;; -> ["hello" "there," "world"]

io.popen を使用してサブプロセスを起動できますが、入力に書き込むか、出力から読み取るかしかできないことに注意してください。両方を行う は、何らかの同時実行なしでは安全に実行できません。

ネットワークには、luasocket などのサードパーティ ライブラリが必要です。

高度な機能

  • `_G`: すべてのグローバルのテーブル

  • `getfenv`/`setfenv`: Lua 5.1 のファーストクラス関数環境へのアクセス。 5.2 以降では、代わりに _ENV テーブル を使用してください

  • `getmetatable`/`setmetatable`: メタテーブルを使用すると、選択した関数を使用して柔軟に テーブルの動作をオーバーライド できます

  • `coroutine`: coroutine モジュールを使用すると、ファーストクラスの方法で 柔軟な制御転送 を実行できます

  • `package`: このモジュールは、モジュールの読み込みを追跡および制御します

  • `arg`: プロセスに渡されるコマンドライン引数のテーブル

  • `...`: 現在の関数に渡される引数。複数の値として機能します

  • `select`: 引数の数を見つけるために `...` と一緒に使用されることが最も一般的です

  • `xpcall`: `pcall` のように機能しますが、ハンドラーを受け入れます。エラーの 1 行番号ではなく、完全なスタック トレースを取得するために使用されます

`...` 値は、ファイルの最上位レベルでも機能します。通常は、コマンド ラインから直接実行されるファイルのコマンド ライン引数を取得するために使用されますが、`dofile` 呼び出しから値を渡したり、`require` から読み込まれたファイル内の現在のモジュールの名前を伝えたりすることもできます。`...` は複数の値を表すため、値の数が事前にわかっている場合を除き、テーブルに格納するのが一般的です。

    (local (first-arg second-arg) ...)
    (local all-args [...])

Lua の読み込み

これらは Lua コードの読み込みに使用されます。の
`load*`
関数はコードが実行される前に呼び出される必要がある「チャンク」関数を返しますが、
`dofile`
すぐに実行されます。
`dofile`

`load`

`loadfile`

`loadstring`

不明瞭

*`_VERSION`: 文字列として使用されている Lua の現在のバージョン

*`collectgarbage`: おそらくこれが必要になることはないでしょう

*`debug`: このモジュールについては Lua マニュアルを参照してください

*`rawequal`

`rawget`

`rawlen`

`rawset`
: メタテーブルをバイパスする操作


ホーム

このサイトのソース

いいなと思ったら応援しよう!