True / false evaluation doesn't work as expected in Scheme
Posted
by
ron
on Stack Overflow
See other posts from Stack Overflow
or by ron
Published on 2012-12-15T16:23:11Z
Indexed on
2012/12/15
17:03 UTC
Read the original article
Hit count: 196
I'm trying to compare two booleans :
(if (equal? #f (string->number "123b"))
"not a number"
"indeed a number")
When I run this in the command line of DrRacket I get "not a number"
, however , when I
put that piece of code in my larger code , the function doesn't return that string ("not a number"
) , here's the code :
(define (testing x y z)
(define badInput "ERROR")
(if (equal? #f (string->number "123b"))
"not a number"
"indeed a number")
(display x))
And from command line : (testing "123" 1 2)
displays : 123
Why ?
Furthermore , how can I return a value , whenever I choose ?
Here is my "real" problem :
I want to do some input check to the input of the user , but the thing is , that I want to return the error message if I need , before the code is executed , because if won't - then I would run the algorithm of my code for some incorrect input :
(define (convert originalNumber s_oldBase s_newBase)
(define badInput "ERROR")
; Input check - if one of the inputs is not a number then return ERROR
(if (equal? #f (string->number originalNumber))
badInput)
(if (equal? #f (string->number s_oldBase))
badInput)
(if (equal? #f (string->number s_newBase))
badInput)
(define oldBase (string->number s_oldBase))
(define newBase (string->number s_newBase))
(define outDecimal (convertIntoDecimal originalNumber oldBase))
(define result "") ; holds the new number
(define remainder 0) ; remainder for each iteration
(define whole 0) ; the whole number after dividing
(define temp 0)
(do()
((= outDecimal 0)) ; stop when the decimal value reaches 0
(set! whole (quotient outDecimal newBase)) ; calc the whole number
(set! temp (* whole newBase))
(set! remainder (- outDecimal temp)) ; calc the remainder
(set! result (appending result remainder)) ; append the result
(set! outDecimal (+ whole 0)) ; set outDecimal = whole
) ; end of do
(if (> 1 0)
(string->number (list->string(reverse (string->list result)))))
) ;end of method
This code won't work since it uses another method that I didn't attach to the post (but it's irrelevant to the problem . Please take a look at those three IF
-s ... I want to return "ERROR" if the user put some incorrect value , for example (convert "23asb4" "b5" "9")
Thanks
© Stack Overflow or respective owner