{ "schema": "ailang/v0", "name": "closure", "imports": [], "defs": [ { "kind": "fn", "name": "apply", "type": { "k": "fn", "params": [ { "k": "fn", "params": [{ "k": "con", "name": "Int" }], "ret": { "k": "con", "name": "Int" }, "effects": [] }, { "k": "con", "name": "Int" } ], "ret": { "k": "con", "name": "Int" }, "effects": [] }, "params": ["f", "x"], "doc": "apply a fn-of-Int to an Int", "body": { "t": "app", "fn": { "t": "var", "name": "f" }, "args": [{ "t": "var", "name": "x" }] } }, { "kind": "fn", "name": "main", "type": { "k": "fn", "params": [], "ret": { "k": "con", "name": "Unit" }, "effects": ["IO"] }, "params": [], "doc": "captures `n` from the enclosing let, returns 42", "body": { "t": "let", "name": "n", "value": { "t": "lit", "lit": { "kind": "int", "value": 3 } }, "body": { "t": "do", "op": "io/print_int", "args": [ { "t": "app", "fn": { "t": "var", "name": "apply" }, "args": [ { "t": "lam", "params": ["x"], "paramTypes": [{ "k": "con", "name": "Int" }], "retType": { "k": "con", "name": "Int" }, "effects": [], "body": { "t": "app", "fn": { "t": "var", "name": "+" }, "args": [ { "t": "var", "name": "x" }, { "t": "var", "name": "n" } ] } }, { "t": "lit", "lit": { "kind": "int", "value": 39 } } ] } ] } } } ] }