"Stacking" 函数式语言中的有效函数 - DrRacket

"Stacking" effectful functions in functional language - DrRacket

DrRacket 是一种内置于 lisp 中的函数式编程语言。

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

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

(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))))

如果我对您的代码的理解正确,那么您就是将计算机的状态存储在 Instruction 对象中。因此,当您分别对每个 Instruction 对象进行更改时,它不会影响列表中后面的对象。我建议将您的状态与您的说明分开,并使用 fold.

之类的东西

如果您有一些函数接受指令和机器状态(按此顺序),运行 是那个状态的指令,return 是新状态(让我们调用这个函数run),您可以 运行 给定机器状态的指令列表,如下所示:

(fold run current-state instructions-list)

这将 return 运行 执行所有指令后的新状态。