Hello, and thank you for helping me today! I am working on a scheme procedure that takes a string as its input, capitalizes every letter in the string, and then prints out the result. This is a homework assignment, and we are supposed to use another procedure that we wrote earlier on, which capitalizes a single character entered by the user. This procedure, which I wrote and which works fine, is included at the top of my current procedure. Right now, I have the following:

; defining the procedure char_toupper to convert a lower case character to upper case
(define char_toupper (lambda (myChar)
                       ; defining x as the ASCII value of myChar
                       (define x (char->integer myChar))
                       ; defining y as x-32
                       (define y (- x 32))
                       ; if statement for while x is less than 91 (already uppercase)
                       (if (< x 91)
                            ; if it is already uppercase, just display it
                            (display myChar)
                            ; otherwise, if x is greater than 96 (lowercase)
                            (if (> x 96)
                                ; then display the character equivalent to the ASCII value given by y
                                (display (integer->char y))
                            )
                        )
                       )
)

(define string_toupper (lambda (myString newString i)       
                         (if (< i (string-length myString))
                             (string_toupper myString (string-append newString (char_toupper (string-ref myString i))) (+ 1 i))
                         )
                         
                         (display newString)
                       )
)

(string_toupper (read) "" 0)

But it is not working. I get an error when I run the procedure, which says this: "string-append: expects type <string> as 2nd argument, given: #<void>; other arguments were: """

What am I doing wrong here? Can someone help me with this?

Thank you in advance!

But it is not working. I get an error when I run the procedure, which says this: "string-append: expects type <string> as 2nd argument, given: #<void>; other arguments were: """

What am I doing wrong here?

The issue is that your char_toupper function actually returns void... In fact, the display function (display <>) has no return value. That is, (void? (display "a")) returns #t...

But you are using your char_toupper function as though it were returning an upper case character. If you want to use it like this, then you should modify it so that it actually returns the uppercase character to be used in string-append. Alternatively, you could modify your string_toupper function so that it does not require a result from char_toupper. That is, simply output the uppercase characters one character at a time (as your char_toupper currently does), and do not construct an entirely new string of uppercase characters... This would actually be faster since you would not require string-append, which takes O(n) time (although may not be the purpose of the assignment... it depends on whether or not your string_toupper need return a value...)

Hope that makes sense!

Edited 7 Years Ago by n1337: n/a

The issue is that your char_toupper function actually returns void... In fact, the display function (display <>) has no return value. That is, (void? (display "a")) returns #t...

But you are using your char_toupper function as though it were returning an upper case character. If you want to use it like this, then you should modify it so that it actually returns the uppercase character to be used in string-append. Alternatively, you could modify your string_toupper function so that it does not require a result from char_toupper. That is, simply output the uppercase characters one character at a time (as your char_toupper currently does), and do not construct an entirely new string of uppercase characters... This would actually be faster since you would not require string-append, which takes O(n) time (although may not be the purpose of the assignment... it depends on whether or not your string_toupper need return a value...)

Hope that makes sense!

Oh, okay...duh! That makes sense. I hadn't thought about having to change the char_toupper procedure at all, but of course that makes total sense. I do have to use it in the string_toupper procedure, so unfortunately I can't use your idea about just writing the conversion into the string_toupper procedure. Thank you for suggesting it, though!

My procedure now works well, and is ready to go, I think!! Thank you very much for the help, n1337!! I greatly appreciate it.

This question has already been answered. Start a new discussion instead.