2017-05-21 30 views
0

DrRacketは、lispで構築された関数型プログラミング言語です。関数言語で効果的な関数を「積み重ねる」 - DrRacket

私は(私は再作成作業のコンピュータにしようとしている)instructionに取るrun-insと呼ばれ、指定された変数にいくつかの変更を加え副作用の機能を作成した今

、私はと呼ばれる、別の関数を作成したいですrun-loinstのid EST:instrcutionsのリストを実行し、これはコードです:

(define (run-loinst loinst) 
    (map run-ins loinst)) 

結局のところ、私は繰り返し条件と命令のリストにrun-loinstを実行すると、繰り返し命令が一度だけ実行され、そして以前のリスト要素wiの効果後期の実行前には行われません。

私は、複数の命令を実行し、その結果を前の用語の効果に順番に組み立てるコードを書くにはどうすればよいですか?


(ところで、以下run-insのコードで、機能をサポート)

(define (run-ins ins) 
    (cond [(string=? (ins-type ins) "+") 
     (set-Rs! (second (ins-lori ins)) 
        (+ (* (first (ins-low ins)) (first (ins-lori ins))) (second (ins-lori ins))))] 
     [(string=? (ins-type ins) "set") 
     (set-Rs! (second (ins-lori ins)) 
        (* (first (ins-low ins)) (first (ins-lori ins))))] 
     [else void])) 

(define (set-Rs! index val) 
    (local [(define (fn-1 n acc) 
      (if (= n (length Rs)) 
       acc 
       (cond [(= index n) (fn-1 (add1 n) (append acc (list val)))] 
         [else (fn-1 (add1 n) (append acc (list (list-ref Rs n))))])))] 
    (set! Rs (fn-1 0 empty)))) 
+0

ラケットについてはわかりませんが、別のリスプであるClojureには、副作用関数のリストを実行するために 'doseq'が使用されています。ラケットには何か似たものがあるかもしれません。 – Carcigenicate

+0

予期しない結果をもたらす 'run-loinst'の呼び出し例を追加することもできますか? – Cactus

答えて

0

私が正しくあなたのコードを理解していた場合は、命令の内のコンピュータの状態を保存していますオブジェクト。このため、各命令オブジェクトを個別に変更すると、リスト内の後の命令オブジェクトには影響しません。あなたの状態をあなたの指示と分けて、foldのようなものを使用することをお勧めします。

命令とマシンの状態(その順番)をとり、その状態で命令を実行し、新しい状態(この関数をrunと呼ぶ)を返す関数がある場合は、次のような特定のマシン状態:

(fold run current-state instructions-list) 

これはすべての命令を実行した後に新しい状態を返します。

関連する問題