Reputation: 79
does somebody know what the difference between if and or in Scheme is or why I can't use if to replace or as an identifier? I posted some code below. Thank's!
;if definition
(define heiner-or
(lambda (test-1 test-2)
(if test-1
#t
test-2)))
;or definition
> (heiner-or (= 10 10) (> 2 5))
#t
> (heiner-or (> 23 42) (< 5 2))
#f
Upvotes: 1
Views: 91
Reputation: 236114
Take a look at the documentation for if
and or
. if
is used for testing a condition and executing only one of two possible values - if the condition is true
the first part will get executed, if it's false
the second part will get executed:
(if (= 1 0)
"not executed"
"executed")
=> "executed"
or
is a logical connector that can receive multiple arguments, it'll return the first non-false value it finds, or false
if all values are false. Typically you'd use or
to connect boolean expressions, but that's not always the case:
(or #f 7 10)
=> 7
(or (= 1 0) (= 1 2))
=> #f
Also bear in mind that in Scheme all values are considered true
, except #f
, which is false
. Regarding the last part of your question: yes, you can use if
to simulate an or
, it would be something like this:
; equivalent to (or value1 value2)
(if value1
value1
value2)
The above is a simplification, because ideally we should evaluate value1
exactly once, and also because this version doesn't support multiple arguments. But beware: the moment you try to write it as a procedure you'll run into trouble!
(define (my-or value1 value2)
(if value1
value1
value2))
That will not work as an or
, the procedure evaluates both arguments before evaluating the if
, whereas a real or
only evaluates the needed expressions until it finds a true
value - that's what we call short-circuit evaluation. To see what I mean, try this:
(or 42 (/ 1 0))
=> 42
(my-or 42 (/ 1 0))
=> /: division by zero
We can't truly implement or
, if
as procedures, they're special forms and need to be implemented at the interpreter level, with special evaluation rules.
Upvotes: 2