Recursion 如何从scheme、racket中的列表生成HTML

Recursion 如何从scheme、racket中的列表生成HTML,recursion,scheme,racket,mutual-recursion,Recursion,Scheme,Racket,Mutual Recursion,这是一个很长的问题。。。我是新加入的,所以请不要攻击我。为我的英语沟通不好道歉。我有一些定义: HTML(H)是其中之一 Str 标签 一个标签是 (cons-Sym(H列表)) 我想使用相互递归,使HTML成为真正的HTML代码。比如说, (list 'html (list 'head (list 'title "Hi")) (list 'body (list 'h1 "Welcome") "Text")) 变成: &qu

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

HTML(H)是其中之一

  • Str
  • 标签
一个标签是

  • (cons-Sym(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>"
然后它给了我:

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

(列出“””您的想法是正确的,但您提出的解决方案仍存在三个主要问题:

  • 输出将是一个字符串,而不是一个列表,因此我们必须在递归步骤中追加字符串,并在基本情况下返回字符串
  • 如果要将符号与其他字符串连接,则必须将符号显式转换为字符串
  • 最后但并非最不重要的一点是:您缺少几个基本情况,而这些基本情况对于编写正确的解决方案至关重要:如果给定的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)))]))
(定义(html->字符串html)
(cond[(空?html)“]
[(字符串?html)html]
[(不是(符号?(第一个html)))
(html->字符串(第一个html))]
[else(字符串追加
""
(更改标记(rest html))
"")]))
(定义(更改标签lst)
(cond[(空?lst)“]
[else(字符串追加
(html->字符串(第一个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>"
(定义html
(列表)html
(名单标题)
(列表标题“Hi”))
(名单机构)
(列出“h1欢迎”)
"文本"))
(html->字符串html)
=>“HiWelcomeText”

您是否在字符串之间使用
追加
您打算在哪里使用
字符串追加
(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>"