> For the complete documentation index, see [llms.txt](https://bootcamp.openguild.wtf/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bootcamp.openguild.wtf/smart-contract-development/advanced-solidity/expression-and-control-structures.md).

# Expression and Control Structures

### Supported keywords

There is: `if`, `else`, `while`, `do`, `for`, `break`, `continue`, `return`, `try`/`catch` with the usual semantics known from C or JavaScript.

### Function Calls

We can call `function` of 1 `contract` from another `contract`. We have an example below with 2 contracts `Caller` and `Callee`.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract Callee {
    uint public x;
    uint public value;

    function setX(uint _x) public returns (uint) {
        x = _x;
        return x;
    }

    function setXandSendEther(uint _x) public payable returns (uint, uint) {
        x = _x;
        value = msg.value;

        return (x, value);
    }
}

contract Caller {
    function setX(Callee _callee, uint _x) public returns (uint) {
        uint x = _callee.setX(_x);
        return x;
    }

    function setXFromAddress(address _addr, uint _x) public {
        Callee callee = Callee(_addr);
        callee.setX(_x);
    }

    function setXandSendEther(Callee _callee, uint _x) public payable returns (uint, uint) {
        (uint x, uint value) = _callee.setXandSendEther{value: msg.value}(_x);
        return (x, value);
    }
}
```

### Create new contract with keyword `new`

We can use keyword `new` to create a new contract. `AdvancedStorage.sol` example will explain this in more details.
