2017-10-10 55 views
0

这里是我尝试创建一个哈希表,并基于列表添加一个向量。如何将矢量添加到计划中的哈希表中?

(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) 

我得到以下信息:

#<procedure> 

现在,我会尽量让它所包含的向量的大小来查询散列表。

(vector-length (function-get myVector)) 

错误消息:

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

计划没有'鳕鱼,hash',但['化妆hashtable'(http://www.r6rs.org/final/html/r6rs-lib/r6rs- libRS-14.html)和[SRFI-125](https://srfi.schemers.org/srfi-125/srfi-125.html)中的'make-hash-table',这也是新的R7RS中的标准 - 尚未定案。 – Sylwester

回答

0

为载体添加到一个哈希表,实际上你需要创建该载体,并将其添加。例如,

(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) 

注意,使用引用列表时,当你定义arguments比如,第一个元素实际上是一个符号,即。 '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 

编辑:如果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向量语句中使用两个参数? – 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