Kla*_*ama 0 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)
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
非常感谢你.
当然这是一个不良形式let:
(let (((cdar distlist)
(+ (cdr min-pair) (cddr edge))))
'())
Run Code Online (Sandbox Code Playgroud)
你想做什么?将(+ (cdr min-pair) (cddr edge))表达式赋值给(cdar distlist)位置中的元素?这绝对不是列表在Scheme中工作的方式(至少不是不可变列表),你不能为这样的位置赋值.此外,只能在let表达式中的绑定的左侧声明变量,而不能在其他表达式(如代码中)声明变量.
你必须重新考虑你的算法,要么使用a vector (它确实支持给定位置的元素的就地修改),或者检查你正在使用的Scheme解释器的文档,看看它对可变的说法是什么对和列表.