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

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)

非常感谢你.

Ósc*_*pez 5

当然这是一个不良形式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解释器的文档,看看它对可变的说法是什么对和列表.