56 lines
1.9 KiB
C++
56 lines
1.9 KiB
C++
/*
|
|
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<name> 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<name> & r);
|
|
vm_obj to_obj(buffer<name> const & ls);
|
|
vm_obj to_obj(list<name> const & ls);
|
|
|
|
list<level> 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<level> & r);
|
|
vm_obj to_obj(buffer<level> const & ls);
|
|
vm_obj to_obj(list<level> const & ls);
|
|
|
|
list<expr> 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<expr> & r);
|
|
vm_obj to_obj(buffer<expr> const & ls);
|
|
vm_obj to_obj(list<expr> const & ls);
|
|
|
|
template<typename A, typename F>
|
|
vm_obj to_vm_list(list<A> 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<unsigned> 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<typename A, typename F>
|
|
list<A> to_list(vm_obj const & o, F const & fn) {
|
|
if (is_simple(o)) {
|
|
return list<A>();
|
|
} else if (is_constructor(o)) {
|
|
return list<A>(fn(cfield(o, 0)), to_list<A>(cfield(o, 1), fn));
|
|
} else {
|
|
lean_unreachable();
|
|
}
|
|
}
|
|
|
|
void initialize_vm_list();
|
|
void finalize_vm_list();
|
|
}
|