String scheme-字符串附加了错误的类型以应用错误

String scheme-字符串附加了错误的类型以应用错误,string,list,scheme,lisp,runtime-error,String,List,Scheme,Lisp,Runtime Error,我有这个密码 (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-

我有这个密码

(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
    )
  )
(λ(符号)
(让*(
(数据列表(获取列表符号))
(desc“”)
(html“”)
(html(字符串附加html“”(列表参考数据列表1)”(列表参考数据列表2)”)
)
(do((第7页(+7页)))
((>p(-(长度数据列表)2)))
(描述(字符串附加描述“”(列表参考数据列表p)”\
(列表引用数据列表(+P1))“”)
)
(set!html(字符串附加html描述“”)
html
)
)
我基本上是从数据列表中提取一些元素,并向其中添加一些html标记。然而,当我运行代码时,我在desc绑定(第4行)上得到一个“要应用的类型错误”。有什么好处?即使我将其更改为“foo”之类的值,我仍然会得到错误的类型错误


有什么建议吗?

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

(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>")))
(λ(符号)
(let*((desc“”)
(数据列表(获取列表符号))
(html(字符串附加)
""
(列表参考数据列表1)
""
(列表参考数据列表2)
"")))
(do((第7页(+7页)))
((>p(-(长度数据列表)2)))
(设置!说明(字符串附加说明)
""
(列表参考数据列表p)
""
(列表参考数据列表(+P1))
"")))
(字符串附加html描述“”))

对不起,我不明白这会导致(““1”)的结果。你能再解释一下那部分吗?另外:我以为我是在let的装订部分,这就是我为什么这么做的原因。有没有其他方法可以绕过这个问题,而不必使用let-in-do?@NelsonLiu我更新了我的答案。简而言之,
desc
是一个字符串,在这一行:
(desc(string append desc…)
您没有给它赋值-您调用它就像调用一个过程一样!请看(我认为)固定代码。不,
desc
不在绑定部分,因为它在退出条件之后,它在身体部分。是的,就是它!然而,这样做似乎很好。不管怎样,代码是有效的。谢谢