2016-05-18 10 views
-6

(...私のコードは本当にずさんであり、主に、すべての変数、global sおよびif文の理解には少し難しいかもしれない、私と一緒にご負担ください)コマンドは、私は

を作っインタプリタで動作しません

私はTelluriumという名前のコードゴルフ用に設計された、難解な、難解なテープベースのプログラミングを作成しました(これは要素fyiです)。これまでのところ、条件文以外はかなりうまくいきました。ここで

は、条件文の構文です:

(integer[code]

ここでのPythonの同等です:

if tape[selectedCell] == integer: code

だから、私の問題は、あなたが一度だけのステートメントを使用することができるということですコード内で一度にそれを使用してください、それは動作しません。それはエラーを投げることさえしません。それは何もしません。


ここでは、動作しないコマンドのいくつかの例と出力するものを示します。

(0[^](1[^]+(1[^]出力0は、代わりに1が続くなら、出力はのみ 0私はそれを選択したセルの値ではないので、インタプリタによってスキップされるべき最初(1[^]とは何かを、持っていると思います1.

別の例を示します。+++++(0[^](5[^]です。セルの値は5にインクリメントされます。次に、(0[^]は、セルの値がゼロに等しいかどうかを確認します。まあ、そうではないので、スキップする必要があります。次に、(5[^]は、セルの値が5に等しいかどうかをチェックします。それは、それは出力5する必要があります。代わりに、5\n5を出力します。

さらに別の例:(0[^](1[^](0[^]。セルの値が1でないため、(1[^]命令はインタプリタによって完全に無視されるべきです。それはまだゼロです。したがって、2つの0[^]コマンドがあるので、目的の出力は0\n0でなければなりません。

(0[^]は完全に機能します。これは一例で(1[^] 2.


ように私にはない、私は問題がスキップされるべき文とは何かを持っていることを考える0

あるセルの値を出力しますなぜこれがうまくいかないか知っている、私は知っていることを試みた。私はいくつかの助けに感謝したい、私は本当にこの言語を取得し、再び行ってみたい!


ここでは、余分なコマンドがすべて含まれていないインタープリタがあります。

tape = [0] * 25500 
readingNum = False 
readingIf = False 
num = [] 
code = [] 
selectedCell = 0 

def prompt(): 
    userInput = input("> ") 
    return userInput 

def read(cmd): 
    length = len(cmd) 
    commands = list(cmd) 
    for i in range(0, length): 
     parse(commands[i]) 

def parse(cmd): 
    global tape 
    global readingNum 
    global readingIf 
    global num 
    global code 
    global selectedCell 

    if readingNum == True: 
     if cmd == "[": 
      readingNum = False 
      readingIf = True 

     else:    
      num.append(cmd) 

    elif readingIf == True: 
     if cmd == "]": 
      readingIf = False 
      if tape[selectedCell] == int(''.join(num)): 
       read(code) 
       code = [] 
       num = [] 

      else: 
       return 

     else: 
      code.append(cmd) 

    elif cmd == "^": 
     print(tape[selectedCell]) 

    elif cmd == "+": 
     tape[selectedCell] += 1 

    elif cmd == "(": 
     readingNum = True 

    else: 
     print("Error") 

while 1: 
    read(prompt()) 
+3

これは本当に[mcve]である必要があります。私たちはインタプリタ全体をあなたのためにデバッグするためのコードを読むつもりはありません。あなたは問題を絞り込むのにもっと時間を費やす必要があります。 –

+0

ベストアドバイス - 賢明な量の印刷ステートメントを追加するか、Pythonデバッガを快適に使い、コードを1行ずつステップ実行します。 – user590028

+0

@MorganThrapp余分なコマンドを一切使わずに、インタプリタのバージョンでポストを更新しました。 (ずっと短い) – m654

答えて

1

これは、グローバルを使用しているため機能しません。3番目のifステートメントにif tape[selectedCell] == int(''.join(num)):を入力すると、numsには['1', '1']が含まれます。両方のifステートメントに1が追加されてnumになるため、int(''.join(num))になると、1と等しくなりません。

グローバルの使用を停止するには、このコードをリファクタリングする必要があります。スタックを表現するためにグローバルを使用しない方法の実際の例については、esolang I wrote a couple months backを見てください。私が望むように完成したわけではありませんが、グローバルなことなくスタックが稼働しています。

+0

はい、しかし、 '+'を使ってセルに1を加えた場合、2番目の '(1 [^]')はセルの値が1なので1を出力します( '+'は値をインクリメントします) – m654

+0

@ m654私の答えです。私は、グローバル変数から離れる必要があるという前に、私が言及した問題に迫っています。これは、あなたがそれらから離れるまで働かないでしょう。 –

+0

@MorhanTharpp構文解析の_inside_ )関数?私はそれを行う場合、グローバル変数は必要ないと確信しています。 – m654

関連する問題