19

コンパイル時に型チェックされるLuaフロントエンドコンパイラを探していますが、標準のLua 5.1バイトコード(実行時型のみ)を出力します。私が欲しいのは、実行時よりも早く些細なエラーを検出するために、かなりの量の静的なコンパイル時の構文解析とオプションの型付けです。結果のバイトコードは、標準のLoadString()でコンパイルされた既存のLuaバイトコードとうまく連携する必要があります。

明確にするために、違いはバイトコンパイル時にのみ発生します。実行時に、バイトコードは、コンパイルフェーズ中に何か別の/異常なことが起こったことを認識しません。

私が考えていることは、ActionScriptによく似ています。Luaバイトコードを出力するActionScriptコンパイラも気になりません!

誰かがそのような努力について聞いたことがありますか?MetaLuaを使用してこれを行うことへの言及をいくつか見ましたが、正直なところ、私は彼らのドキュメントの先頭を作るのに十分な明るさ​​ではありません

4

7 に答える 7

16

2005年の夏かそこらで、私は信じられないほど賢い学部生と協力して、おそらく注釈の助けを借りて、Luaのコンパイル時型推論を行う問題に取り組みました。この問題は信じられないほど難しいことが判明しました!(私の学生は短いテクニカルノートを書きましたが、それは実際には一般的な流通を目的としたものではありません。)

あなたが提起した問題を解決したいのであれば、重要な静的型チェック可能にし、標準のバイトコードでコンパイルされたLuaコードと相互運用するという双子の制約で、これら2つの制約を満たすために新しい言語を最初から設計します。かなりの量の作業になりますが、型システムをLuaに後付けするよりもはるかに簡単です。

于 2009-05-02T02:37:41.490 に答える
7

この Metalua ブログ投稿を参照してください。

-{ extension "types" }

function sum (x :: list(number)) :: number
  local acc :: number = 0
  for i=1, #x do acc=acc+x[i] end
  return acc
end

ただし、これは実行時のソリューションのように見えます。

いずれにせよ、 Metalua メーリング リストで気軽に質問してください。Lua 構文を拡張したい場合は、Metalua を最初に検討するツールです。

PS Lua をすべて大文字で書かないでください。

于 2009-05-02T06:18:41.130 に答える
5

そのような事はありません。MetaLuaを拡張してこれを行うことは可能かもしれませんが、誰もそれを行っていません。AFAIK、そうする予定はありません。Luaは動的言語であることが意図されています。静的に型付けされた言語が必要な場合は、それを使用してください。

基本的に探しているのは、JavaやC#のようなものです。その場合、Lua.NETのようなプロジェクトを使用して、既存のLuaコードをC#と統合することができます。Java用のKahluaもあります。

于 2009-05-02T01:36:04.867 に答える
3

ラヴィもあり ます https://github.com/dibyendumajumdar/ravi

Ravi プログラミング言語は Lua 5.3 から派生したもので、オプションの静的型付けと LLVM および libgccjit ベースの JIT コンパイラが制限されています。

Terra でのプログラミングをとても楽しんでいます (上記参照)。

于 2016-12-03T20:58:11.290 に答える
1

私はEmmyLuaをお勧めします。

これは、ドキュメントの入力をサポートする Intellij/VSCode プラグインです。全体的な文書化のアプローチ方法は非常に友好的であることがわかりました。また、IDE サポートのおかげで、EmmyLua はヒンティングもサポートしています。

以下は、EmmyLua doc の小さなスニペットです。

--- @alias recipe_prototype any
--- @alias recipe_name string
--- @alias ingredient_name string

--- @class Coordinate
--- @field x number
--- @field y number

--- @class Entity
--- @field entity_number number unique identifier of entity
--- @field name string entity name
--- @field position Coordinate
--- @field direction any defines.direction.east/south/west/north

--- @class BlueprintSection
--- @field entities Entity[]
--- @field inlets number[] index of inlets in entities list
--- @field outlets number[] index of outlets in entities list

--- @type BlueprintSection
BlueprintSection = {}

--- @return BlueprintSection
function BlueprintSection.new()
    --- ...
end

--- @param other BlueprintSection
--- @param xoff number optional, x-offset of the other section, default to width of self
--- @param yoff number optional, y-offset of the other section, default to 0
--- @return BlueprintSection new self
function BlueprintSection:concat(other, xoff, yoff)
   -- ...
end

ドキュメント リファレンスの詳細については、https://emmylua.github.ioを確認してください。

于 2020-09-09T02:19:27.720 に答える