/* Copyright (c) 2016 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #pragma once #include "kernel/expr.h" #include "library/vm/vm.h" namespace lean { list to_list_name(vm_obj const & o); /* Given an object o : list name, store its contents at \c r */ void to_buffer_name(vm_obj const & o, buffer & r); vm_obj to_obj(buffer const & ls); vm_obj to_obj(list const & ls); list to_list_level(vm_obj const & o); /* Given an object o : list level, store its contents at \c r */ void to_buffer_level(vm_obj const & o, buffer & r); vm_obj to_obj(buffer const & ls); vm_obj to_obj(list const & ls); list to_list_expr(vm_obj const & o); /* Given an object o : list expr, store its contents at \c r */ void to_buffer_expr(vm_obj const & o, buffer & r); vm_obj to_obj(buffer const & ls); vm_obj to_obj(list const & ls); template vm_obj to_vm_list(list const & ls, F const & fn) { if (empty(ls)) return mk_vm_simple(0); else return mk_vm_constructor(1, fn(head(ls)), to_vm_list(tail(ls), fn)); } vm_obj to_obj(list const & ls); /* Helper functions for accessing (list A) when A is not expr, name nor level */ inline bool is_nil(vm_obj const & o) { return is_simple(o); } inline vm_obj head(vm_obj const & o) { lean_assert(!is_nil(o)); return cfield(o, 0); } inline vm_obj tail(vm_obj const & o) { lean_assert(!is_nil(o)); return cfield(o, 1); } template list to_list(vm_obj const & o, F const & fn) { if (is_simple(o)) { return list(); } else if (is_constructor(o)) { return list(fn(cfield(o, 0)), to_list(cfield(o, 1), fn)); } else { lean_unreachable(); } } void initialize_vm_list(); void finalize_vm_list(); }