Я бы хотел иметь возможность манипулировать предложениями, чтобы я мог использовать их в качестве входных данных и возвращать выходные данные на основе таких вещей, как отдельные буквы. Например, команда end-e, которая возвращает все слова, оканчивающиеся на «e»:
(ends-e '(only the good die young))
=> '(the die)
К сожалению, «е» - это строка, а «(только хорошие умирают молодые) - это предложение. Схема испытывает затруднения при понимании предложения как типа данных (потому что оно не одно). Как превратить предложение, которое пользователь вводит с кавычкой и скобками, во что-то, что я могу манипулировать и вернуть в том же формате предложения?
Эта книга: https://people.eecs.berkeley.edu/~bh/ssch8/higher.html#ft1 описывает некоторые функции, которые могут манипулировать предложениями и словами, но размещает сноску внизу, говоря: «Как и все процедуры в этой книге, которые имеют дело со словами и предложениями ... [the] процедуры в этой главе являются частью нашего расширения Схемы. "
Как мне получить эти расширения? Я посмотрел более позднюю главу, но мое понимание языка слишком элементарно, чтобы понять, как создавать эти процедуры самостоятельно.
Это сообщения об ошибках, которые я получаю, когда пытаюсь превратить '(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
>