added JIT-compiled "blitz" version of FIND

pull/89/head
jmoenig 2019-05-29 11:53:21 +02:00
rodzic 066fa407ae
commit 137b9b51df
5 zmienionych plików z 55 dodań i 5 usunięć

Wyświetl plik

@ -29,7 +29,7 @@
* new "get pen attribute" reporter
* 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 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
* added "neg", "lg" (log2) and "2^" selectors to monadic function reporter in Operators
* added "^" reporter (power of) in the Operators category
@ -82,6 +82,7 @@
### 2019-05-29
* Threads, Objects: added "Find First" primitive to lists category
* Blocks, Thread, Objects: added "blitz" version of FIND
### 2019-05-28
* Maps: added various different tile hosts

Wyświetl plik

@ -6,7 +6,7 @@
<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/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/objects.js?version=2019-05-29"></script>
<script type="text/javascript" src="src/gui.js?version=2019-05-09"></script>

Wyświetl plik

@ -148,7 +148,7 @@ CustomCommandBlockMorph, SymbolMorph, ToggleButtonMorph, DialMorph*/
// Global stuff ////////////////////////////////////////////////////////
modules.blocks = '2019-May-20';
modules.blocks = '2019-May-29';
var SyntaxElementMorph;
var BlockMorph;
@ -2835,13 +2835,14 @@ BlockMorph.prototype.userMenu = function () {
// JIT-compile HOFs - experimental
if (
contains(
['reportMap', 'reportKeep', 'reportCombine'],
['reportMap', 'reportKeep', 'reportFindFirst', 'reportCombine'],
this.selector
)
) {
alternatives = {
reportMap : 'reportAtomicMap',
reportKeep : 'reportAtomicKeep',
reportFindFirst: 'reportAtomicFindFirst',
reportCombine : 'reportAtomicCombine'
};
menu.addItem(
@ -2855,13 +2856,19 @@ BlockMorph.prototype.userMenu = function () {
);
} else if (
contains(
['reportAtomicMap', 'reportAtomicKeep', 'reportAtomicCombine'],
[
'reportAtomicMap',
'reportAtomicKeep',
'reportAtomicFindFirst',
'reportAtomicCombine'
],
this.selector
)
) {
alternatives = {
reportAtomicMap : 'reportMap',
reportAtomicKeep : 'reportKeep',
reportAtomicFindFirst: 'reportFindFirst',
reportAtomicCombine : 'reportCombine'
};
menu.addItem(

Wyświetl plik

@ -1317,6 +1317,12 @@ SpriteMorph.prototype.initBlocks = function () {
category: 'lists',
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: {
type: 'reporter',
category: 'lists',

Wyświetl plik

@ -5043,6 +5043,42 @@ Process.prototype.reportAtomicKeep = function (reporter, list) {
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) {
this.assertType(list, 'list');
var result = '',