mirror of
https://github.com/flynx/Slang.git
synced 2025-10-29 18:50:08 +00:00
cleanup and docs...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
878e967d5f
commit
54c79a049c
@ -102,7 +102,7 @@ function stringifySlangCode(code){
|
|||||||
}
|
}
|
||||||
if(typeof(code) == typeof('str') && /\s/.test(code)){
|
if(typeof(code) == typeof('str') && /\s/.test(code)){
|
||||||
return '\''+code+'\''
|
return '\''+code+'\''
|
||||||
} else if(code.constructor.name == 'Array'){
|
} else if(code && code.constructor.name == 'Array'){
|
||||||
return '[ '+code.map(stringifySlangCode).join(' ')+' ]'
|
return '[ '+code.map(stringifySlangCode).join(' ')+' ]'
|
||||||
}
|
}
|
||||||
return code
|
return code
|
||||||
@ -198,7 +198,7 @@ function showAvailableWords(){
|
|||||||
.map(function(e){
|
.map(function(e){
|
||||||
var code = NAMESPACE[e]
|
var code = NAMESPACE[e]
|
||||||
var type
|
var type
|
||||||
if(code.constructor.name == 'Array'){
|
if(code && code.constructor.name == 'Array'){
|
||||||
type = 'word'
|
type = 'word'
|
||||||
code = stringifySlangCode(code)
|
code = stringifySlangCode(code)
|
||||||
} else if(typeof(code) == typeof(function(){})){
|
} else if(typeof(code) == typeof(function(){})){
|
||||||
|
|||||||
250
Slang/slang.js
250
Slang/slang.js
@ -33,17 +33,17 @@ function run(context){
|
|||||||
var res = context.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 && word.constructor.name == 'Array'){
|
||||||
// XXX add isolation with a continuation...
|
// XXX add isolation with a continuation...
|
||||||
context.code.splice.apply(context.code, [0, 0].concat(word))
|
context.code.splice.apply(context.code, [0, 0].concat(word))
|
||||||
var res = null
|
var res = undefined
|
||||||
|
|
||||||
// variable...
|
// variable...
|
||||||
} else {
|
} else {
|
||||||
res = word
|
var res = word
|
||||||
}
|
}
|
||||||
|
|
||||||
if(res != null){
|
if(res !== undefined){
|
||||||
context.stack.push(res)
|
context.stack.push(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,6 +73,9 @@ var SPLITTER = RegExp([
|
|||||||
'\\s*"([^"]*)"\\s*',
|
'\\s*"([^"]*)"\\s*',
|
||||||
"\\s*'([^']*)'\\s*",
|
"\\s*'([^']*)'\\s*",
|
||||||
|
|
||||||
|
// quote...
|
||||||
|
'\\s*(\\\\)',
|
||||||
|
|
||||||
// whitespace...
|
// whitespace...
|
||||||
'\\s+',
|
'\\s+',
|
||||||
].join('|'),
|
].join('|'),
|
||||||
@ -151,9 +154,7 @@ var PRE_NAMESPACE = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
// a no op...
|
// a no op...
|
||||||
'\n': function(){
|
'\n': function(){ console.log('NL') },
|
||||||
console.log('NL')
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -162,8 +163,7 @@ var NAMESPACE = {
|
|||||||
// constants...
|
// constants...
|
||||||
'true': true,
|
'true': true,
|
||||||
'false': false,
|
'false': false,
|
||||||
// this is mutable, so we'll need to create a new instance each time
|
'null': 'null',
|
||||||
'[]': function(){ return [] },
|
|
||||||
|
|
||||||
'nop': function(){},
|
'nop': function(){},
|
||||||
|
|
||||||
@ -205,8 +205,7 @@ var NAMESPACE = {
|
|||||||
// encapsulate stack to a block...
|
// encapsulate stack to a block...
|
||||||
// ... -- [ ... ]
|
// ... -- [ ... ]
|
||||||
's2b': function(context){
|
's2b': function(context){
|
||||||
context.stack = [ context.stack ]
|
context.stack = [ context.stack ] },
|
||||||
},
|
|
||||||
// expand block to stack...
|
// expand block to stack...
|
||||||
// NOTE: this will append the block contents to stack, w.o. replacing
|
// NOTE: this will append the block contents to stack, w.o. replacing
|
||||||
// stack contents. this is different to _s2b
|
// stack contents. this is different to _s2b
|
||||||
@ -217,8 +216,7 @@ var NAMESPACE = {
|
|||||||
context.stack.splice.apply(context.stack, [context.stack.length, 0].concat(c))
|
context.stack.splice.apply(context.stack, [context.stack.length, 0].concat(c))
|
||||||
},
|
},
|
||||||
'print': function(context){
|
'print': function(context){
|
||||||
console.log('>>>', context.stack[context.stack.length-1])
|
console.log('>>>', context.stack[context.stack.length-1]) },
|
||||||
},
|
|
||||||
|
|
||||||
// turn a sting into a lexical list...
|
// turn a sting into a lexical list...
|
||||||
// c -- b
|
// c -- b
|
||||||
@ -273,7 +271,7 @@ var NAMESPACE = {
|
|||||||
'_exec': function(context){
|
'_exec': function(context){
|
||||||
// block...
|
// block...
|
||||||
var b = context.stack.pop()
|
var b = context.stack.pop()
|
||||||
if(typeof(b) == typeof([]) && b.constructor.name == 'Array'){
|
if(typeof(b) == typeof([]) && b && b.constructor.name == 'Array'){
|
||||||
b = b.slice()
|
b = b.slice()
|
||||||
} else {
|
} else {
|
||||||
b = [ b ]
|
b = [ b ]
|
||||||
@ -295,9 +293,7 @@ var NAMESPACE = {
|
|||||||
// quote - push the next elem as-is to stack...
|
// quote - push the next elem as-is to stack...
|
||||||
// -- x
|
// -- x
|
||||||
'\\': function(context){
|
'\\': function(context){
|
||||||
var code = context.code
|
return context.code.splice(0, 1)[0] },
|
||||||
return code.splice(0, 1)[0]
|
|
||||||
},
|
|
||||||
|
|
||||||
// comparisons and logic...
|
// comparisons and logic...
|
||||||
// a b -- c
|
// a b -- c
|
||||||
@ -322,74 +318,59 @@ var NAMESPACE = {
|
|||||||
},
|
},
|
||||||
// x -- b
|
// x -- b
|
||||||
'not': function(context){
|
'not': function(context){
|
||||||
return !context.stack.pop()
|
return !context.stack.pop() },
|
||||||
},
|
|
||||||
// a b -- c
|
// a b -- c
|
||||||
'gt': function(context){
|
'gt': function(context){
|
||||||
return context.stack.pop() < context.stack.pop()
|
return context.stack.pop() < context.stack.pop() },
|
||||||
},
|
|
||||||
// a b -- c
|
// a b -- c
|
||||||
'eq': function(context){
|
'eq': function(context){
|
||||||
return context.stack.pop() == context.stack.pop()
|
return context.stack.pop() == context.stack.pop() },
|
||||||
},
|
|
||||||
|
|
||||||
// stack operations...
|
// stack operations...
|
||||||
// ... x -- x ...
|
// ... x -- x ...
|
||||||
'rot': function(context){
|
'rot': function(context){
|
||||||
context.stack.splice(0, 0, context.stack.pop())
|
context.stack.splice(0, 0, context.stack.pop()) },
|
||||||
},
|
|
||||||
// x ... -- ... x
|
// x ... -- ... x
|
||||||
'tor': function(context){
|
'tor': function(context){
|
||||||
context.stack.push(context.stack.shift())
|
context.stack.push(context.stack.shift()) },
|
||||||
},
|
|
||||||
// a b -- b a
|
// a b -- b a
|
||||||
'swap': function(context){
|
'swap': function(context){
|
||||||
return context.stack.splice(context.stack.length-2, 1)[0]
|
return context.stack.splice(context.stack.length-2, 1)[0] },
|
||||||
},
|
|
||||||
// x -- x x
|
// x -- x x
|
||||||
'dup': function(context){
|
'dup': function(context){
|
||||||
return context.stack[context.stack.length-1]
|
return context.stack[context.stack.length-1] },
|
||||||
},
|
|
||||||
// x -- x'
|
// x -- x'
|
||||||
// NOTE: this will do a deep copy...
|
// NOTE: this will do a deep copy...
|
||||||
'clone': function(context){
|
'clone': function(context){
|
||||||
return JSON.parse(JSON.stringify(context.stack.pop()))
|
return JSON.parse(JSON.stringify(context.stack.pop())) },
|
||||||
},
|
|
||||||
// x --
|
// x --
|
||||||
'drop': function(context){
|
'drop': function(context){
|
||||||
context.stack.pop()
|
context.stack.pop() },
|
||||||
},
|
|
||||||
|
|
||||||
// a -- b
|
// a -- b
|
||||||
// NOTE: all names are also strings so moo string? and 'moo' string?
|
// NOTE: all names are also strings so moo string? and 'moo' string?
|
||||||
// are the same...
|
// are the same...
|
||||||
'string?': function(context){
|
'string?': function(context){
|
||||||
return typeof(context.stack.pop()) == typeof('str')
|
return typeof(context.stack.pop()) == typeof('str') },
|
||||||
},
|
|
||||||
|
|
||||||
// basic number operations...
|
// basic number operations...
|
||||||
// a -- b
|
// a -- b
|
||||||
'number?': function(context){
|
'number?': function(context){
|
||||||
return typeof(context.stack.pop()) == typeof(123)
|
return typeof(context.stack.pop()) == typeof(123) },
|
||||||
},
|
|
||||||
// a b -- c
|
// a b -- c
|
||||||
'add': function(context){
|
'add': function(context){
|
||||||
return context.stack.pop() + context.stack.pop()
|
return context.stack.pop() + context.stack.pop() },
|
||||||
},
|
|
||||||
'sub': function(context){
|
'sub': function(context){
|
||||||
return - context.stack.pop() + context.stack.pop()
|
return - context.stack.pop() + context.stack.pop() },
|
||||||
},
|
|
||||||
'mul': function(context){
|
'mul': function(context){
|
||||||
return context.stack.pop() * context.stack.pop()
|
return context.stack.pop() * context.stack.pop() },
|
||||||
},
|
|
||||||
'div': function(context){
|
'div': function(context){
|
||||||
return 1/context.stack.pop() * context.stack.pop()
|
return 1/context.stack.pop() * context.stack.pop() },
|
||||||
},
|
|
||||||
|
|
||||||
// block/list operations...
|
// block/list operations...
|
||||||
'block?': function(context){
|
'block?': function(context){
|
||||||
var e = context.stack.pop()
|
var e = context.stack.pop()
|
||||||
return typeof(e) == typeof([]) && e.constructor.name == 'Array'
|
return typeof(e) == typeof([]) && e && e.constructor.name == 'Array'
|
||||||
},
|
},
|
||||||
// b n -- b e
|
// b n -- b e
|
||||||
'at': function(context){
|
'at': function(context){
|
||||||
@ -424,12 +405,10 @@ var NAMESPACE = {
|
|||||||
},
|
},
|
||||||
// b -- b e
|
// b -- b e
|
||||||
'pop': function(context){
|
'pop': function(context){
|
||||||
return context.stack[context.stack.length-1].pop()
|
return context.stack[context.stack.length-1].pop() },
|
||||||
},
|
|
||||||
// b -- b l
|
// b -- b l
|
||||||
'len': function(context){
|
'len': function(context){
|
||||||
return context.stack[context.stack.length-1].length
|
return context.stack[context.stack.length-1].length },
|
||||||
},
|
|
||||||
// b c -- b
|
// b c -- b
|
||||||
'map': function(context){
|
'map': function(context){
|
||||||
var c = context.stack.pop()
|
var c = context.stack.pop()
|
||||||
@ -437,7 +416,7 @@ var NAMESPACE = {
|
|||||||
for(var i=0; i < b.length; i++){
|
for(var i=0; i < b.length; i++){
|
||||||
// exec block in a separate context...
|
// exec block in a separate context...
|
||||||
var res = run({
|
var res = run({
|
||||||
//stack: [i, b[i], c],
|
//stack: [b, i, b[i], c],
|
||||||
stack: [b[i], c],
|
stack: [b[i], c],
|
||||||
code: ['exec'],
|
code: ['exec'],
|
||||||
// NOTE: this can have side-effects on the context...
|
// NOTE: this can have side-effects on the context...
|
||||||
@ -460,7 +439,7 @@ var NAMESPACE = {
|
|||||||
|
|
||||||
'object?': function(context){
|
'object?': function(context){
|
||||||
var o = context.stack[context.stack.length - 1]
|
var o = context.stack[context.stack.length - 1]
|
||||||
return o.constructor === Object
|
return o && o.constructor === Object
|
||||||
},
|
},
|
||||||
|
|
||||||
// set item...
|
// set item...
|
||||||
@ -473,12 +452,15 @@ var NAMESPACE = {
|
|||||||
o[k] = v
|
o[k] = v
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// test item...
|
||||||
|
// o k -- o t
|
||||||
|
'item?': function(context){
|
||||||
|
return context.stack.pop() in context.stack[context.stack.length - 1] },
|
||||||
|
|
||||||
// get item...
|
// get item...
|
||||||
// o k -- o v
|
// o k -- o v
|
||||||
'item': function(context){
|
'item': function(context){
|
||||||
var k = context.stack.pop()
|
return context.stack[context.stack.length - 1][context.stack.pop()] },
|
||||||
return context.stack[context.stack.length - 1][k]
|
|
||||||
},
|
|
||||||
|
|
||||||
// remove/pop item from object...
|
// remove/pop item from object...
|
||||||
// o k -- o v
|
// o k -- o v
|
||||||
@ -494,8 +476,7 @@ var NAMESPACE = {
|
|||||||
|
|
||||||
// o -- k
|
// o -- k
|
||||||
'keys': function(context){
|
'keys': function(context){
|
||||||
return Object.keys(context.stack.pop())
|
return Object.keys(context.stack.pop()) },
|
||||||
},
|
|
||||||
|
|
||||||
// make a prototype of b...
|
// make a prototype of b...
|
||||||
// a b -- b
|
// a b -- b
|
||||||
@ -503,9 +484,7 @@ var NAMESPACE = {
|
|||||||
'proto!': function(context){
|
'proto!': function(context){
|
||||||
var b = context.stack.pop()
|
var b = context.stack.pop()
|
||||||
var a = context.stack.pop()
|
var a = context.stack.pop()
|
||||||
|
|
||||||
b.__proto__ = a === false ? {}.__proto__ : a
|
b.__proto__ = a === false ? {}.__proto__ : a
|
||||||
|
|
||||||
return b
|
return b
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -513,19 +492,14 @@ var NAMESPACE = {
|
|||||||
// XXX what should this be:
|
// XXX what should this be:
|
||||||
// {} getproto
|
// {} getproto
|
||||||
'proto': function(context){
|
'proto': function(context){
|
||||||
var o = context.stack.pop()
|
return context.stack.pop().__proto__ },
|
||||||
|
|
||||||
return o.__proto__
|
|
||||||
},
|
|
||||||
|
|
||||||
// -- o
|
// -- o
|
||||||
'ns': function(context){
|
'ns': function(context){
|
||||||
return context.ns
|
return context.ns },
|
||||||
},
|
|
||||||
// o --
|
// o --
|
||||||
'ns!': function(context){
|
'ns!': function(context){
|
||||||
context.ns = context.stack.pop()
|
context.ns = context.stack.pop() },
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -717,6 +691,57 @@ var BOOTSTRAP = [
|
|||||||
' [ 1 2 3 4 ] [ 2 gt ] filter',
|
' [ 1 2 3 4 ] [ 2 gt ] filter',
|
||||||
' -> [ 3 4 ]',
|
' -> [ 3 4 ]',
|
||||||
'',
|
'',
|
||||||
|
' Reduce enables us to take a list and "reduce" it to a single value...',
|
||||||
|
'',
|
||||||
|
' [ 1 2 3 4 ] \\add reduce',
|
||||||
|
' -> 10',
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
'-------------------------------------------------------------------------------',
|
||||||
|
'',
|
||||||
|
' Objects and namespaces:',
|
||||||
|
'',
|
||||||
|
' Create a variable word o and p and set them to empty objects...',
|
||||||
|
'',
|
||||||
|
' ns',
|
||||||
|
' o {} item!',
|
||||||
|
' p {} item!',
|
||||||
|
' .',
|
||||||
|
'',
|
||||||
|
' Set attribute (key-value pair) on object...',
|
||||||
|
'',
|
||||||
|
' o x 123 item!',
|
||||||
|
' -> o',
|
||||||
|
'',
|
||||||
|
' Get attribute x value...',
|
||||||
|
'',
|
||||||
|
' o x item',
|
||||||
|
' -> 123',
|
||||||
|
'',
|
||||||
|
' Test if attribute x exists...',
|
||||||
|
'',
|
||||||
|
' o x item?',
|
||||||
|
' -> true',
|
||||||
|
'',
|
||||||
|
' Get block of attribute idents...',
|
||||||
|
'',
|
||||||
|
' o keys',
|
||||||
|
' -> [ ... ]',
|
||||||
|
'',
|
||||||
|
' Get and remove an attribute value from o...',
|
||||||
|
'',
|
||||||
|
' o x popitem',
|
||||||
|
' -> 123',
|
||||||
|
'',
|
||||||
|
' Set prototype of o to p',
|
||||||
|
'',
|
||||||
|
' o p proto!',
|
||||||
|
' -> o',
|
||||||
|
'',
|
||||||
|
' Get prototype of o',
|
||||||
|
'',
|
||||||
|
' o proto',
|
||||||
|
' -> p',
|
||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
'-------------------------------------------------------------------------------',
|
'-------------------------------------------------------------------------------',
|
||||||
@ -726,22 +751,29 @@ var BOOTSTRAP = [
|
|||||||
'',
|
'',
|
||||||
'-- prepare the basic syntax for defining words...',
|
'-- prepare the basic syntax for defining words...',
|
||||||
'ns',
|
'ns',
|
||||||
|
' -- Some sorthands...',
|
||||||
|
' . ( x -- )',
|
||||||
|
' [ drop ] item!',
|
||||||
|
' rot2 ( .. x y -- x y .. )',
|
||||||
|
' [ rot rot ] item!',
|
||||||
|
' tor2 ( x y .. -- .. x y )',
|
||||||
|
' [ tor tor ] item!',
|
||||||
|
'',
|
||||||
|
' -- Friendly exec...',
|
||||||
' exec ( b -- ... )',
|
' exec ( b -- ... )',
|
||||||
' [ s2b pop _exec b2s ] item!',
|
' [ s2b pop _exec b2s ] item!',
|
||||||
' -- Create a word...',
|
' -- Create a word...',
|
||||||
' word! ( w b -- )',
|
' word! ( w b -- )',
|
||||||
' [ rot rot ns tor tor item! drop ] item!',
|
' [ rot2 ns tor2 item! . ] item!',
|
||||||
' -- Word definition...',
|
' -- Word definition...',
|
||||||
' -- syntax: :: <ident> <value>',
|
' -- syntax: :: <ident> <value>',
|
||||||
' :: ( -- )',
|
' :: ( -- )',
|
||||||
' [ \\ word! \\ exec 2 2 _swapN ] item!',
|
' [ \\word! \\exec 2 2 _swapN ] item!',
|
||||||
'drop',
|
'.',
|
||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
'-- misc...',
|
'-- misc...',
|
||||||
'',
|
'',
|
||||||
':: . ( x -- ) [ 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? ]',
|
||||||
'',
|
'',
|
||||||
@ -792,13 +824,13 @@ var BOOTSTRAP = [
|
|||||||
'-- run then block and drop \'else B\' if it exists...',
|
'-- run then block and drop \'else B\' if it exists...',
|
||||||
':: _run_then ( a x | -- ... | x )',
|
':: _run_then ( a x | -- ... | x )',
|
||||||
' ( a else | b -- ... | )',
|
' ( a else | b -- ... | )',
|
||||||
' [ \\ exec swap dup \\ else eq [ (drop else) drop \\ drop _swap 6 ] and',
|
' [ \\exec swap dup \\else eq [ (drop else) drop \\drop _swap 6 ] and',
|
||||||
' [ (run as-is) 1 _push 4 ] or',
|
' [ (run as-is) 1 _push 4 ] or',
|
||||||
' b2s 0 _swapN ]',
|
' b2s 0 _swapN ]',
|
||||||
'-- if \'else B\' exists, run it, else cleanup...',
|
'-- if \'else B\' exists, run it, else cleanup...',
|
||||||
':: _run_else ( a | -- | a )',
|
':: _run_else ( a | -- | a )',
|
||||||
' ( b else | b -- ... | )',
|
' ( b else | b -- ... | )',
|
||||||
' [ drop dup \\ else eq [ drop \\ exec _swap 4 ] and',
|
' [ drop dup \\else eq [ drop \\exec _swap 4 ] and',
|
||||||
' [ 1 _push 2 ] or',
|
' [ 1 _push 2 ] or',
|
||||||
' b2s 0 _swapN ]',
|
' b2s 0 _swapN ]',
|
||||||
'-- And now the main operator...',
|
'-- And now the main operator...',
|
||||||
@ -834,11 +866,11 @@ var BOOTSTRAP = [
|
|||||||
'-- NOTE: this will replace ALL patterns...',
|
'-- NOTE: this will replace ALL patterns...',
|
||||||
':: replace ( l v p -- l ) [',
|
':: replace ( l v p -- l ) [',
|
||||||
' swap',
|
' swap',
|
||||||
' [ . \\ VALUE ] clone',
|
' [ . \\VALUE ] clone',
|
||||||
' swap 2 to',
|
' swap 2 to',
|
||||||
' rot',
|
' rot',
|
||||||
' -- XXX for some reason ? without else messes things up...',
|
' -- XXX for some reason ? without else messes things up...',
|
||||||
' [ dup \\ PATTERN eq ? VALUE_BLOCK else [ ] ] clone',
|
' [ dup \\PATTERN eq ? VALUE_BLOCK else [ ] ] clone',
|
||||||
' swap 2 to',
|
' swap 2 to',
|
||||||
' tor 5 to',
|
' tor 5 to',
|
||||||
' map ]',
|
' map ]',
|
||||||
@ -848,13 +880,32 @@ var BOOTSTRAP = [
|
|||||||
'-- the condition block must have the folowing stack effect: elem -- bool',
|
'-- the condition block must have the folowing stack effect: elem -- bool',
|
||||||
':: filter ( b c -- b ) [',
|
':: filter ( b c -- b ) [',
|
||||||
' -- prepare the condition...',
|
' -- prepare the condition...',
|
||||||
' [ dup \\ TEST exec ] clone',
|
' [ dup \\TEST exec ] clone',
|
||||||
' swap TEST replace',
|
' swap TEST replace',
|
||||||
' -- prepare the template...',
|
' -- prepare the template...',
|
||||||
' [ TEST ? [ ] else [ . ] ] clone',
|
' [ TEST ? [ ] else [ . ] ] clone',
|
||||||
' swap TEST replace',
|
' swap TEST replace',
|
||||||
' map ]',
|
' map ]',
|
||||||
'',
|
'',
|
||||||
|
':: reduce ( L b -- s ) [',
|
||||||
|
' rot clone',
|
||||||
|
' -- empty list, reduction is null...',
|
||||||
|
' [ len 0 eq ] ?',
|
||||||
|
' [ . tor . null ]',
|
||||||
|
' -- reduction of list of len 1 is it\'s content, so just pop it...',
|
||||||
|
' else [ [ len 1 eq ] ?',
|
||||||
|
' [ tor . b2s ]',
|
||||||
|
' -- and now recursively reduce the elements till the list is 1 in length...',
|
||||||
|
' -- XXX ugly',
|
||||||
|
' else [',
|
||||||
|
' pop rot pop rot',
|
||||||
|
' [] tor push tor push',
|
||||||
|
' -- get and run the block...',
|
||||||
|
' tor dup clone rot _exec',
|
||||||
|
' -- process the result...',
|
||||||
|
' pop rot . tor push tor',
|
||||||
|
' reduce ]]',
|
||||||
|
'',
|
||||||
'-- Create a block containing a range of numbers form 0 to n-1...',
|
'-- Create a block containing a range of numbers form 0 to n-1...',
|
||||||
':: range ( n -- b ) [',
|
':: range ( n -- b ) [',
|
||||||
' -- initial state...',
|
' -- initial state...',
|
||||||
@ -871,43 +922,32 @@ var BOOTSTRAP = [
|
|||||||
' [ 1 sub 0 before range ]]',
|
' [ 1 sub 0 before range ]]',
|
||||||
'',
|
'',
|
||||||
'-- Sum up the elements of a block...',
|
'-- Sum up the elements of a block...',
|
||||||
':: sum ( L -- s ) [',
|
':: sum ( L -- s ) [ [ add ] reduce ]',
|
||||||
' clone',
|
|
||||||
' -- empty list, sum is 0...',
|
|
||||||
' [ len 0 eq ] ?',
|
|
||||||
' [ . 0 ]',
|
|
||||||
' -- sum of list of len 1 is it\'s content, so just pop it...',
|
|
||||||
' else [ [ len 1 eq ] ?',
|
|
||||||
' b2s',
|
|
||||||
' -- and now recursively sum up elements till the list is 1 in length...',
|
|
||||||
' else',
|
|
||||||
' [ pop rot pop tor add push sum ]]',
|
|
||||||
'',
|
|
||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
'-- Meta-word examples (experimental)...',
|
'-- Meta-word examples (experimental)...',
|
||||||
'',
|
'',
|
||||||
'-- Here is an infix operator example...',
|
'-- Here is an infix operator example...',
|
||||||
'-- :: + ( a | b -- c | ) [ \\ exec 2 0 _swapN \\ exec \\ add 2 1 _swapN ]',
|
'-- :: + ( a | b -- c | ) [ \\exec 2 0 _swapN \\exec \\add 2 1 _swapN ]',
|
||||||
'-- now let\'s make a meta function to make things shorter...',
|
'-- now let\'s make a meta function to make things shorter...',
|
||||||
':: infix: ( | op word -- | ) [',
|
':: infix: ( | op word -- | ) [',
|
||||||
' [',
|
' [',
|
||||||
' -- format the word definition...',
|
' -- format the word definition...',
|
||||||
' -- NAME WORD -> :: NAME WORD',
|
' -- NAME WORD -> :: NAME WORD',
|
||||||
' s2b \\ :: -2 before b2s',
|
' s2b \\:: -2 before b2s',
|
||||||
'',
|
'',
|
||||||
' -- our template...',
|
' -- our template...',
|
||||||
' -- exec the left side...',
|
' -- exec the left side...',
|
||||||
' [ \\ exec 2 0 _swapN',
|
' [ \\exec 2 0 _swapN',
|
||||||
' -- exec the right side and arragne the args for WORD...',
|
' -- exec the right side and arragne the args for WORD...',
|
||||||
' \\ exec \\ WORD 2 1 _swapN ] clone',
|
' \\exec \\WORD 2 1 _swapN ] clone',
|
||||||
' -- get the WORD and insert it into the template above (opsition 8)...',
|
' -- get the WORD and insert it into the template above (opsition 8)...',
|
||||||
' swap WORD replace',
|
' swap WORD replace',
|
||||||
'',
|
'',
|
||||||
' -- push to code / run',
|
' -- push to code / run',
|
||||||
' 3 0 _swapN ',
|
' 3 0 _swapN ',
|
||||||
' -- swap the arguments and the code to be executed...',
|
' -- swap the arguments and the code to be executed...',
|
||||||
' ] \\ exec 2 2 _swapN ]',
|
' ] \\exec 2 2 _swapN ]',
|
||||||
'',
|
'',
|
||||||
'-- Now making a word/2 an infix operator is trivial...',
|
'-- Now making a word/2 an infix operator is trivial...',
|
||||||
'-- NOTE: these are at this point stupid and do not support priorities...',
|
'-- NOTE: these are at this point stupid and do not support priorities...',
|
||||||
@ -930,20 +970,20 @@ var BOOTSTRAP = [
|
|||||||
'',
|
'',
|
||||||
'-- Prefix operation definition...',
|
'-- Prefix operation definition...',
|
||||||
'-- Example:',
|
'-- Example:',
|
||||||
'-- :: echo: ( | txt -- | ) [ \\ _flip \\ print _flip ]',
|
'-- :: echo: ( | txt -- | ) [ \\_flip \\print _flip ]',
|
||||||
'-- swap stack and code untill the block finishes and consumes it\'s arguments',
|
'-- swap stack and code untill the block finishes and consumes it\'s arguments',
|
||||||
'-- then swap them back...',
|
'-- then swap them back...',
|
||||||
':: prefix: ( | op word -- | ) [',
|
':: prefix: ( | op word -- | ) [',
|
||||||
' [',
|
' [',
|
||||||
' -- format the word definition...',
|
' -- format the word definition...',
|
||||||
' -- NAME WORD -> :: NAME WORD',
|
' -- NAME WORD -> :: NAME WORD',
|
||||||
' s2b \\ :: -2 before b2s',
|
' s2b \\:: -2 before b2s',
|
||||||
'',
|
'',
|
||||||
' -- the code template',
|
' -- the code template',
|
||||||
' [ \\ _flip \\ exec \\ WORD _flip ] clone',
|
' [ \\_flip \\exec \\WORD _flip ] clone',
|
||||||
' swap WORD replace',
|
' swap WORD replace',
|
||||||
' 3 0 _swapN',
|
' 3 0 _swapN',
|
||||||
' ] \\ exec 2 2 _swapN ]',
|
' ] \\exec 2 2 _swapN ]',
|
||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
@ -954,13 +994,13 @@ var BOOTSTRAP = [
|
|||||||
'',
|
'',
|
||||||
'-- Create a block containg a range of numbers from f to t, inclusive...',
|
'-- Create a block containg a range of numbers from f to t, inclusive...',
|
||||||
':: range/2 ( f t -- b )',
|
':: range/2 ( f t -- b )',
|
||||||
' [ dup2 swap sub swap . inc range swap [] swap push \\ + 0 before map ]',
|
' [ dup2 swap sub swap . inc range swap [] swap push \\+ 0 before map ]',
|
||||||
'',
|
'',
|
||||||
'-- this will enable us to create ranges via 0 .. 4',
|
'-- this will enable us to create ranges via 0 .. 4',
|
||||||
'infix: .. range/2',
|
'infix: .. range/2',
|
||||||
'',
|
'',
|
||||||
//':: 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...',
|
'-- Execute block in a context...',
|
||||||
'-- synctx: context: <block>',
|
'-- synctx: context: <block>',
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user