; What color is your function? ; Impure functions are functions that can call both pure and impure functions. ; Pure functions can only call pure functions. ; Impure function names end in an exclamation mark (!) by convention. ; The top-level context is impure but has special rules ; related to `import`, `let`, and other builtins. ; this is a pure function (let f (\[x] x)) (f 10) ; works ; this is an impure function (let g! (\![x] (println! x))) (g! "foo") ; works ; this is a pure function that tries to call an impure function (let h (\[x] (g! x))) (h "bar") ; error: cannot call impure function in pure context ; when calling function g! at examples/purity-test.milch:19:15 ; in a function definition at examples/purity-test.milch:19:12 ; when calling function h at examples/purity-test.milch:21:1