mirror of
https://github.com/flynx/Slang.git
synced 2025-10-29 10:40:07 +00:00
added basic object/namespace wordset + moved stuff to bootsrap...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
2495613a2b
commit
878e967d5f
131
Slang/slang.js
131
Slang/slang.js
@ -15,11 +15,7 @@ Array.prototype.toString = function(){
|
|||||||
|
|
||||||
function run(context){
|
function run(context){
|
||||||
|
|
||||||
var stack = context.stack
|
context.stack = context.stack == null ? [] : context.stack
|
||||||
stack = stack == null ? [] : stack
|
|
||||||
context.stack = stack
|
|
||||||
|
|
||||||
var ns = context.ns
|
|
||||||
|
|
||||||
while(context.code.length > 0){
|
while(context.code.length > 0){
|
||||||
|
|
||||||
@ -30,11 +26,11 @@ function run(context){
|
|||||||
return context
|
return context
|
||||||
|
|
||||||
// word
|
// word
|
||||||
} else if(typeof(cur) == typeof('abc') && cur in ns){
|
} else if(typeof(cur) == typeof('abc') && cur in context.ns){
|
||||||
var word = ns[cur]
|
var word = context.ns[cur]
|
||||||
// low-level word...
|
// low-level word...
|
||||||
if(typeof(word) == typeof(function(){})){
|
if(typeof(word) == typeof(function(){})){
|
||||||
var res = ns[cur](context)
|
var res = context.ns[cur](context)
|
||||||
|
|
||||||
// hi-level word...
|
// hi-level word...
|
||||||
} else if(typeof(word) == typeof([]) && word.constructor.name == 'Array'){
|
} else if(typeof(word) == typeof([]) && word.constructor.name == 'Array'){
|
||||||
@ -171,6 +167,9 @@ var NAMESPACE = {
|
|||||||
|
|
||||||
'nop': function(){},
|
'nop': function(){},
|
||||||
|
|
||||||
|
'is?': function(context){
|
||||||
|
return context.stack.pop() === context.stack.pop() },
|
||||||
|
|
||||||
// XXX experimental...
|
// XXX experimental...
|
||||||
// flip the code and stack...
|
// flip the code and stack...
|
||||||
// ... -- ...
|
// ... -- ...
|
||||||
@ -270,16 +269,6 @@ var NAMESPACE = {
|
|||||||
}).stack
|
}).stack
|
||||||
},
|
},
|
||||||
|
|
||||||
// word definition...
|
|
||||||
// syntax: :: <ident> <block>
|
|
||||||
// --
|
|
||||||
'::': function(context){
|
|
||||||
var ident = context.code.splice(0, 1)
|
|
||||||
var cur = context.code.splice(0, 1)
|
|
||||||
|
|
||||||
this[ident] = cur[0]
|
|
||||||
},
|
|
||||||
|
|
||||||
// s c -- s
|
// s c -- s
|
||||||
'_exec': function(context){
|
'_exec': function(context){
|
||||||
// block...
|
// block...
|
||||||
@ -297,8 +286,11 @@ var NAMESPACE = {
|
|||||||
// NOTE: this can have side-effects on the context...
|
// NOTE: this can have side-effects on the context...
|
||||||
ns: context.ns,
|
ns: context.ns,
|
||||||
pre_ns: context.pre_ns
|
pre_ns: context.pre_ns
|
||||||
}).stack
|
})
|
||||||
return res
|
// XXX is this the right way to go?
|
||||||
|
context.ns = res.ns
|
||||||
|
context.pre_ns = res.pre_ns
|
||||||
|
return res.stack
|
||||||
},
|
},
|
||||||
// quote - push the next elem as-is to stack...
|
// quote - push the next elem as-is to stack...
|
||||||
// -- x
|
// -- x
|
||||||
@ -461,6 +453,79 @@ var NAMESPACE = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// object stuff...
|
||||||
|
'{}': function(){ return {} },
|
||||||
|
|
||||||
|
'object?': function(context){
|
||||||
|
var o = context.stack[context.stack.length - 1]
|
||||||
|
return o.constructor === Object
|
||||||
|
},
|
||||||
|
|
||||||
|
// set item...
|
||||||
|
// o k v -- o
|
||||||
|
'item!': function(context){
|
||||||
|
var v = context.stack.pop()
|
||||||
|
var k = context.stack.pop()
|
||||||
|
var o = context.stack[context.stack.length - 1]
|
||||||
|
|
||||||
|
o[k] = v
|
||||||
|
},
|
||||||
|
|
||||||
|
// get item...
|
||||||
|
// o k -- o v
|
||||||
|
'item': function(context){
|
||||||
|
var k = context.stack.pop()
|
||||||
|
return context.stack[context.stack.length - 1][k]
|
||||||
|
},
|
||||||
|
|
||||||
|
// remove/pop item from object...
|
||||||
|
// o k -- o v
|
||||||
|
'popitem': function(context){
|
||||||
|
var k = context.stack.pop()
|
||||||
|
var o = context.stack[context.stack.length - 1]
|
||||||
|
|
||||||
|
var v = o[k]
|
||||||
|
delete o[k]
|
||||||
|
|
||||||
|
return v
|
||||||
|
},
|
||||||
|
|
||||||
|
// o -- k
|
||||||
|
'keys': function(context){
|
||||||
|
return Object.keys(context.stack.pop())
|
||||||
|
},
|
||||||
|
|
||||||
|
// make a prototype of b...
|
||||||
|
// a b -- b
|
||||||
|
// NOTE: if a is false, reset prototype...
|
||||||
|
'proto!': function(context){
|
||||||
|
var b = context.stack.pop()
|
||||||
|
var a = context.stack.pop()
|
||||||
|
|
||||||
|
b.__proto__ = a === false ? {}.__proto__ : a
|
||||||
|
|
||||||
|
return b
|
||||||
|
},
|
||||||
|
|
||||||
|
// o -- p
|
||||||
|
// XXX what should this be:
|
||||||
|
// {} getproto
|
||||||
|
'proto': function(context){
|
||||||
|
var o = context.stack.pop()
|
||||||
|
|
||||||
|
return o.__proto__
|
||||||
|
},
|
||||||
|
|
||||||
|
// -- o
|
||||||
|
'ns': function(context){
|
||||||
|
return context.ns
|
||||||
|
},
|
||||||
|
// o --
|
||||||
|
'ns!': function(context){
|
||||||
|
context.ns = context.stack.pop()
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -659,11 +724,23 @@ var BOOTSTRAP = [
|
|||||||
'--',
|
'--',
|
||||||
'-- With that out of the way, let\'s start with the bootstrap...',
|
'-- With that out of the way, let\'s start with the bootstrap...',
|
||||||
'',
|
'',
|
||||||
|
'-- prepare the basic syntax for defining words...',
|
||||||
|
'ns',
|
||||||
|
' exec ( b -- ... )',
|
||||||
|
' [ s2b pop _exec b2s ] item!',
|
||||||
|
' -- Create a word...',
|
||||||
|
' word! ( w b -- )',
|
||||||
|
' [ rot rot ns tor tor item! drop ] item!',
|
||||||
|
' -- Word definition...',
|
||||||
|
' -- syntax: :: <ident> <value>',
|
||||||
|
' :: ( -- )',
|
||||||
|
' [ \\ word! \\ exec 2 2 _swapN ] item!',
|
||||||
|
'drop',
|
||||||
|
'',
|
||||||
'',
|
'',
|
||||||
'-- misc...',
|
'-- misc...',
|
||||||
'',
|
'',
|
||||||
':: . ( x -- ) [ drop ]',
|
':: . ( x -- ) [ drop ]',
|
||||||
//':: .. ( x -- ) [ print drop ]',
|
|
||||||
'',
|
'',
|
||||||
':: true? ( a -- b ) [ not not true eq ]',
|
':: true? ( a -- b ) [ not not true eq ]',
|
||||||
':: false? ( a -- b ) [ not true? ]',
|
':: false? ( a -- b ) [ not true? ]',
|
||||||
@ -686,7 +763,6 @@ var BOOTSTRAP = [
|
|||||||
':: _push ( x | -- | x ) [ 0 _swapN ]',
|
':: _push ( x | -- | x ) [ 0 _swapN ]',
|
||||||
':: _pull ( | x -- x | ) [ 0 swap _swapN ]',
|
':: _pull ( | x -- x | ) [ 0 swap _swapN ]',
|
||||||
'',
|
'',
|
||||||
':: exec ( b -- ... ) [ s2b pop _exec b2s ]',
|
|
||||||
':: eval ( c -- ... ) [ lex prep exec ]',
|
':: eval ( c -- ... ) [ lex prep exec ]',
|
||||||
'-- like exec but will run a block in current context...',
|
'-- like exec but will run a block in current context...',
|
||||||
':: b2c [ len rot b2s tor 0 _swapN ]',
|
':: b2c [ len rot b2s tor 0 _swapN ]',
|
||||||
@ -848,6 +924,9 @@ var BOOTSTRAP = [
|
|||||||
'infix: <= le',
|
'infix: <= le',
|
||||||
'infix: >= ge',
|
'infix: >= ge',
|
||||||
'',
|
'',
|
||||||
|
'-- experimental...',
|
||||||
|
'infix: = word!',
|
||||||
|
'',
|
||||||
'',
|
'',
|
||||||
'-- Prefix operation definition...',
|
'-- Prefix operation definition...',
|
||||||
'-- Example:',
|
'-- Example:',
|
||||||
@ -883,6 +962,11 @@ var BOOTSTRAP = [
|
|||||||
//':: range/3 ( a n s -- b )',
|
//':: range/3 ( a n s -- b )',
|
||||||
//' [ swap range swap [] swap push \\ * 0 before map ]',
|
//' [ swap range swap [] swap push \\ * 0 before map ]',
|
||||||
'',
|
'',
|
||||||
|
'-- Execute block in a context...',
|
||||||
|
'-- synctx: context: <block>',
|
||||||
|
'prefix: context: [ ns {} proto! ns! exec ns proto ns! ]',
|
||||||
|
'',
|
||||||
|
'',
|
||||||
''].join('\n')
|
''].join('\n')
|
||||||
|
|
||||||
|
|
||||||
@ -927,7 +1011,7 @@ function slang(code, context){
|
|||||||
|
|
||||||
|
|
||||||
/********************************************************** RSlang ***/
|
/********************************************************** RSlang ***/
|
||||||
|
/*
|
||||||
var RS_PRE_NAMESPACE = {
|
var RS_PRE_NAMESPACE = {
|
||||||
// XXX using the ";" here just for the experiment, in the real thing
|
// XXX using the ";" here just for the experiment, in the real thing
|
||||||
// if this thing pans out, that is, use indent... (a-la make/Python)
|
// if this thing pans out, that is, use indent... (a-la make/Python)
|
||||||
@ -965,6 +1049,7 @@ function rslang(code, context){
|
|||||||
|
|
||||||
return slang(code, context)
|
return slang(code, context)
|
||||||
}
|
}
|
||||||
|
//*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user