【问题标题】:Scheme ill-formed special form letScheme 病态特殊形式 let
【发布时间】:2023-03-30 06:47:01
【问题描述】:

我正在尝试编写一个方案程序,它是 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)
        )
     )  
   )
)

已经非常感谢你了。

【问题讨论】:

    标签: scheme dijkstra let


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      您收到错误是因为您的 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.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 2011-08-02
        • 2021-12-26
        • 2015-06-19
        • 1970-01-01
        • 2016-02-01
        相关资源
        最近更新 更多