0

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

; 病态特殊形式:(let (...) ())

我的程序代码是,

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

已经非常感谢了。

4

2 回答 2

5

当然这是一个格式错误的let

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

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

您必须重新考虑您的算法,要么使用 a vector (它确实支持在给定位置对元素进行就地修改),要么检查您正在使用的 Scheme 解释器的文档,以查看它对 mutable 的说明对和列表。

于 2012-05-12T23:34:26.183 回答
1

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

语法:(let bindings body) 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.
于 2012-05-13T02:55:33.153 回答