fn lambda(
        &mut self,
        pattern: Spanned<Pattern<SharedSymbol>>,
        expression: Spanned<CST>,
    ) -> Result<SST, Syntax> {
        self.enter_scope();
        let arg = self.walk_pattern(pattern, true);
        let body = Box::new(self.walk(expression)?);
        let scope = self.exit_scope().unwrap();

        return Ok(SST::ScopedLambda(ScopedLambda { arg, body, scope }));
    }
Walks a function definition.
Like `assign`, delegates to `walk_pattern` for
capturing. But any paramaters will shadow those
in outer scopes.
passerine/src/compiler/hoist.rs