kopia lustrzana https://github.com/backface/turtlestitch
added JIT-compiled "blitz" version of FIND
rodzic
066fa407ae
commit
137b9b51df
|
@ -29,7 +29,7 @@
|
||||||
* new "get pen attribute" reporter
|
* new "get pen attribute" reporter
|
||||||
* new "write" command in pen category (used to be "label" in tools)
|
* new "write" command in pen category (used to be "label" in tools)
|
||||||
* new "numbers", "is empty", "map","keep", "find", "combine" and "for each" primitives in list category
|
* new "numbers", "is empty", "map","keep", "find", "combine" and "for each" primitives in list category
|
||||||
* new JIT-compiler "blitz-HOF" primitives for "map", "keep" & "combine" via "compile"
|
* new JIT-compiler "blitz-HOF" primitives for "map", "keep", "find" & "combine" via "compile"
|
||||||
* new "for" loop and "if then else" reporter primitives in the Control category
|
* new "for" loop and "if then else" reporter primitives in the Control category
|
||||||
* added "neg", "lg" (log2) and "2^" selectors to monadic function reporter in Operators
|
* added "neg", "lg" (log2) and "2^" selectors to monadic function reporter in Operators
|
||||||
* added "^" reporter (power of) in the Operators category
|
* added "^" reporter (power of) in the Operators category
|
||||||
|
@ -82,6 +82,7 @@
|
||||||
|
|
||||||
### 2019-05-29
|
### 2019-05-29
|
||||||
* Threads, Objects: added "Find First" primitive to lists category
|
* Threads, Objects: added "Find First" primitive to lists category
|
||||||
|
* Blocks, Thread, Objects: added "blitz" version of FIND
|
||||||
|
|
||||||
### 2019-05-28
|
### 2019-05-28
|
||||||
* Maps: added various different tile hosts
|
* Maps: added various different tile hosts
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<link rel="shortcut icon" href="src/favicon.ico">
|
<link rel="shortcut icon" href="src/favicon.ico">
|
||||||
<script type="text/javascript" src="src/morphic.js?version=2019-05-21"></script>
|
<script type="text/javascript" src="src/morphic.js?version=2019-05-21"></script>
|
||||||
<script type="text/javascript" src="src/widgets.js?version=2019-04-05"></script>
|
<script type="text/javascript" src="src/widgets.js?version=2019-04-05"></script>
|
||||||
<script type="text/javascript" src="src/blocks.js?version=2019-05-20"></script>
|
<script type="text/javascript" src="src/blocks.js?version=2019-05-29"></script>
|
||||||
<script type="text/javascript" src="src/threads.js?version=2019-05-29"></script>
|
<script type="text/javascript" src="src/threads.js?version=2019-05-29"></script>
|
||||||
<script type="text/javascript" src="src/objects.js?version=2019-05-29"></script>
|
<script type="text/javascript" src="src/objects.js?version=2019-05-29"></script>
|
||||||
<script type="text/javascript" src="src/gui.js?version=2019-05-09"></script>
|
<script type="text/javascript" src="src/gui.js?version=2019-05-09"></script>
|
||||||
|
|
|
@ -148,7 +148,7 @@ CustomCommandBlockMorph, SymbolMorph, ToggleButtonMorph, DialMorph*/
|
||||||
|
|
||||||
// Global stuff ////////////////////////////////////////////////////////
|
// Global stuff ////////////////////////////////////////////////////////
|
||||||
|
|
||||||
modules.blocks = '2019-May-20';
|
modules.blocks = '2019-May-29';
|
||||||
|
|
||||||
var SyntaxElementMorph;
|
var SyntaxElementMorph;
|
||||||
var BlockMorph;
|
var BlockMorph;
|
||||||
|
@ -2835,13 +2835,14 @@ BlockMorph.prototype.userMenu = function () {
|
||||||
// JIT-compile HOFs - experimental
|
// JIT-compile HOFs - experimental
|
||||||
if (
|
if (
|
||||||
contains(
|
contains(
|
||||||
['reportMap', 'reportKeep', 'reportCombine'],
|
['reportMap', 'reportKeep', 'reportFindFirst', 'reportCombine'],
|
||||||
this.selector
|
this.selector
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
alternatives = {
|
alternatives = {
|
||||||
reportMap : 'reportAtomicMap',
|
reportMap : 'reportAtomicMap',
|
||||||
reportKeep : 'reportAtomicKeep',
|
reportKeep : 'reportAtomicKeep',
|
||||||
|
reportFindFirst: 'reportAtomicFindFirst',
|
||||||
reportCombine : 'reportAtomicCombine'
|
reportCombine : 'reportAtomicCombine'
|
||||||
};
|
};
|
||||||
menu.addItem(
|
menu.addItem(
|
||||||
|
@ -2855,13 +2856,19 @@ BlockMorph.prototype.userMenu = function () {
|
||||||
);
|
);
|
||||||
} else if (
|
} else if (
|
||||||
contains(
|
contains(
|
||||||
['reportAtomicMap', 'reportAtomicKeep', 'reportAtomicCombine'],
|
[
|
||||||
|
'reportAtomicMap',
|
||||||
|
'reportAtomicKeep',
|
||||||
|
'reportAtomicFindFirst',
|
||||||
|
'reportAtomicCombine'
|
||||||
|
],
|
||||||
this.selector
|
this.selector
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
alternatives = {
|
alternatives = {
|
||||||
reportAtomicMap : 'reportMap',
|
reportAtomicMap : 'reportMap',
|
||||||
reportAtomicKeep : 'reportKeep',
|
reportAtomicKeep : 'reportKeep',
|
||||||
|
reportAtomicFindFirst: 'reportFindFirst',
|
||||||
reportAtomicCombine : 'reportCombine'
|
reportAtomicCombine : 'reportCombine'
|
||||||
};
|
};
|
||||||
menu.addItem(
|
menu.addItem(
|
||||||
|
|
|
@ -1317,6 +1317,12 @@ SpriteMorph.prototype.initBlocks = function () {
|
||||||
category: 'lists',
|
category: 'lists',
|
||||||
spec: 'find first item such that %predRing in %l'
|
spec: 'find first item such that %predRing in %l'
|
||||||
},
|
},
|
||||||
|
reportAtomicFindFirst: {
|
||||||
|
dev: true, // not shown in palette, only accessible via relabelling
|
||||||
|
type: 'reporter',
|
||||||
|
category: 'lists',
|
||||||
|
spec: '%blitz find first item such that %predRing in %l'
|
||||||
|
},
|
||||||
reportCombine: {
|
reportCombine: {
|
||||||
type: 'reporter',
|
type: 'reporter',
|
||||||
category: 'lists',
|
category: 'lists',
|
||||||
|
|
|
@ -5043,6 +5043,42 @@ Process.prototype.reportAtomicKeep = function (reporter, list) {
|
||||||
return new List(result);
|
return new List(result);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Process.prototype.reportAtomicFindFirst = function (reporter, list) {
|
||||||
|
this.assertType(list, 'list');
|
||||||
|
var src = list.asArray(),
|
||||||
|
len = src.length,
|
||||||
|
func,
|
||||||
|
i;
|
||||||
|
|
||||||
|
// try compiling the reporter into generic JavaScript
|
||||||
|
// fall back to the morphic reporter if unsuccessful
|
||||||
|
try {
|
||||||
|
func = this.reportCompiled(reporter, 1); // a single expected input
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err.message);
|
||||||
|
func = reporter;
|
||||||
|
}
|
||||||
|
|
||||||
|
// iterate over the data in a single frame:
|
||||||
|
// to do: Insert some kind of user escape mechanism
|
||||||
|
for (i = 0; i < len; i += 1) {
|
||||||
|
if (
|
||||||
|
invoke(
|
||||||
|
func,
|
||||||
|
new List([src[i]]),
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
this.capture(reporter) // process
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
Process.prototype.reportAtomicCombine = function (reporter, list) {
|
Process.prototype.reportAtomicCombine = function (reporter, list) {
|
||||||
this.assertType(list, 'list');
|
this.assertType(list, 'list');
|
||||||
var result = '',
|
var result = '',
|
||||||
|
|
Ładowanie…
Reference in New Issue