<div dir="ltr"><div class="gmail_quote"><div>After studying chapter 14 of HtDP, I decided to try putting strings into a BST. The code below works with a few strings. I have a file with 22064 strings --- one per line. Up until 1471 words, it works. With 1472 it yields a contract violation.</div>

<div><br></div><div>> (length (read-words))<br></div><div dir="ltr"><div><div>22064</div></div><div><br></div><div>> (create-bst-word-from-list (take (read-words) 1471))<br></div><div><div>#<node></div></div>
<div>
<br></div><div><div>
> (create-bst-word-from-list (take (read-words) 1472))</div><div>node-word: contract violation</div><div>  expected: node?</div><div>  given: #<void></div><div>  context...:</div><div>   /home/dbastos/public_html/rkt/functions.rkt:974:0: create-bst-word</div>


<div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div><div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div><div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div>


<div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div><div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div></div><div><div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div>


<div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div><div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div><div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div>


<div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div><div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div><div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div>


<div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list</div><div>   /home/dbastos/public_html/rkt/functions.rkt:987:0: create-bst-word-from-list...</div><div><br></div><div>></div></div><div>


<br></div><div>It seems node-word says I gave it a #<void>. Perhaps my list of words contains a #<void>, but when I search for it, I do not find it.<br></div><div><br></div><div>> (define ls (read-words))<br>

</div><div><div>> (length ls)</div><div>22064</div></div><div><div>> (length (filter string? ls))</div><div>22064</div></div><div>> (filter void? ls)<br></div><div><div>()</div></div><div><div><br></div></div><div>

So I'm perplexed.</div><div><br></div><div>(define-struct node (word left right))<br></div><div><br></div><div><div>(define (create-bst-word bst str)</div><div>  (cond</div><div>   ((false? bst)</div><div>    (make-node str false false))</div>

<div>   ((string<? str (node-word bst)) ;; insert at the left</div>
<div>    (make-node (node-word bst)</div><div>               (create-bst-word (node-left bst) str)</div><div>               (node-right bst)))</div><div>   ((string>? str (node-word bst)) ;; insert at the right</div><div>


    (make-node (node-word bst)</div><div>               (node-left bst)</div><div>               (create-bst-word (node-right bst) str)))))</div><div><br></div><div>(define (create-bst-word-from-list ls)</div><div>  (cond</div>


<div>   ((empty? ls) false)</div><div>   (else</div><div>     (create-bst-word (create-bst-word-from-list (rest ls)) (first ls)))))</div></div><div><br></div><div><div>(define (read-lines in)</div><div>  (let* ((ln (read-line in)))</div>

<div>    (cond</div><div>     ((eof-object? ln) empty)</div><div>     (else (cons ln (read-lines in))))))</div><div><br></div><div>(define (read-words)</div><div>  (call-with-input-file "words" read-lines))</div>

</div><div><br></div><div>Thank you in advance for any information.<br></div></div></div></div>