计划格式错误的特殊形式让

时间:2012-05-12 22:48:41

标签: scheme dijkstra let

我正在尝试编写一个计划程序,这是Dijkstra的最短算法。在我放松边缘的过程中,我得到错误

  

;形成错误的特殊形式:(让(...)())

我的程序代码是,

(define relax-over-edge 
   (lambda (distlist edge min-pair)
     ( if (null? distlist)
       ()
       (if (equal? (cadr edge) (caar distlist)) 
            (if (> (cdar distlist) (+(cdr min-pair) (cddr edge)))
                (let (((cdar distlist) (+ (cdr min-pair) (cddr edge)) )) ())
                ()
            )
            (relax-over-edge (cdr distlist) edge min-pair)
        )
     )  
   )
)

非常感谢你。

2 个答案:

答案 0 :(得分:5)

当然这是一个格式不正确的let

(let (((cdar distlist)
       (+ (cdr min-pair) (cddr edge)))) 
  '())

你想做什么?将(+ (cdr min-pair) (cddr edge))表达式分配给(cdar distlist)位置的元素?肯定列表在Scheme中工作的方式(至少不是不可变的列表),你不能为这样的位置赋值。此外,只能在let表达式的绑定左侧声明变量,而不能在其他表达式中声明变量(如代码中所示)。

您必须重新考虑您的算法,使用vector 支持在给定位置对元素进行就地修改),或查看文档你正在使用的Scheme解释器,看看它对可变对和列表的看法。

答案 1 :(得分:1)

您收到错误是因为let表单的正文只是(),这不是可以评估的有效表达式。引用guile手册:

  

语法:(让绑定体)        BINDINGS的形式为

      ((VARIABLE1 INIT1) ...)

 that is zero or more two-element lists of a variable and an
 arbitrary expression each.  All VARIABLE names must be distinct.
     

...

    * The expressions in BODY are evaluated in order, and the value
      of the last expression is returned as the value of the `let'
      expression.