我正在尝试编写一个计划程序,这是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)
)
)
)
)
非常感谢你。
答案 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.