Lua メモ

TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 6 / 図形の包含判定

-- 円の包含判定。クロージャを使わない。 function disk1(x, y) return (x - 1)^2 + (y - 3)^2 <= 4.5^2 end print(disk1(0,0), disk1(1, 5)) -- 円の包含判定。クロージャを使う。 function disk2(cx, cy, r) -- 円を定義する函数。 return function(x, y)…

TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 5 / 再帰的なローカル函数を作る

-- 再帰的なローカル函数の定義 local function fact(n) if n == 0 then return 1 else return n * fact(n - 1) end end print(fact(69)) -- 下のような定義の仕方では再帰呼び出しができない。 -- FACT(n - 1) をコンパイルする時点ではまだローカル函数 FA…

TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 4 / ローカル函数を作る

-- ローカル函数の作成 local function add(a, b) return a + b end local function double(n) return add(n, n) -- ここで、上に定義した add 函数が使用できる。 end print(double(10)) -- これは下のように記述しても同じことである。むしろこちらが lua …

TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 3 / テーブルに函数を格納する

-- テーブルに函数を格納する。 table = {} table.add = function(a, b) return a + b end table.sub = function(a, b) return a - b end print(table.add(1, 2), table.sub(1, 2)) -- これは下のように記述しても同じことである。 table = { add = function…

TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 2 / 函数を再定義する

-- math.sin 函数の引数が度単位で指定できるよう math.sin 函数を再定義してみる。 originalSin = math.sin math.sin = function(deg) -- これで、オリジナルの math.sin 函数が無名函数によって上書きされた。 return originalSin(math.rad(deg)) end prin…

TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 1 / 微分係数を求める

--[[ クロージャを利用して任意函数の点 x における傾きを求めてみる。 --]] function derivative(func, delta) local delta = delta or 1e-12 return function(x) return (func(x + delta) - func(x)) / delta end end function sute(x) -- この函数の点 x …

TI-Nspire & Lua / スクリプティングのヒント / テーブルの末尾に要素を追加するときは table.insert() を使わない

Reference: http://adriweb.free.fr/t3/2014/Advanced_TI-Nspire_Lua_Programming.pptx, p.8 local num = 3000000 -- 1 local list = {} local timeStart = timer.getMilliSecCounter() for i = 1, num do table.insert(list, i) end local timeStop = timer…

TI-Nspire & Lua / スクリプティングのヒント / pairs() も使わない

Reference: http://adriweb.free.fr/t3/2014/Advanced_TI-Nspire_Lua_Programming.pptx, p.8 local list = {} for i = 1, 8000000 do list[i] = i end -- 1 timeStart = timer.getMilliSecCounter() for i = 1, #list do local value = list[i] end print("1…

TI-Nspire & Lua / スクリプティングのヒント / ipairs() は使わない

Reference: http://adriweb.free.fr/t3/2014/Advanced_TI-Nspire_Lua_Programming.pptx, p.8 local list = {} for i = 1, 5000000 do list[i] = i end -- 1 timeStart = timer.getMilliSecCounter() for i = 1, #list do local index = i local value = list…

TI-Nspire & Lua / スクリプティングのヒント / テーブルの最適化 / 不要な再ハッシュは避ける

Reference: http://adriweb.free.fr/t3/2014/Advanced_TI-Nspire_Lua_Programming.pptx, p.6 “ Again, help Lua know more about the tables you're going to use! Avoid useless rehashes when possible! ” -- 1 timeStart = timer.getMilliSecCounter() fo…

TI-Nspire & Lua / スクリプティングのヒント / テーブルの最適化 / テーブルのサイズを決めておく

Reference: http://adriweb.free.fr/t3/2014/Advanced_TI-Nspire_Lua_Programming.pptx, p.5 “ Help Lua know more about the tables you're going to use! ” timeStart = timer.getMilliSecCounter() for i = 1, 1000000 do local a = {} a[1] = 1; a[2] = …

TI-Nspire & Lua / スクリプティングのヒント / ローカル化する

Reference: http://adriweb.free.fr/t3/2014/Advanced_TI-Nspire_Lua_Programming.pptx, p.4, “ Accessing global variables takes more time than accessing local ones. Always localize your functions! ” timeStart = timer.getMilliSecCounter() for i …

TI-Nspire & Lua / 再帰呼び出し / 階乗を求める / 普通の方法も使ってみる

.lua ---------------------------------------------- -- method 1: Calling a function recursively -- ---------------------------------------------- function factorial1(n) if n == 0 then return 1 else return n * factorial1(n - 1) end end ----…

TI-Nspire & Lua / 再帰呼び出し / 階乗を求める

.lua function factorial(n) if n == 0 then return 1 else return n * factorial(n - 1) end end print(factorial(0)) print(factorial(1)) print(factorial(10)) print(factorial(69)) 参考: Programming in Lua, Fourth Edition p.3

TI-Nspire & Lua / タイマーの tick するたびに経過時間を出力する / グローバル変数に頼る

TI-Nspire & Lua / タイマーの tick するたびに経過時間を出力する / グローバル変数に頼らない / コルーチンを使ってみる TI-Nspire & Lua / タイマーの tick するたびに経過時間を出力する / グローバル変数に頼らない / クロージャを使ってみる TI-Nspire…

TI-Nspire & Lua / タイマーの tick するたびに経過時間を出力する / グローバル変数に頼らない / クラスを使ってみる

TI-Nspire & Lua / タイマーの tick するたびに経過時間を出力する / グローバル変数に頼らない / コルーチンを使ってみる TI-Nspire & Lua / タイマーの tick するたびに経過時間を出力する / グローバル変数に頼らない / クロージャを使ってみる の続き Ev…

TI-Nspire & Lua / タイマーの tick するたびに経過時間を出力する / グローバル変数に頼らない / クロージャを使ってみる

TI-Nspire & Lua / タイマーの tick するたびに経過時間を出力する / グローバル変数に頼らない / コルーチンを使ってみる の続き Every time a timer ticks, the following script will return the elapsed time. As a trial, a closure has been used. .lu…

TI-Nspire & Lua / タイマーの tick するたびに経過時間を出力する / グローバル変数に頼らない / コルーチンを使ってみる

Every time a timer ticks, the following script will return the elapsed time. As a trial, a co-routine has been used. .lua function elapsedTime() local initTime = timer.getMilliSecCounter() for i = 1, math.huge do coroutine.yield((timer.get…

メタメソッドで四則演算子をオーバーロードする

.lua -- How to use metamethods in Lua. list1 = {1, 2, 3} list2 = {5, 7, 9} function myAdd(listA, listB) local listSute = {} for i = 1, #listA do listSute[i] = listA[i] + listB[i] end return listSute end function mySub(listA, listB) local l…

lua で媒介変数方程式をグラフ化する 2

Define lis(ft)= Func :Return {sin(5*ft),cos(7*ft)} :EndFunc -- 今度は元の函数を nspire 側で定義しておく。 -- 前回のスクリプトがそのまま利用できるよう、もう一度 lua の中でリサジュ函数を定義する。 function on.resize() W, H = platform.window:…

lua で媒介変数方程式をグラフ化する 1

-- lua の中だけで完結する。 -- 参考: http://triode.dip.jp/honkytonk/2014/09/tsuredure/ti-n-spire-cx-cas-lua-1.html function on.resize() W, H = platform.window:width(), platform.window:height() X0, Y0 = math.floor(W/2), math.floor(H/2) UNIT…

リストの n 番目の要素をリストの末尾に移動する

-- リストの 7 番目の要素をリストの末尾に移動する。 list = {1,2,3,4,5,6,7,8,9} for index, value in ipairs(list) do -- 旧リストを表示する。 print("old = "..index, " value = "..value) end n = 7 table.insert(list, table.remove(list, n)) for in…

マウスで何かを動かしてその加速度を取得する 2

-- 今度はマウスポインターの xy 両軸方向の加速度を取得してみる。 -- 確認しやすいよう、更新速度は遅めにする。 step = 0.5 timer.start(step) posTwoAgoX, posTwoAgoY = 0, 0 posOneAgoX, posOneAgoY = 0, 0 posNowX, posNowY = 0, 0 speedOneAgoX, spee…

マウスで何かを動かしてその加速度を取得する

-- ここではマウスポインターの x 軸方向の加速度を取得してみる。 -- 確認しやすいよう、更新速度は遅めにする。 local step = 0.5 timer.start(step) local pos2TickAgo = 0 local pos1TickAgo = 0 local posCurrent = 0 local speed1TickAgo = 0 local sp…

マウスで何かを動かしてその移動速度を取得する

-- ここではマウスポインターの x 軸方向の移動速度を取得してみる。 -- 確認しやすいよう、更新速度は遅めにする。 local step = 0.5 timer.start(step) local xOld = 0 local xNew = 0 local speed = 0 function on.paint(gc) gc:drawString("positionPrev…

Nspire の組込函数を Lua で使う(5)

function on.paint(gc) -- newMat() だとすべての element に 0 が代入されるが、constructMat() を使えば何らかの数列で入力できる。loop を使わずに済む。 local mat = math.eval("constructMat(i*10+j, i, j, 65, 47)") -- 確認のためテーブルの内容を表…

Nspire の組込函数を Lua で使う(4)

function on.paint(gc) -- 次のように Nspire の組込函数 newMat() を用いると、他の言語と同じようにサイズを宣言するだけで行列が作れる。 local mat = math.eval("newMat(15, 35)") -- 確認のためテーブルの内容を表示してみる for i = 1, #mat do for j …

Nspire の組込函数を Lua で使う(3)

■ Nspire のリストを Lua へ渡す。1 重テーブルとして認識される。 ■ Nspire の行列を Lua へ渡す。2 重テーブル(2 次元配列)として認識される。 ■ Lua のテーブルを Nspire へ渡す。 -- フラットなテーブルを Nspire へ渡す。 -- リストとして認識される…

Nspire の組込函数を Lua で使う(2)

-- Nspire の組込函数だけでなく Nspire のユーザー定義函数も Lua で利用できる。 -- CAS も Lua で利用できる。 platform.apiLevel = '1.0' local radius = 1 var.store("radius", radius) -- Lua と Nspire とで変数名が同じでもよい。 function on.paint…

Nspire の組込函数を Lua で使う(1)

-- Nspire の組込函数を Lua で使う。 -- math.eval("<Nspire に渡す数式>") という構文を使って数式を文字列として Nspire に渡し、 -- 計算結果を返してもらう。 -- 数式、数値をそのまま渡す方法(例:Nspire の median() 函数) function on.paint(gc) local ans1 = math.ev</nspire>…