我希望能够操纵句子,以便我可以将它们作为输入并根据单个字母等内容返回输出。例如,ends-e 命令将返回所有以“e”结尾的单词:
(ends-e '(only the good die young))
=> '(the die)
不幸的是,“e”是一个字符串,而 '(只有好人英年早逝)是一个句子。Scheme 很难将句子理解为一种数据类型(因为它不是一种数据类型)。如何将用户输入的带有引号和括号的句子转换为我可以操作并以相同句子格式返回的内容?
这本书:https ://people.eecs.berkeley.edu/~bh/ssch8/higher.html#ft1概述了一些可以操作句子和单词的函数,但在底部贴了一个脚注,上面写着“就像这里的所有程序一样处理单词和句子的书……[the] 本章中的程序是我们对 Scheme 的扩展的一部分。”
我如何获得这些扩展?我查看了后面的章节,但我对语言的理解太初级,无法理解如何自己创建这些程序。
这些是我尝试将 '(h) 转换为可以理解的数据类型方案时收到的错误消息。
Welcome to DrRacket, version 6.12 [3m].
Language: sicp, with debugging; memory limit: 128 MB.
> (symbol->string '(h))
. . symbol->string: contract violation
expected: symbol?
given: (mcons 'h '())
> (list->string '(h))
. . list->string: contract violation
expected: (listof char?)
given: '(h)
> (string->list '(h))
. . string->list: contract violation
expected: string?
given: (mcons 'h '())
> (string->symbol '(h))
. . string->symbol: contract violation
expected: string?
given: (mcons 'h '())
>
这意味着我不能询问方案 '(h) 是否等于“h”。我什至不能问它是否'(h)等于'(h)!
> (eq? '(h) "h")
#f
> (eq? '(h) '(h))
#f
>