代码之家  ›  专栏  ›  技术社区  ›  Daniel

如何在scheme中向哈希表添加向量?

  •  0
  • Daniel  · 技术社区  · 8 年前

    下面是我创建哈希表并基于列表向其添加向量的尝试。

    (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 回复  |  直到 8 年前
        1
  •  0
  •   assefamaru    8 年前

    为了将向量添加到哈希表中,您需要实际创建所述向量,并将其添加。例如

    (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
    

    编辑:如果 论据 是一个列表,其中包含需要创建并添加到哈希的向量的名称和大小,然后可以执行以下操作:

    (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