球拍:将点对更改为列表

时间:2013-11-10 03:38:53

标签: list racket hashtable

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

这是我的函数调用

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

我得到一个错误,说'(“是”。“开头”)不在散列表中,有没有办法将密钥从'(“是”。“开头”)改为'(“是”“开始”)?

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

2 个答案:

答案 0 :(得分:0)

你有没有尝试过像傻瓜这样的事情:

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

答案 1 :(得分:0)

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

我看不出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)

您在重写中使用的代码必须是错误的:

(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时取得一些进展。