Christopher Mayer
Christopher Mayer

Reputation: 11

Returning smallest item in a list in Scheme

Note: I am doing this for homework. I'm not looking for the algorithm to solve my problem, just trying to understand how Scheme works.

I'm new to scheme and trying to write a small program to find the smallest item in a list. The program is working in the since that it is finding the correct answer (so the logic is somewhat sound), but I only know this because an error is coming up that it's trying to treat my answer as a function and call it.

(DEFINE (startmin mylist)
(

    (repeatmin (CAR mylist) (CDR mylist))


))


(DEFINE (repeatmin curmin mylist)
(

    (IF (NULL? mylist) ;If the list is empty

        ;This is where I'm at a loss. I want a way for this value to be
        ;sent out once the list is empty
        curmin ;return the current minimum

        (IF (< curmin (CAR mylist)) ;if the current minimum is less than the head of the list
            (repeatmin curmin (CDR mylist)) ;recurse with curmin
            (repeatmin (CAR mylist) (CDR mylist)) ;otherwise recurse with the head of the list.
        )
    )
))

I'm really at a loss of how I get the value, once found, back out of the recursion as it keeps trying to treat the value as a function.

Upvotes: 0

Views: 53

Answers (1)

Sylwester
Sylwester

Reputation: 48745

Your parentheses are off. If you write

((if ...))

it means that the result from if is a function that immediately should be called once the value is cmoputed. It seems like you are using parentheses as if they are blocks, like {} in C, but they are not. In fact (begin ...) is a block in Scheme. And of course a function, let and cond terms have implicit begin.. Thus

(define (func . args)
  (begin 
    x
    y))

Is the same as

(define (func . args)
  x
  y)

Also please format your code correctly. Indentation helps you read the code and the nesting. I really don't pay attention to the parentheses, just the position which is crucial. Choose an editor that does this for you. Eg. DrRacket is a nice one I use.

Upvotes: 2

Related Questions