回答編集履歴

6

余談

2018/11/07 16:01

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -205,3 +205,27 @@
205
205
  - 構文が間違っていたらわかりやすいエラーを出す
206
206
 
207
207
  - MRKで同じラベルを複数作ると困るので、エラーを出すようにする
208
+
209
+
210
+
211
+
212
+
213
+ #### 余談
214
+
215
+ 大学の推薦入試くらいならけっこうウケるかもしれませんが、この「プログラミング言語」にはいろいろ問題があります。
216
+
217
+ - 変数がない
218
+
219
+ - 状態を持てない
220
+
221
+ - よってかなり表現能力は低い
222
+
223
+ - あと、初等教育の子たちってパソコンのキーボードを使えるんですか
224
+
225
+
226
+
227
+ さらにこの分野ではLEGOのマインドストームという強力な競合があります(他にもあるけど)。私は小学生の頃触っていましたが、けっこう高機能でした。
228
+
229
+
230
+
231
+ 今から練り直すもよし、あるいはその辺は割り切ってプレゼン力で乗り切るのも一つの戦略です。

5

追記

2018/11/07 16:01

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -197,3 +197,11 @@
197
197
  pc += 1
198
198
 
199
199
  ```
200
+
201
+
202
+
203
+ ぱっと思いつく、他にやらないといけないであろうこと。
204
+
205
+ - 構文が間違っていたらわかりやすいエラーを出す
206
+
207
+ - MRKで同じラベルを複数作ると困るので、エラーを出すようにする

4

動いちゃった

2018/11/07 15:48

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  #### 追記
14
14
 
15
- 一応具体例を書いておきます。あくまでも概念コードなので、そのまま実行はできませんが。
15
+ 一応具体例を書いておきます。
16
16
 
17
17
 
18
18
 
@@ -32,7 +32,7 @@
32
32
 
33
33
 
34
34
 
35
- まず読み込んで次のようなフォーマットに変換する。
35
+ まず読み込んで次のようなフォーマットに変換する。ここは面倒くさいので今回パスします。
36
36
 
37
37
  ```python
38
38
 

3

追記

2018/11/07 15:45

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -117,3 +117,83 @@
117
117
  pc += 1
118
118
 
119
119
  ```
120
+
121
+
122
+
123
+ 以上をまとめてみました。実行可能です。あまりきれいじゃないんですが、何かの参考にはなると思います。
124
+
125
+
126
+
127
+ ```python
128
+
129
+ import time
130
+
131
+
132
+
133
+ def fwd(arg):
134
+
135
+ # fwdとlftは自分の名前をprintしてarg秒sleepする関数にしてみました
136
+
137
+ print("fwd")
138
+
139
+ time.sleep(arg)
140
+
141
+
142
+
143
+ def lft(arg):
144
+
145
+ print("lft")
146
+
147
+ time.sleep(arg)
148
+
149
+
150
+
151
+ def exec_instruction(ins, arg):
152
+
153
+ global pc
154
+
155
+ if ins == "FWD":
156
+
157
+ fwd(arg)
158
+
159
+ elif ins == "LFT":
160
+
161
+ lft(arg)
162
+
163
+ elif ins == "JMP":
164
+
165
+ pc = label_table[arg]
166
+
167
+ else:
168
+
169
+ pass
170
+
171
+
172
+
173
+ instructions = [("MRK", 1), ("FWD", 1.0), ("LFT", 1.0), ("JMP", 1)]
174
+
175
+
176
+
177
+ label_table = dict()
178
+
179
+ for i, (ins, arg) in enumerate(instructions):
180
+
181
+ if ins == "MRK":
182
+
183
+ label_table[arg] = i
184
+
185
+
186
+
187
+ pc = 0
188
+
189
+ while True:
190
+
191
+ if pc >= len(instructions):
192
+
193
+ break
194
+
195
+ exec_instruction(*instructions[pc])
196
+
197
+ pc += 1
198
+
199
+ ```

2

抜けてなかった

2018/11/07 15:43

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -108,6 +108,10 @@
108
108
 
109
109
  while True:
110
110
 
111
+ if pc >= len(instructions):
112
+
113
+ break
114
+
111
115
  exec_instruction(*instructions[pc])
112
116
 
113
117
  pc += 1

1

追記

2018/11/07 15:41

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -7,3 +7,109 @@
7
7
 
8
8
 
9
9
  フロー制御だけできれば良いなら、読み込んだ命令をリストに入れて先頭から逐次実行、JMP系はプログラムカウンタ的な変数を用意しておいてそれを書き換える……みたいな方針で書けるとは思いますが。
10
+
11
+
12
+
13
+ #### 追記
14
+
15
+ 一応具体例を書いておきます。あくまでも概念コードなので、そのまま実行はできませんが。
16
+
17
+
18
+
19
+ ```
20
+
21
+ MRK(1)
22
+
23
+ FWD(1.0)
24
+
25
+ LFT(1.0)
26
+
27
+ JMP(x)
28
+
29
+ ```
30
+
31
+ を動かすとしたら、
32
+
33
+
34
+
35
+ まず読み込んで次のようなフォーマットに変換する。
36
+
37
+ ```python
38
+
39
+ instructions = [("MRK", 1), ("FWD", 1.0), ("LFT", 1.0), ("JMP", 1)]
40
+
41
+ ```
42
+
43
+
44
+
45
+ ラベルと命令のindexの対応テーブルを作っておきます。
46
+
47
+
48
+
49
+ ```python
50
+
51
+ label_table = dict()
52
+
53
+ for i, (ins, arg) in enumerate(instructions):
54
+
55
+ if ins == "MRK":
56
+
57
+ label_table[arg] = i
58
+
59
+ ```
60
+
61
+
62
+
63
+ 命令を実際に実行するための関数を書く。なお、各命令の関数は別途用意しておきます。
64
+
65
+
66
+
67
+ ```python
68
+
69
+ def exec_instruction(ins, arg):
70
+
71
+ global pc
72
+
73
+ if ins == "FWD":
74
+
75
+ fwd(arg)
76
+
77
+ elif ins == "LFT":
78
+
79
+ lft(arg)
80
+
81
+ # 中略...
82
+
83
+ # JMP系はまた扱いが別
84
+
85
+ elif ins == "JMP":
86
+
87
+ pc = label_table[arg]
88
+
89
+ elif ins == "SW":
90
+
91
+ if スイッチがHなら:
92
+
93
+ pc = label_table[arg]
94
+
95
+
96
+
97
+
98
+
99
+ ```
100
+
101
+
102
+
103
+ あとはメインループを回せば良いです。
104
+
105
+ ```
106
+
107
+ pc = 0
108
+
109
+ while True:
110
+
111
+ exec_instruction(*instructions[pc])
112
+
113
+ pc += 1
114
+
115
+ ```