# How to do AND and OR in Io

The question came up recently in class: How would we do logical AND and OR in Io? The following is an answer, but it requires that Io do Currying (we'll see Currying officially when we study ML).

```1.  define OR: -> cond1 cond2 Y N;
2.   cond1 Y (cond2 Y N) .

3.  define AND: -> cond1 cond2 Y N;
4.   cond1 (cond2 Y N) N .

5.  -- sample usage
6.  OR (= 3 5) (> 7 3) (write 1; terminate) (write 0; terminate)
7.   -- expected output: 1
```
The parentheses are used to group tokens into a single parameter. When we invoke OR in line 6, we get the following bindings of actuals to formals:
 actual formal = 3 5 cond1 > 7 3 cond2 write 1; terminate Y write 0; terminate N
The OR function executes line 2, invoking `cond1` on two parameters. Here is where the Currying comes in. The formal `cond1` is bound to the actual `= 3 5` which is a call to the `=` function with two parameters. But that function expects four parameters. We have Curried two of them and left the other two for line 2 to fill in. The intended effect is that we call `=` with four parameters, as if it had said
```= 3 5 Y (cond2 Y N)
```
or, expanding all formal parameters to show the actuals,
```= 3 5 (write 1; terminate) (> 7 3 (write 1; terminate)
(write 0; terminate))
```
This call is precisely what we would want the OR to mean. AND works similarly.