我有一个函数在从哈希表中提取的两个元素上调用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))
答案 0 :(得分:0)
你有没有尝试过像傻瓜这样的事情:
(defun (listify-dotted-pair x) (list (car x) (cdr x)))
答案 1 :(得分:0)
您提供的代码存在很多问题。错误放置的括号使得局部变量data
可以在let
之外访问,并且在第二个cond
项之前足够结束以结束define
和cond
。您似乎没有将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
时取得一些进展。