6

大学での私のCSコースの1つでは、ラケットを使用する必要があります。大学入学前のプログラミング時間のほとんどは、PHPとJava、そしてJavaScriptで過ごしました。私はRacketがJavaScriptと同じように関数型プログラミング言語であることを知っています(編集:もちろんそうではありません。しかし、私はそれを使って「関数型」プログラミングをしているように感じました。答えを見た後、それは間違った認識です。)しかし私はラケット(スキーム)のいくつかの基本的な特性をまだ理解していません。

  1. 「実際の」変数がないのはなぜですか?Racket / Schemeですべてが機能するのはなぜですか?言語設計者がそれらを含めなかったのはなぜですか?

  2. define-structですか?関数ですか?クラスですか?私はどういうわけか、私のPHPのバックグラウンドのために、それは常にクラスだと思っていますが、それは本当に正しいことではありません。

ここでの私の質問は、言語の概念を理解したいということです。個人的にはまだ変だと思っていて、以前使っていたものとは違うので、脳がJavaScriptと比較しようとしていますが、私にはとても違うようです。JavaScriptとの類似点/相違点は大いに役立ちます!

4

4 に答える 4

23
  1. Racket には「実際の」変数があります。たとえば、このコードを書くと

    (define x 3)
    

    「グローバル」変数xは値 3 に設定されます。

    (set! x 4)
    

    変数xはその値を 4 に変更します。したがって、Racket では、必要に応じて、任意の「通常の」言語と同様に「通常の」変数を使用できます。実際、Racket では、手続き型ではなく関数型のプログラミング スタイルが好まれます。関数型プログラミング スタイルでは、変数の変更は推奨されません。

  2. define-structは、「構造テンプレート」を他のいくつかのものとともに定義するために使用する Racket マクロです。たとえば、次のように記述します。

    (define-struct coord (x y))
    

    「構造テンプレート」を定義しました (つまりcoord 、2 つの「スロット」を持つ名前付きのユーザー タイプ:xy)。その後、次のことができます。

    • coordたとえば、次のように、 構造体の新しい「インスタンス」を作成します。(make-coord 2 3)

    • 構造体オブジェクトからスロット値を抽出します。

      (coord-x (make-coord 2 3)) ;will return 2
      

      また

      (coord-y (make-coord 2 3)) ;will return 3
      
    • 特定のオブジェクトがその構造にすぎないかどうかを尋ねることができます。たとえば、 3 は 構造体型ではないため、(coord? 3)が返されますが、#fcoord

      (coord? (make-coord 2 3)) ;will return #t
      
于 2012-04-10T12:05:20.590 に答える
8

(C++、Javascript、Java などの言語を使用する) プログラミングの最も一般的または流行の方法には、いくつかの特徴があります。あなたはそれらを自明であり、唯一可能な方法だと思っているかもしれません。それらには以下が含まれます:

  • 命令的

「このステップを実行してから、この次のステップを実行する」などに集中します。

  • 突然変異の使用。

変数を宣言し、それに異なる値を割り当て続けます (「変更」)。

  • オブジェクト指向。

コードとデータをクラスにバンドルし、それらのインスタンスをオブジェクトとして宣言します。次に、オブジェクトを変異させます。

スキームやラケットを学ぶことは、これらが唯一の方法ではないことを理解するのに役立ちます.

哲学の授業で当たり前だと思っていたことに疑問を抱くように、最初は頭が痛くなるかもしれません。ただし、哲学のクラスとは異なり、脳を傷つけることには実際的な見返りがあります。:)

別の方法:

  • 機能的(必須ではなく)。ステップの To Do リストを作成するのではなく、値を返す式に焦点を当てます。
  • 不変。同上。
  • オブジェクト指向ではありません。クラスのオブジェクトを使用することは、すべてではありませんが、一部の問題に対する優れたアプローチになる場合があります。コードをデータにバンドルしたい場合は、「let over lambda」を使用したクロージャーなど、より一般的な方法がいくつかあります。クラスのすべての「荷物」、特に継承が必要ない場合があります。

Scheme と Racket を使用すると、これらのアイデアを簡単に調べることができます。しかし、これらは Haskell のように「純粋関数型」ではないため、命令型、変更可能、オブジェクト指向のことを本当にやりたい場合は、それもできます。しかし、Racket を Javascript と同じように学習しても意味がありません。

于 2012-04-10T17:58:35.910 に答える
5

スキームには「実際の」変数がたくさんあります。

関数型言語 (Racket など) と命令型言語 (JavaScript や PHP など) の違いは、関数型言語では通常、可変状態を使用しないことです。変数は、値を保持できるコンテナーというよりも、値の名前として考えたほうがよいでしょう。ループ構造などを使用して変数の値を変更する代わりに、フロー制御に再帰を使用します。

define-structは特殊な構文形式で、他の言語のキーワードに似ています。(他の言語とは異なり、Scheme では独自の構文形式を作成できます。) これは、クラスに似ていますがメソッドを持たない構造体型を定義します。また、新しい構造体型を利用するのに役立つ多くの関数も定義しています。

于 2012-04-10T11:55:26.667 に答える
2
  1. スキームには変数があります。

    > (define a 1)
    #<unspecified>
    > a
    1
    > (set! a 2)
    #<unspecified>
    > a
    2
    

    この言語には可変データ構造さえあります。

    > (begin
    >   (define v (make-vector 4))
    >   (vector-set! v 0 'foo)
    >   (vector-set! v 1 'bar)
    >   (vector-set! v 2 'baz)
    >   (vector-set! v 3 'quux))
    #<unspecified>
    > v
    #(foo bar baz quux)
    

    Scheme は純粋な FP 言語ではありません。主に関数型プログラミングを対象としていますが、命令型プログラミングを許可します。これは、Scheme の発明者が行った設計上の選択です。

  2. define-struct特殊な形式です。functionJavaScript のorreturnキーワードのような構文です。

于 2012-04-10T11:52:23.790 に答える