Nspired Lua スクリプティングのヒント

平面に適当に置いた n 個の質点の重心が原点に来るよう各質点の座標を設定し直す

-- 平面に適当に置いた n 個の質点の重心が原点に来るよう、各質点の座標を設定し直す。 function shift2center(mList) local n = #mList local denom = 0 local numerX = 0 local numerY = 0 for i = 1, n do denom = denom + mList[i].m numerX = numerX +…

伸び縮みしているのがわかるような太い線を描く

fillLine = (function() local POW = math.pow local ATAN = math.atan2 local MIN = math.min local SQRT = math.sqrt local SIN = math.sin local COS = math.cos return function(gc, x1, y1, x2, y2, area) -- (gc, 始点, 終点, 面積) local angle = ATA…

テーブルは極力作らない

function addVect1(vectA, vectB) -- 加算が 2 回、テーブルコンストラクトが 1 回。 return {vectA[1] + vectB[1], vectA[2] + vectB[2]} end function addVect2(vectA, vectB) -- 加算が 2 回、代入が 2 回。 vectA[1] = vectA[1] + vectB[1] vectA[2] = v…

TI-Nspire & Lua / リストをランダムに並べ替える / Fisher-Yates のシャッフル

function FisherYates(list) local unpack = unapck or table.unpack local oldlist = {unpack(list)} local newlist = {} for i = 1, #list do newlist[#newlist+1] = table.remove(oldlist, math.random(#oldlist)) -- 「リストに残っている要素をランダム…

TI-Nspire & Lua / 数列を作る

function seq(func, from, to, step) local sequence = {} local step = step or 1 for i = from, to + step/2, step do sequence[#sequence+1] = func(i) end return sequence end -- 確かめる。 a = seq(function(n) return 1/2^n end, 1, 7, _) print("{"…

TI-Nspire & Lua / 新規行列を作る

function newMat(numRows, numCols, val) local mat = {} for i = 1, numRows do mat[i] = {} for j = 1, numCols do mat[i][j] = val or nil end end return mat end -- 確かめる。3 × 7 行列を作る。初期値は 1 とする。 a = newMat(3, 7, 1) for r = 1, #…

TI-Nspire & Lua / Nspire の函数を Lua で実行したときの計算時間を計る

Calculator アプリケーションで直接実行したときの計算時間とは異なる。 function on.enterKey() start = timer.getMilliSecCounter() answer = math.eval("sute()") time = timer.getMilliSecCounter() - start platform.window:invalidate() end function …

TI-Nspire & Lua / 無名函数、高階函数、クロージャ、それに意味のないとき

(function(a) return function(b) return function(c) return function(d) return function(func) func(a..b..c..d) end end end end end)("hello")(",")(" ")("world")(print)

TI-Nspire & Lua / 独自のイテレーターを作る、それに意味のないとき

リストの from 番目の要素から要素を num 個巡廻する。リストは循環しているものとする。 function loop(list, from, num) local dim = #list local num = num or dim local iGlobal = 0 local iLocal = (from or 1) - 1 return function() iGlobal = iGloba…

TI-Nspire & Lua / 高階函数の例

参考: 日経ソフトウエア 2017年 1月号 [雑誌], 付録 JavaScript 実践テクニック, p.018, リスト 9 -- 函数 add の引数に函数 (ここでは函数 string.len と tonumber のいずれか) を取る。 function add(a, b, func) return func(a) + func(b) end print(add(…

TI-Nspire & Lua / DAC で任意波形を描くための波形テーブルを生成する 2 / interpolate() 使う

See also: TI-Nspire & Lua / DAC で任意波形を描くための波形テーブルを生成する 1 / 任意の数式を波形テーブルにする - TI-Nspire 組込函数 interpolate() - Download the .tns file at: interpolate3.tns - Google ドライブ.

TI-Nspire & Lua / ループの刻み幅に小数を使う場合の注意

for i = 1, 2, 0.1 do print(i) -- 2 に達しない (1.9 のあとに 2 を通り過ぎてループを抜けてしまう) end for i = 11, 12, 0.1 do print(i) -- 12 に達する end

TI-Nspire & Lua / シンプソンの公式による積分

.lua function integraSimps(f, from, to, numOfDiv) local sum = 0 local step = (to - from) / (numOfDiv or 2^5) ---[[ for i = (from + 2 * step), (to + step / 10), (2 * step) do sum = sum + (f(i - 2 * step) + 4 * f(i - step) + f(i)) * step / 3…

TI-Nspire & Lua / DAC で任意波形を描くための波形テーブルを生成する 1 / 任意の数式を波形テーブルにする

関連: TI-Nspire & Lua / DAC で任意波形を描くための波形テーブルを生成する 2 / interpolate() 使う - .lua function createWave(func) local POW = math.pow local FLOOR = math.floor local CEIL = math.ceil local MIN = math.min local MAX = math.max…

TI-Nspire & Lua / スクリプティングのヒント / 自作の描画函数も出来合いの描画函数と同じように実行できるようにする

参考: http://adriweb.free.fr/t3/2013/Powerpoint_Advanced_TI-Nspire_Lua_Programming.pptx, p.25 --[[普通の方法 function drawCircle(centerX, centerY, radius, gc) -- 中心座標で円を描くための自作函数 local diameter = radius + radius gc:drawArc(…

TI-Nspire & Lua / スクリプティングのヒント / Nspire 側の変数を Lua に呼ぶときは on.timer() 内で var.recall() を使うのではなく var.monitor() と on.varChange() とを使う

参考: http://adriweb.free.fr/t3/2013/Powerpoint_Advanced_TI-Nspire_Lua_Programming.pptx, p.22 .lua --[[方法 1. on.timer() 内で var.recall() を使う local slider1 = nil function on.construction() on.timer() -- 最初に Nspire 側の変数の初期値…

TI-Nspire & Lua / スクリプティングのヒント / メタテーブルを使う 9 of 9 / メモ化する

参考: Programming in Lua プログラミング言語Lua公式解説書, p.194-200 http://adriweb.free.fr/t3/2013/Powerpoint_Advanced_TI-Nspire_Lua_Programming.pptx, p.15 お気楽 Lua プログラミング超入門 -- 竹内函数を定義する。これをメモ化してみる。 funct…

TI-Nspire & Lua / スクリプティングのヒント / メタテーブルを使う 8 / スタックを実装する

参考: お気楽 Lua プログラミング超入門 Stack = class() function Stack:init(size) self.buff = {} self.size = size or math.huge end function Stack:push(val) if #self.buff < self.size then table.insert(self.buff, val) else error("Error: Stack …

TI-Nspire & Lua / スクリプティングのヒント / メタテーブルを使う 7 / メタテーブルを直接使わずにクラスを利用する

Nspired Lua は class() ライブラリーが実装してあるのでメタテーブルを直接使わずにクラスが記述できる。 Class = class() function Class:init(a, b) self[1] = a self[2] = b end function Class:setValue(where, what) rawset(self, where, what) end --…

TI-Nspire & Lua / スクリプティングのヒント / メタテーブルを使う 6 / __index を利用してクラスふうにしてみる

参考: お気楽 Lua プログラミング超入門, リスト 4 およびリスト 5 -- メタメソッドを格納するためのテーブルを用意する。このテーブルがいわゆるクラスに相当する。 Class = {} -- 例として、テーブルの任意の位置に値をセットするためのメタメソッドを定義…

TI-Nspire & Lua / スクリプティングのヒント / メタテーブルを使う 5 / __newindex

-- __newindex イベントは、存在していないフィールドに値を代入するときに適用される。 -- テスト用のメタメソッドを定義する。 function testMethod(t, k, v) rawset(t, k, v + 1000) -- t[k] = v + 1000 と同じことだが、t[k] = v + 1000 だとメタメソッ…

TI-Nspire & Lua / スクリプティングのヒント / メタテーブルを使う 4 / __index

-- __index イベントは、テーブルの値を参照したのに値がなかったときに適用される。 -- テスト用のメタメソッドを定義する。 function testMethod(t, k) return tostring(t)..", k: "..k end -- メタテーブルをセットする。 testTable = setmetatable({aaa …

TI-Nspire & Lua / スクリプティングのヒント / メタテーブルを使う 3 / 新しく行列型のデータを作って要素同士の四則演算ができるようにする

-- 行列同士のサイズの相違は想定しない。 -- 穴あき行列は想定しない。 -- 数値以外は想定しない。 -- 行列の要素同士の四則演算を行うためのメタメソッドを定義する。 function calc(operator) return function(matA, matB) local result = {} for row = 1…

TI-Nspire & Lua / スクリプティングのヒント / メタテーブルを使う 2 / 新しくリスト型のデータを作って要素同士の四則演算ができるようにする

-- リスト同士のサイズの相違は想定しない。 -- 穴あきリストは想定しない。 -- 数値以外は想定しない。 -- リスト同士の四則演算を行うためのメタメソッドを定義する。 function calc(operator) return function(listA, listB) local result = {} for i = 1…

TI-Nspire & Lua / スクリプティングのヒント / メタテーブルを使う 1 / 演算子をオーバーロードする

table1 = {name = "Tom Brady", rating = 110} table2 = {name = "Matt Ryan", rating = 100} function myAdd(a, b) -- これをメタメソッドとして使う。 return a.rating + b.rating end setmetatable(table1, {__add = myAdd}) -- setmetatable(テーブル, {…

TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 9 of 9 / 演習 9.3: 多項式を計算する

-- 演習 9.3: 演習 5.4 では、係数テーブルと変数値とを引数として取ってその多項式の値を返す函数を記述した。 -- 今度はその函数のカリー化版を作れ。 -- 係数テーブルを変数として取ってその多項式の値を返す函数を返す函数を作れ。 function newpoly(coe…

TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 8 / 演習 9.2

-- 演習 9.2: 下のチャンクの出力はどうなるか。 function F(x) return { set = function(y) x = y end , get = function() return x end , } end o1 = F(10) o2 = F(20) print(o1.get(), o2.get()) -- x の値がそのまま返ってくる o2.set(100) o1.set(300) …

TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 7 / 演習 9.1: 積分する

-- 演習 9.1: 函数 f を引数に取ってその積分の近似値を返す函数 integral を作れ。 -- Exercise 9.1: Write a function _integral_ that takes a function _f_ and returns an approximation of its integral. local function integral(f) return function(…

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…