OSDN Git Service

first commit
[soopy/alpha1.git] / src / Symbol.cpp
1 /*
2  * Programming Language SOOPY
3  *   (Simple Object Oriented Programming sYstem)
4  * 
5  * Copyright (C) 2002 SUZUKI Jun
6  * 
7  * URL: http://sourceforge.jp/projects/soopy/
8  * License: GPL(GNU General Public License)
9  * 
10  * 
11  * $Id: Symbol.cpp,v 1.19 2004/03/21 05:48:06 randy Exp $
12  */
13
14 //
15 // Soopy Symbol Class
16 //
17
18 #include "soopy.h"
19
20 bool SpSymbol::operator==(SpObject& obj)
21 {
22     SpString* p2;
23     SpSymbol* sym = dynamic_cast<SpSymbol*>(&obj);
24     if(sym != NULL){
25 //        return str == sym->str;
26         p2 = (SpString*)sym;
27         if(p2 != NULL){
28             return SpString::operator==(*p2);
29         }
30     }
31     return false;
32 }
33
34 bool SpSymbol::operator<(SpObject& obj)
35 {
36     SpString* p2;
37     SpSymbol* sym = dynamic_cast<SpSymbol*>(&obj);
38     if(sym != NULL){
39         p2 = (SpString*)sym;
40         if(p2 != NULL){
41             return SpString::operator<(obj);
42         }
43     }
44     return SpObject::operator<(obj);
45 }
46
47 SpValue& SpSymbol::eval()
48 {
49     SpValue val = getCurrentNS();
50     SpNameSpace* ns = dynamic_cast<SpNameSpace*>(val.getObject());
51     SpValue key(new SpSymbol(str));
52     //    static SpValue v;
53     SpValue v;
54     v = ns->lookup(key, ns);
55     if(v.isConstructor()){
56         v = v.eval();
57     }
58     //    return v;
59     return SpValueResult(v);
60 }
61
62 SpValue& SpSymbol::toString()
63 {
64     //    static SpValue val;
65     //    val.setNewObject(new SpString(toCStringWithEncoder()));
66     //    return val;
67     return SpObjectResult(new SpString(toCStringWithEncoder()));
68 }
69
70 SpValue& SpSymbol::eq(SpValue&, SpValue& e2)
71 {
72     if(!e2.isSymbol()){
73         throw SpException("type mismatch in ==(Symbol, ...)");
74     }
75     SpSymbol* s = e2.asSymbol();
76     if(str == s->str){
77         return TrueObject;
78     }
79     return FalseObject;
80 }
81
82 /*
83  * Message Handler
84  */
85
86 SpValue& SpSymbol::onMessage(SpValue& rec, SpValue& msg)
87 {
88     return SymbolMsgHandler(rec, msg);
89 }
90
91 // symbol Primitives
92
93
94 // init Message Handler
95 void SpSymbol::init()
96 {
97 }
98
99 /*
100  * pattern match
101  */
102
103 bool SpSymbol::match(SpValue& self, SpValue& val, SpNameSpace* ns)
104 {
105 /*
106     NSVar* var = new NSVar(self);
107     ns->intern(var, val);
108 */
109     ns->internVar(self, val);
110     return true;
111 }
112