Muhmmad Kuti
Muhmmad Kuti

Reputation: 105

Break loop and return in Racket Scheme

I'm trying to find the first missing key in a hash table, that should contain keys [1 ... N], using Scheme.

So far, I have the following code:

(define (find-missing n ht)
  (define c 1)

  (let forVertices ()
    (cond (not (hash-has-key? ht c))
      (c)
    )

    (set! c (+ c 1))
    (when (>= n c) (forVertices))
  )
)

When I execute the function to test it, nothing is returned. What am I doing wrong?

Upvotes: 1

Views: 2545

Answers (1)

Óscar López
Óscar López

Reputation: 235994

You have a couple of problems with the parentheses, and the else case is missing. This should fix the mistakes:

(define (find-missing n ht)
  (define c 1)
  (let forVertices ()
    (cond ((not (hash-has-key? ht c))
           c)
          (else
           (set! c (+ c 1))
           (when (>= n c)
             (forVertices))))))

… But you should be aware that the way you wrote the procedure is not idiomatic, at all. In general, in Scheme you should avoid mutating state (the set! operation), you can write an equivalent procedure by correctly setting up the recursion and passing the right parameters. Also, it's a good idea to return something whenever the recursion exits (for instance: #f), otherwise your procedure will return #<void> if there are no keys missing. Here, this is what I mean:

(define (find-missing n ht)
  (let forVertices ((c 1))
    (cond ((> c n) #f)
          ((not (hash-has-key? ht c)) c)
          (else (forVertices (+ c 1))))))

Upvotes: 3

Related Questions