如何从方案,球拍中的列表制作HTML

问题描述

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

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

这是非常长的输出,它不起作用。如何解决这个问题?

解决方法

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

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

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

(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>"

它按预期工作:

{{1}}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...