如何在方案中将向量添加到哈希表?

时间:2017-10-10 04:47:25

标签: scheme

这是我尝试创建哈希表并根据列表向其添加向量。

(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...:

1 个答案:

答案 0 :(得分: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