user6825883
user6825883

Reputation: 79

Scheme - difference between if and or

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

Answers (1)

&#211;scar L&#243;pez
&#211;scar L&#243;pez

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

Related Questions