4

「SimplyScheme」(第2版)という本と一緒に、YouTubeで「ComputerScience61A-Lectures」を見ています。講義では、家庭教師はStk通訳を使用していますが、私はチキンスキーム通訳を使用しています。

最初の講義では、彼は「最初の」手順を使用します。

(first 'hello) 

「h」を返します。

「SimplyScheme」の本には、最初に実装する方法の例があります。

(define (first sent)
  (car sent))

私のテストと理解にとって、送信された場合に機能するのはリストです。スキームで「すべてがリストである」と言うのが適切かどうかを理解しようとしています。より具体的には、「こんにちは」のリストはどこにあり、リストがある場合は、本に書かれているように最初の手順で機能しないのはなぜですか?

また、すべての実装が「すべてがリストである」ことを念頭に置いて記述されている場合、同じコードがすべてのスキーム実装で機能しないのはなぜですか?

4

3 に答える 3

4

いいえ、これは一般的な誤解です。なぜなら、Scheme プログラミング (そして一般的に関数型プログラミングであることが多い) ではリストが非常に普及しているためです。ほとんどの Scheme 実装には、文字列、シンボル、ベクトル、マップ/テーブル、レコード、セット、バイトベクトルなどの多くのデータ型が付属しています。

このコード スニペット(first 'hello)は、標準に従って有効ではないため、ほとんどのスキームでは機能しない可能性があります。式'helloは、リストとして分解できない不透明な値であるシンボルeq?を示します (シンボルで行う主なことは、それらを と比較することです)。これはおそらく、残念ながらあなたの本で教えられている Stk の癖です。

言語のより標準的な説明については、Scheme プログラミング言語を参照してください。プログラミングを学びたいだけなら、HtDPをお勧めします。

于 2012-07-21T15:35:07.160 に答える
3

すべてがSchemeのリストではありません。あなたが示している例が実際に機能することに少し驚いています.他のSchemeインタープリターでfirstは、通常はのエイリアスでcarあり、ペアcarに対してのみ定義されているため、失敗します. たとえば、ラケットでは次のようになります。cons

(first 'hello)
> first: expected argument of type <non-empty list>; given 'hello

(car 'hello)
> car: expects argument of type <pair>; given 'hello

Scheme の基本的なデータ構造はコンスペアであり、任意にリンクされたデータ構造、特に単一リンク リストを構築することが可能です。ベクトルやハッシュ テーブルなど、他のデータ構造がサポートされています。そしてもちろん、ブール値、シンボル、数値、文字列、文字などのプリミティブ型もあります。したがって、Schemeで「すべてがリストである」と述べるのは誤りです。

于 2012-07-21T16:25:49.860 に答える
2

Simply Scheme に関して: 関数firstrestは、Scheme 標準の標準的なものでも、DrRacket に組み込まれているものでもありません。Simple Scheme API は、Simply Scheme カリキュラムの一部として設計されており、さまざまなデータを均一に操作しやすくします。Simply Scheme 教育言語を使用した経験だけから、基礎となる低レベルの実装がどのように機能するかについて、あまり多くの仮定を立てることはできません! 物事を単純にするためにはランタイム コストがかかります。無料で提供されるわけではありません。

于 2012-07-21T17:33:58.433 に答える