2

Scheme 中是否存在for循环或循环?for each

我一直在寻找,发现有一个关键字“ every”但是我使用的方案编译器语言没有预先构建这个功能。这是它应该做的,它可以在这里找到

(define (first-letters sent)
  (every first sent))

> (first-letters '(here comes the sun))
(H C T S)

我怎样才能重新编写every函数?使用其他预定义函数。我使用的语言在 DrScheme - 编程语言基础(第 3 版)中

我尝试了 DrScheme 中所有预装的编译器,没有一个可以编译该every函数。

有任何想法吗 ?

4

4 回答 4

6

您正在寻找map,虽然您可能想知道 Scheme 也有for-eachmap完全符合您的要求every。它对列表中的每个项目执行一些操作,返回一个新的结果列表。

你甚至可以说

(define every map)

您可以first通过编写来获取您的功能

(define (first symbol)
  (string->symbol (string (string-ref (symbol->string symbol) 0))))

不过,这是不好的 Scheme 风格。它看起来像 60 或 70 年代的古老 Lisp,早在字符串出现在语言中之前。无论如何,现在你可以说

(map first '(here comes everybody))
=> (h c e)

for-each对列表中的每个项目都有某种副作用:

(define initials (map first '(here comes everybody)))
(for-each display initials)
=> hce
于 2009-11-13T14:29:19.833 回答
2

可能是您问题的答案。映射函数,将函数和列表(-s)作为参数,将函数应用于列表元素,返回结果。

于 2009-11-13T07:23:44.783 回答
1

这是对 Nathan 帖子的补充,这是您现在最好的答案...

如果您曾经使用过schemescheme/base模块语言,您将可以访问 PLT 的for迭代器大军。这些看起来有点像其他语言中常见的“for each”循环。for在文档中搜索:

(define (first symbol)
  (string->symbol (string (string-ref (symbol->string symbol) 0))))

(for/list ([symbol (in-list '(here comes everybody))])
  (first symbol))

=> '(h c e)
于 2010-01-30T14:21:23.703 回答
0

取决于您正在查看的方案。除了上面提到的“for-each”和“map”(它们是各种标准的一部分,因此存在于所有实际方案中)之外,您还可以找到特定于实施的扩展。例如,PLT 方案有一大堆这样的表格,你可以在这里阅读。

于 2009-11-13T16:23:05.843 回答