code: function lisp_compiler(l, need_return, eval_$, is_recur, print_eval_result$) {
          var o = "";
          var result;
          var need_return_string = false;
          while (l !== null) {
              if (need_return && l.rest === null){
                  need_return_string = true; // need add return string.
              }
              result = compiler(l.first, l.rest === null? true : false, is_recur, need_return_string);
              if(typeof(result) === "string") result = result.trim();
              if (typeof(result) === "string" && result.length !== 0 && result[result.length - 1] !== ";" /*&& result[result.length - 1] !== "}"*/){
                  result += ";";
              }
              if(eval_$){    // eval
                  if(node_environment)
                      try{
                          eval_result = vm.runInContext(result, global_context, "lisp.vm");
                          if(print_eval_result$){
                              console.log(eval_result);
                          }
                      }
                      catch(e){
                          return error(e);
                      }
                  else{
                      try{
                          eval_result = window.eval(result);
                          if(print_eval_result$){
                              console.log(eval_result);
                          }
                      }
                      catch(e){
                          return error(e);
                      }
                  }
              }
              o += result;
              l = l.rest;
          }
          return o;
      }
docs: l: the expressions
  need_return: need "return " keyword
  eval_$:  whether eval or not
  is_recur: recur object
  print_eval_result$: whether print eval result or not