2

这是一个很长的问题......我是新加入的,所以请不要攻击我。为我的英语沟通不佳道歉。我有一些定义:

HTML(H) 是其中之一

  • Str
  • Tag

标签是

  • (cons Sym (listof H))

我想使用相互递归,将 HTML 变成真正的 HTML 代码。例如,

(list 'html (list 'head (list 'title "Hi")) (list 'body (list 'h1 "Welcome") "Text")) 

变成:

"<html><head><title>Hi</title></head><body><h1>Welcome</h1>Text</body></html>"

这应该适用于任何列表或字符串。将其转换为 HTML 有以下规则:

  • 字符串不需要转换成 HTML。
  • 每个标签(来自定义)都以 . 开头<tag>和结尾</tag>。所以<html></html>

如果他们输入一个字符串“Hello”,那么它不会转换任何内容。我在这里写了代码,但它不起作用......

(define (html->string html)
  (cond [(string? html) html]
    [else (append (list "<" (first html) ">") (change-tag (rest html)) (list "</" (first html) ">"))]))


(define (change-tag lst)
  (cond [(empty? lst) empty]
    [else (append (html->string (list (first lst)))
                  (html->string (list (rest lst))))]))

如果我输入如下内容:

(list 'html (list 'head (list 'title "Hi")) (list 'body (list 'h1 "Welcome") "Text")) 

然后它给了我:

(list "<" 'html ">" "<" (list 'head (list 'title "Hi")) ">" "</" (list 'head (list 'title "Hi")) ">" "<" (list  (list 'body  (list 'h1 "Welcome").....etc etc

这是一个很长的输出,它不起作用。如何能够解决这个问题?

4

1 回答 1

3

您有正确的想法,但仍然 - 您提出的解决方案存在三个主要问题:

  • 输出将是string,而不是list,因此我们必须在递归步骤中附加字符串并在基本情况下返回字符串。
  • 如果我们想将符号与其他字符串连接起来,必须将它们显式转换为字符串。
  • 最后但并非最不重要的一点是:您遗漏了几个基本案例,这些对于编写正确的解决方案至关重要:如果给定的 html 是一个空列表,会发生什么?如果列表中的第一个元素不是符号,而是另一个列表怎么办?

这将起作用,请仔细查看更改的内容:

(define (html->string html)
  (cond [(empty? html) ""]
        [(string? html) html]
        [(not (symbol? (first html)))
         (html->string (first html))]
        [else (string-append
               "<" (symbol->string (first html)) ">"
               (change-tag (rest html))
               "</" (symbol->string (first html)) ">")]))

(define (change-tag lst)
  (cond [(empty? lst) ""]
        [else (string-append
               (html->string (first lst))
               (html->string (rest lst)))]))

它按预期工作:

(define html
  (list 'html
        (list 'head
              (list 'title "Hi"))
        (list 'body
              (list 'h1 "Welcome")
              "Text")))

(html->string html)
=> "<html><head><title>Hi</title></head><body><h1>Welcome</h1>Text</body></html>"
于 2020-11-02T22:34:37.903 回答