diff --git a/Slang/slang.html b/Slang/slang.html index 082b57a..07bb833 100755 --- a/Slang/slang.html +++ b/Slang/slang.html @@ -120,6 +120,7 @@ function runCommand(){ var c = commands[commands.length-1] c.innerText = command.innerText c.focus() + window.scrollTo(0,document.body.scrollHeight) }, false) try{ diff --git a/Slang/slang.js b/Slang/slang.js index 9414062..6a7e72d 100755 --- a/Slang/slang.js +++ b/Slang/slang.js @@ -399,7 +399,7 @@ var NAMESPACE = { var e = context.stack.pop() if(i < 0){ var l = context.stack[context.stack.length-1] - l.splice(l.length + i + 1, 0, e) + l.splice(l.length + i, 0, e) } else { context.stack[context.stack.length-1].splice(i, 0, e) } @@ -413,12 +413,13 @@ var NAMESPACE = { return context.stack[context.stack.length-1].length }, // b c -- b - 'each': function(context){ + 'map': function(context){ var c = context.stack.pop() var b = context.stack[context.stack.length-1] for(var i=0; i < b.length; i++){ // exec block in a separate context... var res = run({ + //stack: [i, b[i], c], stack: [b[i], c], code: ['exec'], // NOTE: this can have side-effects on the context... @@ -544,13 +545,69 @@ var BOOTSTRAP = [ ' not interpreted in any way.', '', '-------------------------------------------------------------------------------', +'', +'Basic words for block manipulation:', +'', +'Get block length', +' [ 1 2 3 ] len', +' Result:', +' 3', +'', +'Pop element form block tail', +' [ 1 2 3 ] pop', +' Result:', +' [ 1 2 ] 3', +'', +'Push element to block tail', +' [ 1 2 3 ] 4 push', +' Result:', +' [ 1 2 3 4 ]', +'', +'NOTE: all indexes can be negative values, these will indicate the', +' position relative to the tail, -1 being the last element.', +'', +'Get element at position (0)', +' [ 1 2 3 ] -1 at', +' Result:', +' [ 1 2 3 ] 3', +'', +'Put element (123) at position (0)', +' [ 1 2 3 ] 123 0 to', +' Result:', +' [ 123 2 3 ]', +'', +'Put element (123) before position (0)', +' [ 1 2 3 ] 123 0 before', +' Result:', +' [ 123 1 2 3 ]', +'', +'Expand block to stack -- "block 2 stack"', +' [ 1 2 3 ] b2s', +' Result:', +' 1 2 3', +'', +'', +'-------------------------------------------------------------------------------', 's2b drop', '--', '-- With that out of the way, let\'s start with the bootstrap...', -'--', -'-- make a new block instance shorthand...', -':: [] [ [ ] clone ]', '', +'-- misc...', +':: . ( x -- ) [ drop ]', +':: .. ( x -- ) [ print drop ]', +'', +':: ne ( a -- b ) [ eq not ]', +':: isT ( a -- b ) [ not not true eq ]', +':: isF ( a -- b ) [ not isT ]', +'', +':: inc ( a -- b ) [ 1 add ]', +':: dec ( a -- b ) [ 1 sub ]', +'', +':: ! ( a -- b ) [ [ dup 1 ne ] ? [ dup 1 sub ! mul ] ]', +'', +'', +'', +'-- Stack/code manipulation...', ':: _swap ( x | y -- y | x ) [ 1 1 _swapN ]', ':: _push ( x | -- | x ) [ 0 _swapN ]', ':: _pull ( | x -- x | ) [ 0 swap _swapN ]', @@ -560,15 +617,16 @@ var BOOTSTRAP = [ '-- like exec but will run a block in current context...', ':: b2c [ len rot b2s tor 0 _swapN ]', '', -':: . ( x -- ) [ drop ]', -':: .. ( x -- ) [ print drop ]', -'', ':: swap2 ( a _ b -- b _ a ) [ swap rot swap tor swap ]', ':: dup2 ( a b -- a b a b ) [ dup swap2 dup rot swap2 tor swap ]', '', -':: ne ( a -- b ) [ eq not ]', -':: isT ( a -- b ) [ not not true eq ]', -':: isF ( a -- b ) [ not isT ]', +'-- this is here for devel use only', +':: _clear ( ... -- ) [ s2b print drop ] ', +':: _stack_size ( -- l ) [ s2b len swap b2s tor ] ', +'', +'', +'', +'-- Flow control...', '', '-- Classic conditional word:', '-- [ cond ] [ A ] [ B ] if', @@ -601,12 +659,50 @@ var BOOTSTRAP = [ ' [ exec [ _run_then 1 ] and [ swap _run_else 2 ] or b2s 2 _swapN ]', '', '', -'-- list/block 2\'nd gen stuff...', -':: push ( b e i -- b ) [ -1 before ]', '', +'-- List/block 2\'nd gen stuff...', +'-- make a new block instance shorthand...', +':: [] [ [ ] clone ]', +'', +'-- insert element after index...', +':: after ( b e i -- b ) [', +' -- special case, when at end, need to push the alement after it...', +' dup [ -1 eq ] ?', +' [ . push ]', +' else', +' [ inc before ] ]', +'', +'-- push element to tail of block...', +':: push ( b e -- b ) [ swap len rot swap tor to ]', +'', +'-- Filter the block via a condition...', +'--', +'-- the condition block must have the folowing stack effect: elem -- bool', +':: filter ( b c -- b ) [', +' -- prepare the condition...', +' \\ dup 0 before', +' -- define the template...', +' [ TEST ? [ ] else [ . ] ] clone', +' -- prepare the template...', +' swap 0 to', +' -- do the filtering', +' map ]', +'', +'-- Create a block containing a range numbers form 0 to n-1...', +':: range ( n -- b ) [', +' -- initial state...', +' [ dup isNumber ] ? ', +' [ [] swap ]', +' -- get first elem...', +' else', +' [ 0 at ]', +' -- we got to the end...', +' [ dup 0 eq ] ? ', +' [ drop ]', +' -- dec push new and continue...', +' else', +' [ 1 sub 0 before range ] ]', '', -':: inc ( a -- b ) [ 1 add ]', -':: dec ( a -- b ) [ 1 sub ]', '', '', '-- Meta-word examples (experimental)...', @@ -646,29 +742,30 @@ var BOOTSTRAP = [ 'infix: > gt', '', '', -'-- this is here for devel use only', -':: _clear ( ... -- ) [ s2b print drop ] ', -':: _stack_size ( -- l ) [ s2b len swap b2s tor ] ', '', +'-- Tests and examples...', '', -'-- tests and examples...', +'-- Mandatory "hello word" word example...', ':: hi ( -- ) [ "Hello World!" print drop ]', -':: ! ( a -- b ) [ [ dup 1 ne ] ? [ dup 1 sub ! mul ] ]', -':: range ( n -- b ) [', -' -- initial state...', -' [ dup isNumber ] ? ', -' [ [] swap ]', -' -- get first elem...', -' else', -' [ 0 at ]', -' -- we got to the end...', -' [ dup 0 eq ] ? ', -' [ drop ]', -' -- dec push new and continue...', -' else', -' [ 1 sub 0 before range ] ]', +'', +'-- Create a block containg a range of n numbers form 0 and adding s to', +'-- each next number...', ':: range2 ( n s -- b )', -' [ swap range swap [] swap push \\ * 0 before each ]', +' [ swap range swap [] swap push \\ * 0 before map ]', +'', +'-- Sum up the elements of a block...', +':: sum ( L -- s ) [', +' -- empty list, sum is 0...', +' [ len 0 eq ] ?', +' [ . 0 ]', +' else', +' -- sum of list of len 1 is it\'s content, so just pop it...', +' [ [ len 1 eq ] ?', +' [ pop swap . ]', +' -- and now recursively sum up elements till the list is 1 in length...', +' else', +' [ pop rot pop tor add push sum ] ] ]', +'', ''].join('\n')