3

Lua はファーストクラスの関数をサポートしているので、多くの関数型言語のように演算子を desugar できるかどうか知りたいです。たとえば、OCaml では次のことができます。

let x = (+) 3 5

上記のコードxは、値で変数を初期化します3 + 5。書き込み(+)は、2 つのパラメーターを取り、それらの合計を返すローカル関数を持つことと同じです。と の 2 つの引数を(+) 3 5指定してこの関数を呼び出しています。これの背後にある動機は、前に関数でラップすることなく、演算子を関数に直接渡すことができることです。35

local t = {"ab", "d", "c" }
local function op_greaterthan (a,b) return a>b end
table.sort (t, op_greaterthan) --would like to write: table.sort (t, (>)) 

ありがとう!

4

2 に答える 2

4

できません。

Lua インタープリターは非常に小さく、オペレーターを処理するときに「ショートカットを作成」します。パーサーにとって、それらは単に「関数」ではありません。

パラメータなしで演算子を使用しようとすると、次のようになります。

f(+)

次に、インタープリターは構文エラーをスローします。

この実装により、既に説明したオプションに制限されます。ラッパー関数 ( など) を使用するか、jpjacobs のソリューションのaddように、文字列を渡して何らかの種類の を渡します。eval

于 2012-01-16T14:21:33.423 に答える
4

はい、できます(要点がわかりません。遅くなりますが、可能です):

do
    local mem={}
    function unsugar(op,a,b)

        if mem[op] then
            print('Fetched operation from memory')
            return mem[op](a,b)
        else
            local f=loadstring('local a,b=...; return a '..op..' b')
            mem[op]=f
            return f(a,b)
        end
    end
end
print(unsugar('+',1,2)) -- = 3
print(unsugar('%',5,3)) -- = 2
print(unsugar('%',5,3)) -- = Fetched operation from memory \n 2

編集: 各操作を 1 回だけコンパイルすることにより、漂遊グローバル a および b を排除し、メモ化してパフォーマンスを向上させました。

于 2012-01-16T07:53:04.060 に答える