whole_func_string: function getNode(ast, path) {
    if (path.length) {
      if (ast.tag === MAP_TAG) {
        let value = ast.value;
        for (let i = 0; i < value.length; ++i) {
          let [keyNode, valNode] = value[i];
          if (path[0] === keyNode.value) {
            return getNode(valNode, path.slice(1));
          }
        }
        return undefined;
      } else if (ast.tag === SEQ_TAG) {
        return ast.value[path[0]] && getNode(ast.value[path[0]], path.slice(1));
      }
    }
    return ast;
  }
func_code_string: function getNode(ast, path) {
    if (path.length) {
      if (ast.tag === MAP_TAG) {
        let value = ast.value;
        for (let i = 0; i < value.length; ++i) {
          let [keyNode, valNode] = value[i];
          if (path[0] === keyNode.value) {
            return getNode(valNode, path.slice(1));
          }
        }
        return undefined;
      } else if (ast.tag === SEQ_TAG) {
        return ast.value[path[0]] && getNode(ast.value[path[0]], path.slice(1));
      }
    }
    return ast;
  }
func_documentation_string: /*
  Gets node of an AST which path
  
  @param {Node} ast
  @param {array} path
  
  @returns {Node}