"堆叠"功能语言中的有效功能 - DrRacket

时间:2017-05-21 15:16:47

标签: functional-programming lisp side-effects

DrRacket是一种用lisp构建的函数式编程语言。

我创建了一个名为run-ins的有效函数,该函数接收instruction并对指定变量进行一些更改(我试图重新创建工作计算机)

现在,我想创建另一个名为run-loinst id est的函数:运行一个instrcutions列表,这就是代码:

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

事实证明,当我在带有重复术语的指令列表上运行run-loinst时,重复的指令只运行一次,并且似乎先前的列表元素的效果不会发生在以后的任期。

那么,我如何编写一个代码,允许我运行多个指令并使其效果建立在先前术语按顺序排列的效果上?

(顺便说一下,以下是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))))

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的代码,您将把计算机的状态存储在Instruction对象中。因此,当您对每个指令对象进行单独更改时,它对列表中的后续对象没有任何影响。我建议您将状态与指示区分开来,并使用类似fold的内容。

如果你有一些函数需要一个指令和机器状态(按此顺序),运行该状态的指令,并返回新状态(让我们调用这个函数run),你可以运行一个列表对于给定机器状态的指令如下:

(fold run current-state instructions-list)

这将在运行所有指令后返回新状态。