代码之家  ›  专栏  ›  技术社区  ›  Artemis

如何变异变量方案

  •  2
  • Artemis  · 技术社区  · 7 年前

    我正在尝试使用可变对象为赋值求和列表。 let 是用来让我变异的 x 总额和 counter 。我不太熟悉scheme,因此使用 if 列表中每个数字的语句 lst :

    (define lst (list 1 2 3 4 5))
    
    (let mut ((counter 0))
     (let ((x (car lst)))
    
      (if (= counter 4)
          x)
      (if (= 0 counter)
        (+ x (cadr lst)))
      (if (= 1 counter)
          (display (caddr lst)) ;test
          (+ x (caddr lst)))
      (if (= 2 counter)
          (+ x (caddr lst)))  
    
      (set-car! lst (cdr lst))   
      (mut (+ counter 1))
      )
    )
    

    然而,当我运行代码时,我得到了一个错误

    +: contract violation
          expected: number?
          given: (mcons 2 (mcons 3 (mcons 4 (mcons 5 '()))))
          argument position: 1st
          other arguments...:
    

    但是当我检查时 (caddr lst) 它返回一个 3 正如所料。 我的问题是 为什么跑步时 caddr 生产 (mcons 2 (mcons 3 (mcons 4 (mcons 5 '())))) 当应用于 + 但如果不应用,则返回 3.

    我正在使用R5R 编辑:为了简洁起见,我省略了一些if语句

    1 回复  |  直到 7 年前
        1
  •  1
  •   Artemis    7 年前

    好吧,我用了一个完全不同的实现 @molbdnilo公司 我的理解有缺陷,这是正确的。 如果其他任何人正在与此问题作斗争,下面是我的实现

    (define (goMut)
      (define mVar 0)
      (define acc 0)
    
    (define (accDo num)
        (set! acc (+ num acc)))
    
      (for-each (lambda (x) (set! mVar x) (accDo x))
                (list 1 2 3 4 5))
      acc
    )
    

    使用集合!我们可以将列表中的值应用于外部变量,并在使用函数遍历整个循环时对其进行变异 accDo 。函数模板取自 SICP 第107页

    推荐文章