=== modified file 'pmt/src/lib/pmt.cc' --- pmt/src/lib/pmt.cc 2009-01-30 14:37:30 +0000 +++ pmt/src/lib/pmt.cc 2009-01-30 14:40:12 +0000 @@ -219,7 +219,7 @@ } bool -pmt_is_symbol(pmt_t obj) +pmt_is_symbol(const pmt_t& obj) { return obj->is_symbol(); } @@ -250,7 +250,7 @@ } const std::string -pmt_symbol_to_string(pmt_t sym) +pmt_symbol_to_string(const pmt_t& sym) { if (!sym->is_symbol()) throw pmt_wrong_type("pmt_symbol_to_string", sym); @@ -364,28 +364,28 @@ //////////////////////////////////////////////////////////////////////////// pmt_null::pmt_null() {} -pmt_pair::pmt_pair(pmt_t car, pmt_t cdr) : d_car(car), d_cdr(cdr) {} +pmt_pair::pmt_pair(const pmt_t& car, const pmt_t& cdr) : d_car(car), d_cdr(cdr) {} bool -pmt_is_null(pmt_t x) +pmt_is_null(const pmt_t& x) { return x == PMT_NIL; } bool -pmt_is_pair(pmt_t obj) +pmt_is_pair(const pmt_t& obj) { return obj->is_pair(); } pmt_t -pmt_cons(pmt_t x, pmt_t y) +pmt_cons(const pmt_t& x, const pmt_t& y) { return pmt_t(new pmt_pair(x, y)); } pmt_t -pmt_car(pmt_t pair) +pmt_car(const pmt_t& pair) { pmt_pair* p = dynamic_cast(pair.get()); if ( p ) @@ -395,7 +395,7 @@ } pmt_t -pmt_cdr(pmt_t pair) +pmt_cdr(const pmt_t& pair) { pmt_pair* p = dynamic_cast(pair.get()); if ( p ) @@ -681,13 +681,13 @@ //////////////////////////////////////////////////////////////////////////// bool -pmt_eq(pmt_t x, pmt_t y) +pmt_eq(const pmt_t& x, const pmt_t& y) { return x == y; } bool -pmt_eqv(pmt_t x, pmt_t y) +pmt_eqv(const pmt_t& x, const pmt_t& y) { if (x == y) return true; @@ -705,7 +705,7 @@ } bool -pmt_equal(pmt_t x, pmt_t y) +pmt_equal(const pmt_t& x, const pmt_t& y) { if (pmt_eqv(x, y)) return true; @@ -747,7 +747,7 @@ } size_t -pmt_length(pmt_t x) +pmt_length(const pmt_t& x) { if (x->is_vector()) return _vector(x)->length(); @@ -755,13 +755,16 @@ if (x->is_uniform_vector()) return _uniform_vector(x)->length(); - if (x->is_pair() || x->is_null()) { - size_t length=0; - while (pmt_is_pair(x)){ + if (x->is_null()) return 0; + + if (x->is_pair()) { + size_t length=1; + pmt_t it = pmt_cdr(x); + while (pmt_is_pair(it)){ length++; - x = pmt_cdr(x); + it = pmt_cdr(it); } - if (pmt_is_null(x)) + if (pmt_is_null(it)) return length; // not a proper list @@ -822,7 +825,7 @@ } pmt_t -pmt_map(pmt_t proc(pmt_t), pmt_t list) +pmt_map(pmt_t proc(const pmt_t&), pmt_t list) { pmt_t r = PMT_NIL; === modified file 'pmt/src/lib/pmt.h' --- pmt/src/lib/pmt.h 2008-06-26 17:17:15 +0000 +++ pmt/src/lib/pmt.h 2009-01-30 14:40:12 +0000 @@ -109,7 +109,7 @@ */ //! Return true if obj is a symbol, else false. -bool pmt_is_symbol(pmt_t obj); +bool pmt_is_symbol(const pmt_t& obj); //! Return the symbol whose name is \p s. pmt_t pmt_string_to_symbol(const std::string &s); @@ -122,7 +122,7 @@ * If \p is a symbol, return the name of the symbol as a string. * Otherwise, raise the wrong_type exception. */ -const std::string pmt_symbol_to_string(pmt_t sym); +const std::string pmt_symbol_to_string(const pmt_t& sym); /* * ------------------------------------------------------------------------ @@ -206,19 +206,19 @@ extern const pmt_t PMT_NIL; //< the empty list //! Return true if \p x is the empty list, otherwise return false. -bool pmt_is_null(pmt_t x); +bool pmt_is_null(const pmt_t& x); //! Return true if \p obj is a pair, else false. -bool pmt_is_pair(pmt_t obj); +bool pmt_is_pair(const pmt_t& obj); //! Return a newly allocated pair whose car is \p x and whose cdr is \p y. -pmt_t pmt_cons(pmt_t x, pmt_t y); +pmt_t pmt_cons(const pmt_t& x, const pmt_t& y); //! If \p pair is a pair, return the car of the \p pair, otherwise raise wrong_type. -pmt_t pmt_car(pmt_t pair); +pmt_t pmt_car(const pmt_t& pair); //! If \p pair is a pair, return the cdr of the \p pair, otherwise raise wrong_type. -pmt_t pmt_cdr(pmt_t pair); +pmt_t pmt_cdr(const pmt_t& pair); //! Stores \p value in the car field of \p pair. void pmt_set_car(pmt_t pair, pmt_t value); @@ -449,7 +449,7 @@ */ //! Return true if x and y are the same object; otherwise return false. -bool pmt_eq(pmt_t x, pmt_t y); +bool pmt_eq(const pmt_t& x, const pmt_t& y); /*! * \brief Return true if x and y should normally be regarded as the same object, else false. @@ -464,7 +464,7 @@ * x and y are pairs or vectors that denote same location in store. * */ -bool pmt_eqv(pmt_t x, pmt_t y); +bool pmt_eqv(const pmt_t& x, const pmt_t& y); /*! * pmt_equal recursively compares the contents of pairs and vectors, @@ -472,11 +472,11 @@ * pmt_equal may fail to terminate if its arguments are circular data * structures. */ -bool pmt_equal(pmt_t x, pmt_t y); +bool pmt_equal(const pmt_t& x, const pmt_t& y); //! Return the number of elements in v -size_t pmt_length(pmt_t v); +size_t pmt_length(const pmt_t& v); /*! * \brief Find the first pair in \p alist whose car field is \p obj @@ -515,7 +515,7 @@ * \p list must be a list. The dynamic order in which \p proc is * applied to the elements of \p list is unspecified. */ -pmt_t pmt_map(pmt_t proc(pmt_t), pmt_t list); +pmt_t pmt_map(pmt_t proc(const pmt_t&), pmt_t list); /*! * \brief reverse \p list. === modified file 'pmt/src/lib/pmt_int.h' --- pmt/src/lib/pmt_int.h 2008-06-26 17:17:15 +0000 +++ pmt/src/lib/pmt_int.h 2009-01-30 14:40:12 +0000 @@ -151,7 +151,7 @@ pmt_t d_cdr; public: - pmt_pair(pmt_t car, pmt_t cdr); + pmt_pair(const pmt_t& car, const pmt_t& cdr); //~pmt_pair(){}; bool is_pair() const { return true; }