"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 运行 执行所有指令后的新状态。
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 运行 执行所有指令后的新状态。