Schemeの機能指向機能

画像 こんにちは この記事では、「コンピュータープログラムの構造と解釈」という本で検討されているように、Scheme言語でのオブジェクトプログラミングの問題をもう一度強調したいと思います。

次に、 DrRacketをダウンロードするようSchemeをプログラミングしたことがない人に、この記事の例の手順を試してみることをお勧めします。 経験豊富なプログラマのスキーム、ラケット...この記事は、初心者やラケットに「触れたい」人向けに書かれているため、非常に退屈です。



そして順番に。 DrRacket IDEで始めましょう。

新しいプログラムファイルを作成します。 保存してください。

言語を指すディレクティブをファイルの先頭に挿入します。

#lang racket
      
      





関数を定義します。

 (define (func1 x) x) ;    x,  x
      
      





次のような関数を使用できます。

 (func1 10) ;   10
      
      







次に、別の関数を定義します。

 (define (func2) "func2")
      
      





最初の関数を2番目の関数に適用し、2番目の関数を返すように変数を定義してみましょう。

 (define x (func1 func2)) ;  x -     func2
      
      





関数としてxを使用します。

 (x) ;   "func2"
      
      





ここでは、関数が関数を返す可能性を使用し、その結果は変数として定義できます。

次に、内部変数と他の関数をカプセル化するオブジェクトを作成しましょう。

 (define (MyObject field1 field2) ;         field1  field2 (let ((f1 field1) ;    f1,   field1 (f2 field2)) ; ... (define (get-f1) f1) ;     f1 (define (get-f2) f2) ; ... (define (set-f1 x) (set! f1 x)) ;  f1  x (define (set-f2 x) (set! f2 x)) ; ... ;     (define (dispatch m) ;       (cond ((eq? m 'get-f1) get-f1) ;  m  get-f1,    get-f1 ((eq? m 'set-f1) set-f1) ; ... ((eq? m 'get-f2) get-f2) ; ... ((eq? m 'set-f2) set-f2) ; ... ) ) dispatch)) ;     MyObject   
      
      





さて、オブジェクトが定義されました。次に、MyObjectオブジェクトのインスタンスを作成しましょう。

 (define Obj1 (MyObject " Hello " " world!!! ")) ;  Obj1 
      
      





次に、必要に応じてインスタンスを使用します。

 (display ((Obj1 'get-f1))) ;  - display -  printf,    ;  ((Obj1 'get-f1))    ,    get-f1 (display ((Obj1 'get-f2))) ;  (newline) ;     ;   " Hello world!!! "
      
      





同じオブジェクトの新しいインスタンスを作成します。

 (define Obj2 (MyObject " Hello " " habra!!! ")) ; ; : "Hello Hello habra!!! world!!!"
      
      





やってみましょう:

 (display ((Obj1 'get-f1))) (display ((Obj1 'get-f2))) (newline) (display ((Obj2 'get-f1))) (display ((Obj2 'get-f2))) (newline) ;   "Hello world!!!" ;  "Hello habra!!!"
      
      





私が驚いたのは、各インスタンスが同じ関数を返しますが、それらの動作は同じではないということです。

つまり、Schemeでは、C ++とは異なり、関数は変数と関数を取り、インスタンスから計算します。

この機能は、1つ以上のオブジェクトの異なるインスタンスの内部状態を変更するための機能のリストの編成に大いに役立ちます。

 (define func-list (list (Obj1 'get-f1) (Obj2 'get-f1) (Obj2 'get-f2) (Obj1 'get-f2)))
      
      





このリストから各関数の実行を次のように出力します。

(map(lambda(x)(display(x)))func-list)

; 結果:「こんにちは、ハブラ! 世界!!!」



All Articles