【问题标题】:scheme - string-appends wrong type to apply error方案 - 字符串附加错误类型以应用错误
【发布时间】:2025-11-24 22:45:02
【问题描述】:

我有这个代码

(lambda (symbol)
  (let*(
        (datalist (get-list symbol))
    (desc " ")
        (html "<table border=\"1\">")
        (html (string-append html "<tr><td>" (list-ref datalist 1) "</td><t\
r><td>" (list-ref datalist  2) "</td></tr>"))
        )
    (do ((p 7 (+ 7 p)))
    ((> p (-(length datalist) 2)))
      (desc (string-append desc "<tr><td>"(list-ref datalist p) "</td><td>"\
 (list-ref datalist (+ p 1))"</td></tr>"))
      )
    (set! html (string-append html desc "</table>"))
      html
    )
  )

我基本上是从数据列表中获取一些元素并向它们添加一些 html 标记。但是,当我运行代码时,我在 desc 绑定(第 4 行)上收到“应用错误的错误类型”。是什么赋予了?即使我将其更改为诸如“foo”之类的值,我仍然会收到错误的类型错误。

有什么建议吗?

【问题讨论】:

    标签: string list scheme lisp runtime-error


    【解决方案1】:

    错误不在绑定中,在循环体中:

    (desc (string-append desc …))
    

    您正在尝试应用desc,就好像它是一个过程一样 - 但它是一个字符串。所以基本上这部分代码正在做与此等价的事情:

    ("s1" "s2")
    

    这将导致报告的错误。也许你是打算这样做的?

    (set! desc (string-append desc …))
    

    我会猜测一下您要实现什么。 注意正确缩进和格式化代码有助于使其清晰:

    (lambda (symbol)
      (let* ((desc " ")
             (datalist (get-list symbol))
             (html (string-append "<table border=\"1\">"
                                  "<tr><td>"
                                  (list-ref datalist 1)
                                  "</td><tr><td>"
                                  (list-ref datalist  2)
                                  "</td></tr>")))
        (do ((p 7 (+ 7 p)))
          ((> p (- (length datalist) 2)))
          (set! desc (string-append desc 
                                    "<tr><td>"
                                    (list-ref datalist p) 
                                    "</td><td>"
                                    (list-ref datalist (+ p 1))
                                    "</td></tr>")))
        (string-append html desc "</table>")))
    

    【讨论】:

    • 抱歉,我不明白它会如何导致 ("" 1)。你能解释一下那部分吗?另外:我以为我在 let 的绑定部分,这就解释了我为什么这样做。有没有其他方法可以在不使用 let 的情况下解决这个问题?
    • @NelsonLiu 我更新了我的答案。简而言之,desc 是一个字符串,在这一行中:(desc (string-append desc …)) 你没有给它赋值——你调用它就像它是一个过程一样!请参阅(我认为)固定代码。不,desc 不在绑定部分,因为它在退出条件之后,在正文部分。
    • 是的,就是这样!但是,这样做似乎很好。无论如何,代码有效。谢谢!
    最近更新 更多