我希望能够操纵句子,以便将它们作为输入,并根据单个字母等返回输出。例如,ends-e命令将返回所有以“e”结尾的单词:
(ends-e '(only the good die young))
=> '(the die)
不幸的是,“e”是一个字符串,(只有优秀的人才会年轻)是一个句子。Scheme无法将句子理解为数据类型(因为它不是数据类型)。如何将用户输入的带有引号和括号的句子转换为我可以操纵并以相同的句子格式返回的句子?
本书:
https://people.eecs.berkeley.edu/~bh/ssch8/higher.html#ft1
概述了一些可以操纵句子和单词的功能,但在底部贴了一个脚注,说“就像本书中所有处理单词和句子的程序一样……本章中的程序是我们对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 '())
>
这意味着我不能问scheme“(h)是否等于“h”。我甚至不能问'(h)是否等于'(h)!
> (eq? '(h) "h")
#f
> (eq? '(h) '(h))
#f
>