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 - Essentials of Programming Languages (3rd ed) にあります。

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

これがあなたの質問の答えかもしれません。Map 関数は、関数とリスト (-s) を引数として取り、リストの要素に関数を適用し、結果を返します。

于 2009-11-13T07:23:44.783 に答える
1

これはネイサンの投稿への追加であり、現時点であなたにとって最良の答えです...

schemeまたはモジュール言語に移行すると、 PLT のイテレータscheme/base群にアクセスできるようになります。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 に答える