Recursion 如何从scheme、racket中的列表生成HTML
这是一个很长的问题。。。我是新加入的,所以请不要攻击我。为我的英语沟通不好道歉。我有一些定义: HTML(H)是其中之一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
Str
标签
(cons-Sym(H列表))
(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>"