5 #include "primitive_util.h"
6 #include "primitive_class.h"
8 #include "data_castor.h"
10 using namespace utakata;
11 using namespace utakata::interpreter;
13 IObject* interpreter::util::makeCons(const data::Object& car,
14 const data::Object& cdr)
16 return new interpreter::primitive::Cons(car, cdr);
19 IObject* interpreter::util::makeNil()
21 return new interpreter::primitive::Nil();
24 IObject* interpreter::util::makeString(const smart_ptr<unicode::UniString>& data)
26 return new interpreter::primitive::String();
29 IObject* interpreter::util::makeCharactor(const smart_ptr<unicode::UniChar>& data)
31 return new interpreter::primitive::Charactor();
34 IObject* interpreter::util::makeNumber(const smart_ptr<unicode::UniString>& real,
35 const smart_ptr<unicode::UniString>& imagin,
36 bool exact, int radix)
38 return new interpreter::primitive::Number(real, imagin, exact, radix);
41 IObject* interpreter::util::makeBoolean(bool b)
43 return new interpreter::primitive::Boolean(b);
46 IObject* interpreter::util::makeSymbol(const smart_ptr<unicode::UniString>& data)
48 return new interpreter::primitive::Symbol(data);
51 IObject* interpreter::util::makeByteVector(const std::vector<data::Object>& vec)
53 return new interpreter::primitive::ByteVector(vec);
56 IObject* interpreter::util::makeVector(const std::vector<data::Object>& vec)
58 return new interpreter::primitive::Vector(vec);
61 void interpreter::util::concat(data::Object& c, const data::Object& dat)
63 // Consオブジェクトであるcの末尾に、datを追加する。
65 // cがconsでは無い場合、これは成功しない。
66 assert(data::instanceof(c, type::Type(primitive::PrimitiveClass<primitive::Cons>().class_name())) &&
69 primitive::Cons* m = data::DataCastor<primitive::Cons>()(c);
70 if (m->cdr().getSpace().isNull())
72 // 最初期でこうなっていたら、これにはそのまま突っ込むことができる。
77 // Consか、NullObjectに当たるまでループで回す。
78 while (!m->cdr().getSpace().isNull())
82 type::Type(primitive::PrimitiveClass<primitive::Cons>().class_name())))
84 // consで、かつcdrが空かどうかを調べる。
85 m = data::DataCastor<primitive::Cons>()(m->cdr());
90 // Cons以外のオブジェクトがcdrに入っていた場合、これはリストでは
96 // 抜けた時点で末尾であるので、cdrを設定する。
101 data::Object& interpreter::util::getLastCons(data::Object& c)
103 // 渡されたオブジェクトがconsの場合、末尾のConsを返す。
104 // 末尾と判断するポイントは、cdrがnilであるか、cdrがcons以外の場合。
105 // cdrがnilの時点で、リストは終了しているとみなされるため。
107 assert(data::instanceof(c, type::Type(primitive::PrimitiveClass<primitive::Cons>().class_name())) &&
110 primitive::Cons* cons = data::DataCastor<primitive::Cons>()(c);
111 smart_ptr<interpreter::IClass> cclass = cons->getClass();
113 while (data::instanceof(cons->cdr(), type::Type(cclass->class_name())))
115 // consである間、後ろに移動しつづけてみる。
116 cons = data::DataCastor<primitive::Cons>()(cons->cdr());