message: Extract expr_ident function from Compiler
  Summary: `Compiler::expr` is too long and too deeply nested.
diff: @@ -28,7 +28,7 @@ use crate::{
  fragment::known::{list_to_tuple, Conditional},
  runtime::evaluator::Evaluator,
  },
  - syntax::ast::{AstExprP, AstLiteral, AstPayload, BinOp, ExprP, StmtP},
  + syntax::ast::{AstExprP, AstLiteral, AstPayload, AstString, BinOp, ExprP, StmtP},
  values::{
  dict::Dict,
  function::{BoundMethod, NativeAttribute},
  @@ -213,13 +213,13 @@ impl Compiler<'_> {
  Some((attr_type, field))
  }
  - pub fn expr(&mut self, expr: CstExpr) -> ExprCompiledValue {
  - // println!("compile {}", expr.node);
  - let span = expr.span;
  - match expr.node {
  - ExprP::Identifier(ident, resolved_ident) => {
  - let resolved_ident = resolved_ident
  - .unwrap_or_else(|| panic!("variable not resolved: `{}`", ident.node));
  + fn expr_ident(
  + &mut self,
  + ident: AstString,
  + resolved_ident: Option<ResolvedIdent>,
  + ) -> ExprCompiledValue {
  + let resolved_ident =
  + resolved_ident.unwrap_or_else(|| panic!("variable not resolved: `{}`", ident.node));
  let name = ident.node;
  let span = ident.span;
  match resolved_ident {
  @@ -257,6 +257,12 @@ impl Compiler<'_> {
  ResolvedIdent::Global(v) => value!(v),
  }
  }
  +
  + pub fn expr(&mut self, expr: CstExpr) -> ExprCompiledValue {
  + // println!("compile {}", expr.node);
  + let span = expr.span;
  + match expr.node {
  + ExprP::Identifier(ident, resolved_ident) => self.expr_ident(ident, resolved_ident),
  ExprP::Lambda(params, box inner, scope_id) => {
  let suite = Spanned {
  span: expr.span,
  