Codetree Example: nfib - Spicery/Nutmeg GitHub Wiki

nfib

This is a variation of a Fibonacci function that has the elegant property that (without optimisation) it returns the number of function calls made.

Nutmeg:

def nfib( n ):
    if n <= 1:
        1
    else:
        1 + nfib(n - 1) + nfib(n - 2)
    end
end

JSON:

{
    "comment": "An example function 'nfib'",
    "kind": "binding",
    "lhs": {
        "kind": "id",
        "name": "nfib",
        "reftype": "var"
    },
    "rhs": {
        "kind": "lambda",
        "parameters": {
            "kind": "id",
            "name": "n",
            "reftype": "var"
        },
        "body": {
            "kind": "if",
            "test": {
                "kind": "syscall",
                "name": "<=",
                "arguments": {
                    "kind": "seq",
                    "body": [
                        {
                            "kind": "id",
                            "name": "n",
                            "reftype": "get"
                        },
                        {
                            "kind": "int",
                            "value": "1"
                        }
                    ]
                }
            },
            "then": {
                "kind": "int",
                "value": "1"
            },
            "else": {
                "kind": "syscall",
                "name": "+",
                "arguments": {
                    "kind": "seq",
                    "body": [
                        {
                            "kind": "int",
                            "value": "1"
                        },
                        {
                            "kind": "call",
                            "function": {
                                "kind": "id",
                                "name": "nfib",
                                "reftype": "get"
                            },
                            "arguments": {
                                "kind": "seq",
                                "body": [
                                    {
                                        "kind": "syscall",
                                        "name": "-",
                                        "arguments": {
                                            "kind": "seq",
                                            "body": [
                                                {
                                                    "kind": "id",
                                                    "name": "n",
                                                    "reftype": "get"
                                                },
                                                {
                                                    "kind": "int",
                                                    "value": "1"
                                                }
                                            ]
                                        }
                                    }
                                ]
                            }
                        },
                        {
                            "kind": "call",
                            "function": {
                                "kind": "id",
                                "name": "nfib",
                                "reftype": "get"
                            },
                            "arguments": {
                                "kind": "syscall",
                                "name": "-",
                                "arguments": {
                                    "kind": "seq",
                                    "body": [
                                        {
                                            "kind": "id",
                                            "name": "n",
                                            "reftype": "get"
                                        },
                                        {
                                            "kind": "int",
                                            "value": "2"
                                        }
                                    ]
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}