-1

我有一个函数在从哈希表中提取的两个元素上调用 hash-ref。第一个是 hashkey 的 cdr,第二个是来自 hashkeys 数据的随机列表。但是数据以点列表的形式返回,这会导致 hashref 失败,因为没有一个键是点对。有没有一种简单的方法可以让点对更改为列表?

这是我的函数调用

 (let ((data ( list-ref(hash-ref Ngram-table key) (random (length (hash-ref Ngram-table key))))))

我收到一条错误消息,说 '("was" . "beginning") 不在哈希表中,有没有办法将键从 '("was" . "beginning") 更改为 '("was" "beginning") ?

(define (startup key value)
(cond 
[(> value 0) 
 ;(cons (car key) (cons (cdr key) null))

 (let ((data ( list-ref(hash-ref Ngram-table key) 
random (length (hash-ref Ngram-table key))))))

(display data) 
(startup (list*(cons (cdr key) (cons data null)))    (- value 1)))]) 
;(append (cdr key) data)
[(= value 0)
(display "END")])

 ; this function calls the startup function
(define (run-prog)
(test)
(display "ALICE was ") 
(startup '("ALICE" "was") 100)) 
4

2 回答 2

0

您是否尝试过做一些愚蠢的事情,例如:

(defun (listify-dotted-pair x) (list (car x) (cdr x)))

?

于 2013-11-10T04:47:24.500 回答
0

您提供的代码存在很多问题。括号放错了,因此局部变量可以在第二个术语data之外访问let并且足够闭合以在第二个术语之前cond和之前结束。您似乎没有将 DrRacket 用作 IDE,因为它清楚地识别并为您显示匹配的括号。definecond

我看不到什么,Ngram-table但根据您的问题,它似乎是一个列表而不是哈希表。它是用哪里做的make-hash?(我假设您需要equal?匹配 e 字符串键)。如果您有一个带有键值的关联,例如使用以下方法'((key . value) (key2 . value2))进行哈希处理:(define Ngram-table (make-hash '(("key" . "value")("key2" . "value2"))))

第二个说明:

list*就像list,但最后一个参数是要附加的列表。因此:

(list* 5 '(1 2 3)) ; ==> (5 1 2 3)

您的代码,在recusion中使用的必须是错误的:

(list* (cons (cdr key) (cons data null)))

想象一下,您的关键是列表("ALICE" "was"),而数据“快乐”(我不确定它是否是列表).. 然后:

(cons (cdr key) (cons data '())) ; ==> (("was") "happy")

list*将成为同一个列表,因为它只是一个论点。如果您需要列表尾部的元素,您应该这样做:

(append (cdr key) (cons data '()) 

或者,如果散列中的数据是一个列表,您只需执行以下操作:

(append (cdr key) data) 

如果您需要更多帮助,我真的需要查看您的问题的更新,并在不平衡cond/方面取得一些进展let

于 2013-11-10T19:59:43.963 回答