robloxでassistant その29

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
インタープリタを書け。
zundokoを表示せよ。

# 方針
- 俺cpuアセンブラで書く。
- stack machine
- zundoko表示
```
0
set_a
:loop
rnd
1
>
if :skip1
;zun
out
get_a
1
+
set_a
get_a
3
>
if :skip2
jp :loop
:skip1
;doko
out
0
set_a
jp :loop
:skip2
;doko ki yo si !
out
end
```
rndは、乱数。
;fizzbuzzは、stackに積む。
%は、剰余
jp :loopは、:loopに飛ぶ。
set_aは、レジスタaに、セットする。
get_aは、レジスタaから読み込む。
:loopは、ラベル
if :loopは、真なら、ラベル:loopに飛ぶ。
dupは、コピー、複製を作る。
outは、数値表示。
数値は、stackに積む。
+-/*は、加減乗除。
endは、終了。

# サンプルコード

```

local player = game.Players.LocalPlayer
local PlayerGui = player:WaitForChild("PlayerGui")
local gui = PlayerGui:WaitForChild("ScreenGui")


gui.TextButton.MouseButton1Click:Connect(function()
	local src = gui.TextBox.Text
	local stack = {}
	function stack.push(item)
		table.insert(stack, item) 
	end
	function stack.pop()
		return table.remove(stack)
	end
	local l
	local t1
	local t2
	local v
	local a = 0
	local s = 0
	local h = {}
	for l in string.gmatch(src, "[^\n]+") do 
		s += 1
		table.insert(h, l)
	end
	local pc = 1
	local j
	repeat
		l = h[pc]
		if string.sub(l, 1, 1) == ";" then
			stack.push(string.sub(l, 2, 16))
			pc += 1
		elseif string.sub(l, 1, 1) == ":" then
			pc += 1
		elseif l == "rnd" then
			v = math.random(1, 2)
			stack.push(v)
			pc += 1
		elseif l == "dup" then
			t1 = stack.pop()
			stack.push(t1)
			stack.push(t1)
			pc += 1
		elseif l == "drop" then
			t1 = stack.pop()
			pc += 1
		elseif l == "set_a" then
			t1 = stack.pop()
			a = t1
			pc += 1
		elseif l == "get_a" then
			stack.push(a)
			pc += 1
		elseif l == "out" then
			t1 = stack.pop()
			print(t1)
			pc += 1
		elseif l == "%" then
			t1 = stack.pop()
			t2 = stack.pop()
			v = t2 % t1
			--print(v)
			stack.push(v)
			pc += 1
		elseif l == "+" then
			t1 = stack.pop()
			t2 = stack.pop()
			v = t2 + t1
			stack.push(v)
			pc += 1
		elseif l == "-" then
			t1 = stack.pop()
			t2 = stack.pop()
			v = t2 - t1
			stack.push(v)
			pc += 1
		elseif l == "/" then
			t1 = stack.pop()
			t2 = stack.pop()
			v = t2 / t1
			stack.push(v)
			pc += 1
		elseif l == "*" then
			t1 = stack.pop()
			t2 = stack.pop()
			v = t2 * t1
			stack.push(v)
			pc += 1
		elseif l == ">" then
			t1 = tonumber(stack.pop())
			t2 = tonumber(stack.pop())
			if t2 > t1 then
				stack.push(1)
			else
				stack.push(0)
			end
			pc += 1
		elseif l == "<" then
			t1 = tonumber(stack.pop())
			t2 = tonumber(stack.pop())
			if t2 < t1 then
				stack.push(1)
			else
				stack.push(0)
			end
			pc += 1
		elseif l == "end" then
			pc = 300
		elseif string.sub(l, 1, 2) == "if" then
			local p = string.sub(l, 4, 9)
			t1 = stack.pop()
			t1 = tonumber(t1)
			if t1 > 0 then
				for j = 1, s do
					if h[j] == p then
						pc = j
						--print(pc)
					end
				end
			else
				pc += 1
			end			
		elseif string.sub(l, 1, 2) == "jp" then
			local p = string.sub(l, 4, 9)
			for j = 1, s do
				if h[j] == p then
					pc = j
				end
			end
		else
			stack.push(l)
			pc += 1
		end
	until pc > 200
	print("ok")
end)





```

# 実行結果

```

  10:49:52.640  zun  -  クライアント - LocalScript:57
  10:49:52.641   ▶ doko (x2)  -  クライアント - LocalScript:57
  10:49:52.641  zun  -  クライアント - LocalScript:57
  10:49:52.641  doko  -  クライアント - LocalScript:57
  10:49:52.641   ▶ zun (x3)  -  クライアント - LocalScript:57
  10:49:52.642  doko  -  クライアント - LocalScript:57
  10:49:52.642  zun  -  クライアント - LocalScript:57
  10:49:52.642  doko  -  クライアント - LocalScript:57
  10:49:52.643  zun  -  クライアント - LocalScript:57
  10:49:52.643   ▶ doko (x6)  -  クライアント - LocalScript:57
  10:49:52.644   ▶ zun (x3)  -  クライアント - LocalScript:57
  10:49:52.645  doko  -  クライアント - LocalScript:57
  10:49:52.645   ▶ zun (x2)  -  クライアント - LocalScript:57
  10:49:52.645  doko  -  クライアント - LocalScript:57
  10:49:52.645  zun  -  クライアント - LocalScript:57
  10:49:52.646  doko  -  クライアント - LocalScript:57
  10:49:52.646   ▶ zun (x4)  -  クライアント - LocalScript:57
  10:49:52.647  doko ki yo si !  -  クライアント - LocalScript:57
  10:49:52.647  ok  -  クライアント - LocalScript:136
```

以上。