2

スキームでは、+、-、*、/などのプロシージャはさまざまなタイプの数値で機能しますが、他の一般的なプロシージャはあまり見られません。

たとえば、lengthはリストでのみ機能するため、vector-lengthとstring-lengthが必要です。

この言語は、Haskellの「型クラス」や標準化されたオブジェクトシステムのようなジェネリックプロシージャ(もちろんcondを除く)を定義するためのメカニズムを実際には提供していないという事実から来ていると思います。

私が知らない一般的な手順を処理する慣用的なスキームの方法はありますか?

4

5 に答える 5

2

すべての「異なるタイプの数値」はすべてスキーム番号である(つまり、(number? n)等しい#t)ことを覚えておいてください。この動作は実際には理にかなっています。+、、、および他-のすべての算術演算子は数値のみを操作します(他の言語では、異なる数値タイプとして分類されますが、、、など)これは、で数値タイプを明示的に宣言できないためです。図式。*/intlongfloat

外部ライブラリを使用する以外に、一般的なソリューションが本当に必要な場合、最も簡単な方法は、独自のソリューションを作成することです。

(define org-length length)
(define (length x)
  (cond
    ((string? x) (string-length x))
    ((vector? x) (vector-length x))
    ; keep going ...
    (else (org-length x))))
于 2010-04-22T15:19:39.963 に答える
1

あなたは本当にそのためのオブジェクトシステムを持ちたいのです。たとえば、 ChickenSchemeのデファクトスタンダードオブジェクトシステムであるTinyCLOS(リファレンスマニュアルを参照)を確認することをお勧めしますが、ほとんどのScheme実装で利用できるようです。

于 2010-04-23T10:49:37.060 に答える
1

いいえ、でも自分で作ることはできます。スキームへようこそ!

過去に私はジェネリック関数を提供するためにSwindleを使用しました。PLTスキームにバンドルされています。それは私にとってはうまくいきましたが、それは数年になります。現在、他の選択肢があるかもしれません。

于 2010-04-22T15:13:34.387 に答える
1

データオブジェクトに「タグ」を付けることでジェネリックデータ型を操作できるプロシージャの実装について説明しているSICPのセクション2.4および2.5をお読みください。そのMITビデオシリーズの講義4-Bにもあります。

于 2010-04-22T21:40:57.260 に答える
1

最後に、PLTスキームで非常に優れたソリューションを見つけました。

(require (rename-in scheme [length list-length]))

(define length
 (λ (x)
  ((cond [(list? x) list-length]
         [(string? x) string-length]
         [(vector? x) vector-length]
         [else (error "whatever")]) x)))

(length '(a b c))
(length "abc")
(length #(1 2 3))  
于 2010-05-30T23:11:40.773 に答える