private EvaluatableNode createEvaluatableNode(Node node){
		if(node instanceof NumberNode){
			return new ConstantNode(((NumberNode)node).getValue());
		}
		if(node instanceof ListNode){
			if(((ListNode)node).isListLiteral()){
				return new AstNode((ListNode)node);
			}
			List<Node> nodes = ((ListNode)node).getNodes();
			if(nodes.isEmpty()){
				return new ConstantNode(0);
			}
			Node firstNode = nodes.get(0);
			if(firstNode instanceof SymbolNode){
				String name = ((SymbolNode)firstNode).getSymbol();
				ArrayList<EvaluatableNode> parameters = new ArrayList<>();
				for(int i = 1; i < nodes.size(); ++i){
					parameters.add(this.createEvaluatableNode(nodes.get(i)));
				}
				return new CallNode(name, parameters);
			}
			BlockNode block = new BlockNode();
			for(Node nodeInBlock : nodes){
				block.addNode(this.createEvaluatableNode(nodeInBlock));
			}
			return block;
		}
		if(node instanceof SymbolNode){
			String name = ((SymbolNode)node).getSymbol();
			int index = this.getParameterIndex(name);
			if(index != -1){
				return new ParameterNode(index);
			}
			return new VariableNode(name);
		}
		throw new RuntimeException("unknown ast: " + node);
	}