1

我希望能够操纵句子,以便我可以将它们作为输入并根据单个字母等内容返回输出。例如,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
> 
4

1 回答 1

1

在 DrRacket 中有一个简单的方案兼容语言

1. 从包管理器

  1. 打开包管理器:在 DrRacket 中选择菜单“文件”,然后选择“包管理器...”。

  2. 在“Do What I mean”选项卡中,找到文本字段并输入:“simply-scheme”,不带引号。

  3. 单击“安装”按钮。这会产生 smoe 输出。当您可以单击“关闭输出”时,它就完成了,您可以关闭窗口。

  4. 测试一下。确保 DrRacket 在左下角有“Determine language from source”。编写以下程序并单击RUN

#lang simply-scheme
(se (butlast (bf "this"))
    "world")
; ==> (hi "world")

我有点困惑,因为SICPSimply Scheme是两本不同的书。SICP 在他们的书中有他们自己指定的程序,并且在 DrRacket 中也有一种特定的语言#lang sicp,用于那种风格的 Scheme。我已经写了一个关于如何安装 sicp 的类似答案

于 2018-05-15T21:19:48.660 回答