4

チキンスキームにハッシュテーブルがあります。ハッシュテーブルには、それらのキーに対応する値を持つキーがあり、対応するハッシュの値を持つハッシュです。「内部ハッシュ」のキーには、文字列である対応する値があります。(例えば、Ruby に詳しい人にとっては、ハッシュの関連部分の設定は次のように見えるかもしれません。

the_hash[group_name][section_name][part_name] = some_text

または文字列を読み取るには:

a_string = the_hash[group_name][section_name][part_name]

、 例えば。)

文字列を読み取る時点で、group_namesection_name、およびpart_nameが何であるかを知る必要があり、各文字列の値に基づいて特定のアクションを実行できる必要があり、Scheme のfor-eachおよびmap機能は十分ではないようです。 3 つのキー/サブキー文字列のうち、常に使用できるのは 1 つだけであるためです。それぞれの文字列がどのようなパターンを保持するかはわかりません。Web検索では、実行可能なソリューションは見つかりませんでした。同時に、私はSchemeに比較的慣れていないため、十分に慣れていない可能性があります。誰か私に解決策を教えてもらえますか?

4

1 に答える 1

2

Scheme には多次元ハッシュの組み込みサポートはありませんが、適切な抽象化を使用すると、独自の実装を構築できます。

; create a new multidimensional hash table
(define (make-multi-hash)
  (make-hash-table))

; set a value given a non-empty sequence of keys
(define (multi-hash-set! hash-table value . keys)
  (let loop ((hash hash-table)
             (keys keys))
    (cond ((null? (cdr keys))
           (hash-table-set! hash (car keys) value))
          (else
           (if (not (hash-table-exists? hash (car keys)))
             (hash-table-set! hash (car keys) (make-multi-hash)))
           (loop (hash-table-ref hash (car keys)) (cdr keys))))))

; retrieve a value given a non-empty sequence of keys
(define (multi-hash-ref hash-table . keys)
  (foldl (lambda (k h) (hash-table-ref h k))
         hash-table
         keys))

次のように使用します。

(define h (make-multi-hash))
(multi-hash-set! h 42 'a 'b 'c)
(multi-hash-ref h 'a 'b 'c)
=> 42

上記の手順を開始点として使用すると、必要な機能を確実に実装できます。また、Chicken Scheme は "通常の" ハッシュ テーブルを処理するための多くの手順を提供していることにも注意してください。この実装は内部で通常のハッシュ テーブルを使用するため、そのうちのいくつかは役に立ちます。

于 2013-01-16T02:34:30.997 に答える