2017-10-10 19 views
0

ここでは、ハッシュテーブルを作成し、それにリストに基づいてベクトルを追加しようとしました。schemeのハッシュテーブルにベクトルを追加するには?

#<procedure> 

は今、私はそれが含まれているベクトルの大きさを取得することにより、ハッシュテーブルを照会しようとします:

(define *function-table* (make-hash)) 
(define (function-get key)(hash-ref *function-table* key)) 
(define (function-put! key value)(hash-set! *function-table* key value)) 
(define arguments '(myVector 5)) 
(lambda(pair)(function-put! (car pair) (make-hash (cadr pair))) arguments) 

は、私は、次のメッセージが表示されます。

(vector-length (function-get myVector)) 

エラーメッセージ:

myVector: undefined; 
cannot reference undefined identifier 
    context...: 
+0

スキームは、[メイクhashtable' ']'持っメルルーサ-hash'のではなく、(http://www.r6rs.org/final/html/r6rs-lib/r6rs- lib-ZH-14.html)と、SRFI-125(https://srfi.schemers.org/srfi-125/srfi-125.html)からの 'make-hash-table'も新しくなっていますまだ完成していないR7RSの標準規格です。 – Sylwester

答えて

0

ハッシュテーブルにベクトルを追加するためには、あなたが実際に言ったベクトルを作成し、それを追加する必要があります。例えば、あなたがargumentsを定義したときのように、引用されたリストを使用した場合、最初の要素、すなわち、実際のシンボルであることを

(define table (make-hash))   ;; create new mutable hash table 
(define vec (make-vector 10 5)) ;; create new vector 
(hash-set! table 'myVector vec) ;; add vector to hash, key='myVector, value=vec 
(hash-ref table 'myVector)   ;; retrieve hash value for specified key 
#(5 5 5 5 5 5 5 5 5 5) 

注意。 'myVector。だから、あなたのハッシュキーとしてそれを参照するには、名前に引用符を追加する必要があります:(function-get 'myVector)

次のことを考えてみましょう:

(define *function-table* (make-hash)) 

(define (function-get key) 
    (hash-ref *function-table* key)) 

(define (function-put! key value) 
    (hash-set! *function-table* key value)) 

(define arguments (list 'myVector (make-vector 10 5))) 

((lambda (pair) 
    (function-put! (car pair) (cadr pair))) 
arguments) 

、あなたが持つことができる:

(vector-length (function-get 'myVector)) 
=> 10 

EDIT:argumentsを作成する必要がベクトルの名前とサイズを含むリストである場合ハッシュに追加すると、次の操作を実行できます。

(define arguments '(myVector 5)) 
((lambda (pair) 
    (function-put! (car pair) (make-vector (cadr pair)))) 
arguments) 
その後、

(function-get 'myVector) 
=> #(0 0 0 0 0) 
(vector-length (function-get 'myVector)) 
=> 5 
+0

私は引用の定義を本当に理解していません。私はいくつかの記事をオンラインで読んでおり、これらは引用を何かを定数に変えるために使われていると言います。あなたは何を意味するのかを詳しく説明できますか?なぜmake vector文で2つの引数を使用するのですか? – Daniel

+0

おそらくこれはあなたに良い概観を与えるでしょう:[引用とリストの違いは何ですか](https://stackoverflow.com/questions/34984552/what-is-the-difference-between-quote-and-list)。 – assefamaru

+0

'make-vector'については、単純に'(make-vector 10 5) 'を例ベクトルとして使用しました。ここで10は、ベクトルが最初にいくつあったかを指定し、5は各スロットの値を示します。 ['make-vector'](https://docs.racket-lang.org/reference/vectors.html?q=make-vector#%28def._%28%28quote._~23~25kernel%29を参照してください。 _make-ベクトル%29%29)。 'vector'を使って空のベクトルを初期化するか、'(make-vector 0) 'を実行することができます。 – assefamaru

関連する問題