anchor.diff:      endif ;;
   drop
   
  -MalList
  -  extend mal-eval { env list -- val }
  -    env list MalList/start @ @ mal-eval
  -    env list rot invoke+ ;;
  -
  -  extend mal-eval-ast { env list -- list }
  +: mal-eval-ast { env list -- list }
       here
       list MalList/start @ { expr-start }
       list MalList/count @ 0 ?do
           env expr-start i cells + @ mal-eval ,
       loop
  -    here>MalList ;;
  +    here>MalList ;
  +
  +MalList
  +  extend mal-eval { env list -- val }
  +    env list MalList/start @ @ mal-eval
  +    env list rot invoke ;;
   drop
   
   MalVector
  
positive.code: s" *" MalSymbol.  :noname args-as-native * MalInt. ; MalFn.  repl-env env/set
  s" /" MalSymbol.  :noname args-as-native / MalInt. ; MalFn.  repl-env env/set
  
  def-protocol-method mal-eval ( env ast -- val )
  def-protocol-method mal-eval-ast ( env ast -- val )
  def-protocol-method invoke+ ( env arty -- ... )
  def-protocol-method invoke ( argv argc mal-fn -- ... )
  
  MalDefault extend mal-eval nip ;; drop
  
  MalKeyword
    extend invoke { argv argc kw -- val }
      argc 1 > if argv cell+ @ else mal-nil endif \ not-found
      kw \ key
      argv @ \ map
      get ;;
  drop
  
  MalFn
    extend invoke ( ... mal-fn -- ... )
      MalFn/xt @ execute ;;
  
    extend invoke+ { env list this -- list }
      \ Pass args on dictionary stack (!)
      \ TODO: consider allocate and free of a real MalList instead
      \ Normal list, evaluate and invoke
  
negative.code:         env expr-start i cells + @ mal-eval ,
      loop
      val-start  here val-start - cell /  this  ( argv argc MalFn )
      MalFn/xt @ execute
      val-start here - allot ;;
  drop
  
  SpecialOp
    extend invoke ( env list this -- list )
      SpecialOp/xt @ execute ;;
  drop
  
  