   (isSimpleTranslated result) or (Array.isArray result) and (isSimpleTranslated result[0])
 
 isSimpleTranslated = (result) ->
-  result.js or result.ir
+  result.js or result.ir or result.precs or result.assigns
 
 callUnknownCompile = (ctx, call) ->
   callUnknownTranslate ctx, (operatorCompile ctx, call), call

    boolType
    numType
    jsType
  ]

builtInDefinitions = ->

  [res] = _arguments call
  # call.tea = toConstrained typeConstant 'Exp'
  # assignCompile ctx, call, res

  if ctx.assignTo()

    matchAst = (ast) ->
      matched = ctx.assignTo()
      if isForm ast
        if (_operator ast)?.symbol is ','
          termCompile ctx, ast
        else
          combinePatterns (for term, i in _terms ast
            ctx.setAssignTo (jsAccess (jsCall "_terms", [matched]), i)
            precs = matchAst term
            ctx.resetAssignTo()
            precs)
      else
        precs: [(cond_ (jsBinary "===",
            (jsAccess matched, "symbol"), toJsString ast.symbol))]

    matchAst res
  else
    call.tea = toConstrained expressionType

    serializeAst = (ast) ->
      if isForm ast
        if (_operator ast)?.symbol is ','
          termCompile ctx, ast
        else
          (jsArray (map serializeAst, ast))
      else
        (jsValue (JSON.stringify ast))
    serializeAst res

ms[','] = ms_comma = (ctx, call) ->
  [res] = (_arguments call)
  if matched = ctx.assignTo()
    expressionCompile ctx, res
  else
    (jsCall 'constantToSource', [expressionCompile ctx, res])

constantToSource = (value) ->
  switch typeof value
