teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

余談

2018/11/07 16:01

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -101,4 +101,16 @@
101
101
 
102
102
  ぱっと思いつく、他にやらないといけないであろうこと。
103
103
  - 構文が間違っていたらわかりやすいエラーを出す
104
- - MRKで同じラベルを複数作ると困るので、エラーを出すようにする
104
+ - MRKで同じラベルを複数作ると困るので、エラーを出すようにする
105
+
106
+
107
+ #### 余談
108
+ 大学の推薦入試くらいならけっこうウケるかもしれませんが、この「プログラミング言語」にはいろいろ問題があります。
109
+ - 変数がない
110
+ - 状態を持てない
111
+ - よってかなり表現能力は低い
112
+ - あと、初等教育の子たちってパソコンのキーボードを使えるんですか
113
+
114
+ さらにこの分野ではLEGOのマインドストームという強力な競合があります(他にもあるけど)。私は小学生の頃触っていましたが、けっこう高機能でした。
115
+
116
+ 今から練り直すもよし、あるいはその辺は割り切ってプレゼン力で乗り切るのも一つの戦略です。

5

追記

2018/11/07 16:01

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -97,4 +97,8 @@
97
97
  break
98
98
  exec_instruction(*instructions[pc])
99
99
  pc += 1
100
- ```
100
+ ```
101
+
102
+ ぱっと思いつく、他にやらないといけないであろうこと。
103
+ - 構文が間違っていたらわかりやすいエラーを出す
104
+ - MRKで同じラベルを複数作ると困るので、エラーを出すようにする

4

動いちゃった

2018/11/07 15:48

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  フロー制御だけできれば良いなら、読み込んだ命令をリストに入れて先頭から逐次実行、JMP系はプログラムカウンタ的な変数を用意しておいてそれを書き換える……みたいな方針で書けるとは思いますが。
6
6
 
7
7
  #### 追記
8
- 一応具体例を書いておきます。あくまでも概念コードなので、そのまま実行はできませんが。
8
+ 一応具体例を書いておきます。
9
9
 
10
10
  ```
11
11
  MRK(1)
@@ -15,7 +15,7 @@
15
15
  ```
16
16
  を動かすとしたら、
17
17
 
18
- まず読み込んで次のようなフォーマットに変換する。
18
+ まず読み込んで次のようなフォーマットに変換する。ここは面倒くさいので今回パスします。
19
19
  ```python
20
20
  instructions = [("MRK", 1), ("FWD", 1.0), ("LFT", 1.0), ("JMP", 1)]
21
21
  ```

3

追記

2018/11/07 15:45

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -57,4 +57,44 @@
57
57
  break
58
58
  exec_instruction(*instructions[pc])
59
59
  pc += 1
60
+ ```
61
+
62
+ 以上をまとめてみました。実行可能です。あまりきれいじゃないんですが、何かの参考にはなると思います。
63
+
64
+ ```python
65
+ import time
66
+
67
+ def fwd(arg):
68
+ # fwdとlftは自分の名前をprintしてarg秒sleepする関数にしてみました
69
+ print("fwd")
70
+ time.sleep(arg)
71
+
72
+ def lft(arg):
73
+ print("lft")
74
+ time.sleep(arg)
75
+
76
+ def exec_instruction(ins, arg):
77
+ global pc
78
+ if ins == "FWD":
79
+ fwd(arg)
80
+ elif ins == "LFT":
81
+ lft(arg)
82
+ elif ins == "JMP":
83
+ pc = label_table[arg]
84
+ else:
85
+ pass
86
+
87
+ instructions = [("MRK", 1), ("FWD", 1.0), ("LFT", 1.0), ("JMP", 1)]
88
+
89
+ label_table = dict()
90
+ for i, (ins, arg) in enumerate(instructions):
91
+ if ins == "MRK":
92
+ label_table[arg] = i
93
+
94
+ pc = 0
95
+ while True:
96
+ if pc >= len(instructions):
97
+ break
98
+ exec_instruction(*instructions[pc])
99
+ pc += 1
60
100
  ```

2

抜けてなかった

2018/11/07 15:43

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -53,6 +53,8 @@
53
53
  ```
54
54
  pc = 0
55
55
  while True:
56
+ if pc >= len(instructions):
57
+ break
56
58
  exec_instruction(*instructions[pc])
57
59
  pc += 1
58
60
  ```

1

追記

2018/11/07 15:41

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -2,4 +2,57 @@
2
2
 
3
3
  簡単とはいえpythonとは別の言語処理系を作ることになるので、相応の気合と知識が要ります。
4
4
 
5
- フロー制御だけできれば良いなら、読み込んだ命令をリストに入れて先頭から逐次実行、JMP系はプログラムカウンタ的な変数を用意しておいてそれを書き換える……みたいな方針で書けるとは思いますが。
5
+ フロー制御だけできれば良いなら、読み込んだ命令をリストに入れて先頭から逐次実行、JMP系はプログラムカウンタ的な変数を用意しておいてそれを書き換える……みたいな方針で書けるとは思いますが。
6
+
7
+ #### 追記
8
+ 一応具体例を書いておきます。あくまでも概念コードなので、そのまま実行はできませんが。
9
+
10
+ ```
11
+ MRK(1)
12
+ FWD(1.0)
13
+ LFT(1.0)
14
+ JMP(x)
15
+ ```
16
+ を動かすとしたら、
17
+
18
+ まず読み込んで次のようなフォーマットに変換する。
19
+ ```python
20
+ instructions = [("MRK", 1), ("FWD", 1.0), ("LFT", 1.0), ("JMP", 1)]
21
+ ```
22
+
23
+ ラベルと命令のindexの対応テーブルを作っておきます。
24
+
25
+ ```python
26
+ label_table = dict()
27
+ for i, (ins, arg) in enumerate(instructions):
28
+ if ins == "MRK":
29
+ label_table[arg] = i
30
+ ```
31
+
32
+ 命令を実際に実行するための関数を書く。なお、各命令の関数は別途用意しておきます。
33
+
34
+ ```python
35
+ def exec_instruction(ins, arg):
36
+ global pc
37
+ if ins == "FWD":
38
+ fwd(arg)
39
+ elif ins == "LFT":
40
+ lft(arg)
41
+ # 中略...
42
+ # JMP系はまた扱いが別
43
+ elif ins == "JMP":
44
+ pc = label_table[arg]
45
+ elif ins == "SW":
46
+ if スイッチがHなら:
47
+ pc = label_table[arg]
48
+
49
+
50
+ ```
51
+
52
+ あとはメインループを回せば良いです。
53
+ ```
54
+ pc = 0
55
+ while True:
56
+ exec_instruction(*instructions[pc])
57
+ pc += 1
58
+ ```