Skip to content

Commit

Permalink
refactoring
Browse files Browse the repository at this point in the history
- move SCClass instance methods
- move SCObject instance methods
- fix duplicated code
- remove unused member
- build v0.0.29
  • Loading branch information
mohayonao committed May 16, 2014
1 parent e785e05 commit 960753e
Show file tree
Hide file tree
Showing 9 changed files with 181 additions and 206 deletions.
133 changes: 62 additions & 71 deletions build/scscript.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
(function(global) {
"use strict";

var sc = { VERSION: "0.0.28" };
var sc = { VERSION: "0.0.29" };

// src/sc/sc.js
(function(sc) {

sc.lang = {};
sc.lang.$SC = {};
sc.libs = {};

function SCScript(fn) {
Expand Down Expand Up @@ -4328,24 +4327,30 @@ var sc = { VERSION: "0.0.28" };
}
};

var buildClass = function(className, constructor) {
var newClass, metaClass;

metaClass = constructor.metaClass;
var registerClass = function(MetaClass, className, constructor) {
var newClass;

newClass = new metaClass._MetaSpec();
newClass = new MetaClass._MetaSpec();
newClass._name = className;
newClass._Spec = constructor;
constructor.prototype.__class = newClass;
constructor.prototype.__Spec = constructor;
constructor.prototype.__className = className;
classes[className] = newClass;

return newClass;
};

var buildClass = function(className, constructor) {
var newClass, metaClass;

metaClass = constructor.metaClass;
newClass = registerClass(metaClass, className, constructor);

metaClass._Spec = constructor;
metaClass._isMetaClass = true;
metaClass._name = "Meta_" + className;

classes["Meta_" + className] = metaClass;
classes[className] = newClass;

if (newClass.initClass) {
newClass.initClass();
Expand Down Expand Up @@ -4418,80 +4423,46 @@ var sc = { VERSION: "0.0.28" };
}

SCObject.metaClass = createClassInstance(function() {});

klass.define(SCObject, "Object", {
__tag: 1,
__initializeWith__: function(className, args) {
metaClasses[className]._Spec.apply(this, args);
},
$initClass: function() {}
});

klass.define(SCClass, "Class");

SCObject.metaClass._MetaSpec.prototype = classes.Class = createClassInstance();
classes.Class._Spec = SCClass;
classes.Object = new SCObject.metaClass._MetaSpec();
classes.Object._name = "Object";
classes.Object._Spec = SCObject.metaClass._Spec;
classes.Object._Spec.prototype.__class = classes.Object;
classes.Object._Spec.prototype.__Spec = classes.Object._Spec;

klass.refine("Object", function(spec) {
spec.$new = function() {
if (this._Spec === SCClass) {
return $SC.Nil();
}
return new this._Spec(slice.call(arguments));
};

spec.class = function() {
return this.__class;
};

spec.isClass = function() {
return $SC.False();
};

spec.isKindOf = function($aClass) {
return $SC.Boolean(this instanceof $aClass._Spec);
};

spec.isMemberOf = function($aClass) {
return $SC.Boolean(this.__class === $aClass);
};

spec.toString = function() {
toString: function() {
var name = this.__class._name;
if (/^[AEIOU]/.test(name)) {
return String("an " + name);
} else {
return String("a " + name);
}
};

spec.valueOf = function() {
},
valueOf: function() {
return this._;
};
}
});

klass.refine("Class", function(spec) {
spec.name = function() {
return $SC.String(this._name);
};
klass.define(SCClass, "Class", {
toString: function() {
return String(this._name);
}
});

spec.class = function() {
if (this._isMetaClass) {
return classes.Class;
}
return $SC("Meta_" + this._name);
};
classes.Class = createClassInstance();
classes.Class._Spec = SCClass;

spec.isClass = function() {
return $SC.True();
};
SCObject.metaClass._MetaSpec.prototype = classes.Class;

spec.toString = function() {
return String(this._name);
registerClass(SCObject.metaClass, "Object", classes.Object._Spec);

klass.refine("Object", function(spec) {
spec.$new = function() {
if (this._Spec === SCClass) {
return $SC.Nil();
}
return new this._Spec(slice.call(arguments));
};
spec.$initClass = function() {
};
});

Expand Down Expand Up @@ -5181,9 +5152,17 @@ var sc = { VERSION: "0.0.28" };
return $state;
}, "function; state");

// already defined: class
// already defined: isKindOf
// already defined: isMemberOf
spec.class = function() {
return this.__class;
};

spec.isKindOf = function($aClass) {
return $SC.Boolean(this instanceof $aClass._Spec);
};

spec.isMemberOf = function($aClass) {
return $SC.Boolean(this.__class === $aClass);
};

spec.respondsTo = fn(function($aSymbol) {
return $SC.Boolean(typeof this[$aSymbol.__sym__()] === "function");
Expand Down Expand Up @@ -8643,9 +8622,21 @@ var sc = { VERSION: "0.0.28" };
// src/sc/lang/classlib/Core/Kernel.js
(function(sc) {

var $SC = sc.lang.$SC;
var fn = sc.lang.fn;

sc.lang.klass.refine("Class", {
sc.lang.klass.refine("Class", function(spec) {
spec.class = function() {
if (this._isMetaClass) {
return $SC("Class");
}
return $SC("Meta_" + this._name);
};

spec.name = function() {
return $SC.String(this._name);
};

// TODO: implements superclass
// TODO: implements asClass
// TODO: implements initClass
Expand Down Expand Up @@ -13724,7 +13715,7 @@ var sc = { VERSION: "0.0.28" };
numwin = ((raw.length + n - m) / n)|0;
numslots = numwin * m;

for (i = h = k = 0; i < numwin; ++i,h += n) {
for (i = h = k = 0; i < numwin; ++i, h += n) {
for (j = h; j < m + h; ++j) {
obj2[k++] = obj1[j];
}
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "scscript",
"version": "0.0.28",
"version": "0.0.29",
"author": "Nao Yonamine <mohayonao@gmail.com>",
"homepage": "http://mohayonao.github.io/SCScript/",
"bugs": "https://github.com/mohayonao/SCScript/issues",
Expand Down
14 changes: 13 additions & 1 deletion src/sc/lang/classlib/Core/Kernel.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,21 @@

require("./Object");

var $SC = sc.lang.$SC;
var fn = sc.lang.fn;

sc.lang.klass.refine("Class", {
sc.lang.klass.refine("Class", function(spec) {
spec.class = function() {
if (this._isMetaClass) {
return $SC("Class");
}
return $SC("Meta_" + this._name);
};

spec.name = function() {
return $SC.String(this._name);
};

// TODO: implements superclass
// TODO: implements asClass
// TODO: implements initClass
Expand Down
18 changes: 17 additions & 1 deletion src/sc/lang/classlib/Core/Kernel_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,23 @@
var $SC = sc.lang.$SC;

describe("SCKernel", function() {
it.skip("write later", function() {
var SCClass, SCMeta_Class;
before(function() {
SCClass = $SC("Class");
SCMeta_Class = $SC("Meta_Class");
});
it("#class", function() {
var test;

test = SCClass.class();
expect(test).to.equal(SCMeta_Class);

test = SCMeta_Class.class();
expect(test).to.equal(SCClass);
});
it("#name", function() {
var test = SCClass.name();
expect(test).to.be.a("SCString").that.equals("Class");
});
});

Expand Down
14 changes: 11 additions & 3 deletions src/sc/lang/classlib/Core/Object.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,17 @@
return $state;
}, "function; state");

// already defined: class
// already defined: isKindOf
// already defined: isMemberOf
spec.class = function() {
return this.__class;
};

spec.isKindOf = function($aClass) {
return $SC.Boolean(this instanceof $aClass._Spec);
};

spec.isMemberOf = function($aClass) {
return $SC.Boolean(this.__class === $aClass);
};

spec.respondsTo = fn(function($aSymbol) {
return $SC.Boolean(typeof this[$aSymbol.__sym__()] === "function");
Expand Down
38 changes: 38 additions & 0 deletions src/sc/lang/classlib/Core/Object_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,44 @@
expect(instance.do).to.be.calledWith($function);
expect(test).to.equal($state);
}));
it("#class", function() {
var instance,test;

instance = this.createInstance();
test = instance.class();

expect(test).to.equal(SCObject);
});
it("#isKindOf", function() {
var instance, test;

instance = $SC.Nil();
test = instance.isKindOf(SCObject);
expect(test).to.be.a("SCBoolean").that.is.true;

instance = $SC.Nil();
test = instance.isKindOf($SC("Nil"));
expect(test).to.be.a("SCBoolean").that.is.true;

instance = this.createInstance();
test = instance.isKindOf($SC("Nil"));
expect(test).to.be.a("SCBoolean").that.is.false;
});
it("#isMemberOf", function() {
var instance, test;

instance = $SC.Nil();
test = instance.isMemberOf(SCObject);
expect(test).to.be.a("SCBoolean").that.is.false;

instance = $SC.Nil();
test = instance.isMemberOf($SC("Nil"));
expect(test).to.be.a("SCBoolean").that.is.true;

instance = this.createInstance();
test = instance.isMemberOf($SC("Nil"));
expect(test).to.be.a("SCBoolean").that.is.false;
});
it("#respondsTo", function() {
testCase(this, [
[ null, [ "\\respondsTo" ], true ],
Expand Down
Loading

0 comments on commit 960753e

Please sign in to comment.