<snapdata remixID="11097487"><project name="partial evaluation" app="Snap! 7, https://snap.berkeley.edu" version="2"><notes>This is a bare-bones proof-of-concept partial evaluator (https://en.wikipedia.org/wiki/Partial_evaluation) for Snap!&#xD;In principle any Snap! program consisting only of reporters and predicates can be transformed by a program like this one. The example shows how the system can transform easily understood, but inefficient, combinations of high-level blocks to much more efficient versions. In this case it can determine if there are any elements in common between two lists without using additional memory (constructing lists) and it terminates as soon as an element in common is found.</notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAnpJREFUeF7t17Fpw1AARdFv7WJN4EVcawrPJZeeR3u4kiGQkCYJaXxBHLUSPHT/AaHTvu/7cCkQFTgBGJU3+1EAQBDSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBAH/If7lcxu12G8uypAd09HEAfznh6/X6dXfbtnG/38f5fD66ibe+H4B/5P6O8PPRaZrG8/kcj8fjrYd1xDEAAUxdA/iPT/C6rmOe5/TAjjYOoJ+Q1DSAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmN/4C1wn8qIbHiI0AAAAASUVORK5CYII=</thumbnail><scenes select="1"><scene name="partial evaluation"><notes>This is a bare-bones proof-of-concept partial evaluator (https://en.wikipedia.org/wiki/Partial_evaluation) for Snap!&#xD;In principle any Snap! program consisting only of reporters and predicates can be transformed by a program like this one. The example shows how the system can transform easily understood, but inefficient, combinations of high-level blocks to much more efficient versions. In this case it can determine if there are any elements in common between two lists without using additional memory (constructing lists) and it terminates as soon as an element in common is found.</notes><hidden></hidden><headers></headers><code></code><blocks><block-definition s="intersection of %&apos;a&apos; and %&apos;b&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportListIsEmpty"><block var="a"/></block><block s="reportNewList"><list></list></block><block s="reportIfElse"><block s="reportListContainsItem"><block var="b"/><block s="reportListItem"><l>1</l><block var="a"/></block></block><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="a"/></block><custom-block s="intersection of %l and %l"><block s="reportCDR"><block var="a"/></block><block var="b"/></custom-block></block><custom-block s="intersection of %l and %l"><block s="reportCDR"><block var="a"/></block><block var="b"/></custom-block></block></block></block></script></block-definition><block-definition s="is intersection of %&apos;list 1&apos; and %&apos;list 2&apos; empty?" type="predicate" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%l"></input></inputs></block-definition><block-definition s="partial evaluation of %&apos;script&apos; for %&apos;reporter being defined&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%repRing"></input></inputs><script><custom-block s="let %upvar be %s"><l>script split</l><block s="reportTextSplit"><block var="script"/><l><option>blocks</option></l></block></custom-block><block s="doReport"><block s="reportJoinWords"><list><block s="reportListItem"><l>1</l><custom-block s="partial evaluation of %l with replacements %l"><block var="script split"/><block s="reportCONS"><block s="reportNewList"><list><block s="reportNewList"><list><block s="reportListItem"><l>1</l><block var="script split"/></block><block s="reifyPredicate"><autolambda><block s="reportEquals"><block s="reportListItem"><l>1</l><l/></block><block s="reportListItem"><l>1</l><block s="reportListItem"><l>2</l><block var="script split"/></block></block></block></autolambda><list></list></block></list></block><block s="reportNewList"><list><block var="reporter being defined"/></list></block></list></block><block var="universal replacements"/></block></custom-block></block></list></block></block></script></block-definition><block-definition s="let %&apos;var&apos; be %&apos;value&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%s"></input></inputs><script><block s="doSetVar"><l>var</l><block var="value"/></block></script></block-definition><block-definition s="block is builtin %&apos;block&apos;" type="predicate" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="reportEquals"><block s="reportBlockAttribute"><l><option>definition</option></l><block var="block"/></block><block s="reportBlockAttribute"><l><option>definition</option></l><block s="reifyReporter"><autolambda><block s="reportListIsEmpty"><l/></block></autolambda><list></list></block></block></block></block></script><scripts><comment x="32.85714285714286" y="100.14285714285718" w="251.42857142857144" collapsed="false">Workaround for = of empty rings</comment></scripts></block-definition><block-definition s="block is custom %&apos;block&apos;" type="predicate" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="reportNot"><custom-block s="block is builtin %repRing"><block var="block"/></custom-block></block></block></script></block-definition><block-definition s="apply builtin %&apos;builtin&apos; to script %&apos;split script&apos; with replacements %&apos;table&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%l"></input><input type="%l"></input></inputs><script><block s="doIfElse"><block s="reportIsA"><block var="split script"/><l><option>list</option></l></block><script><custom-block s="let %upvar be %s"><l>replacement</l><custom-block s="find replacement of reporter %repRing of input %l with replacements %l"><block var="builtin"/><block var="split script"/><block var="table"/></custom-block></custom-block><block s="doIf"><block s="reportNotEquals"><block var="replacement"/><block s="reportBoolean"><l><bool>false</bool></l></block></block><script><block s="doReport"><block var="replacement"/></block></script></block><block s="doIfElse"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="split script"/></block><block s="reifyReporter"><autolambda><block s="reportIfElse"><l/><l></l><l></l></block></autolambda><list></list></block></block><script><block s="doReport"><custom-block s="apply builtin %repRing to if-then-else %l with replacements %l"><block var="builtin"/><block var="split script"/><block var="table"/></custom-block></block></script><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="apply builtin %repRing to script %l with replacements %l"><block var="builtin"/><l/><block var="table"/></custom-block></autolambda><list></list></block><block var="split script"/></block></block></script></block></script><script><block s="doReport"><block var="split script"/></block></script></block></script></block-definition><block-definition s="apply builtin %&apos;builtin&apos; to if-then-else %&apos;conditional script&apos; with replacements %&apos;table&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%l"></input><input type="%l"></input></inputs><script><custom-block s="let %upvar be %s"><l>true branch</l><block s="reportListItem"><l>3</l><block var="conditional script"/></block></custom-block><custom-block s="let %upvar be %s"><l>false branch</l><block s="reportListItem"><l>4</l><block var="conditional script"/></block></custom-block><block s="doReport"><block s="reportNewList"><list><block s="reportListItem"><l>1</l><block var="conditional script"/></block><block s="reportListItem"><l>2</l><block var="conditional script"/></block><custom-block s="apply builtin %repRing to script %l with replacements %l"><block var="builtin"/><block var="true branch"/><block var="table"/><comment w="260.7142857142857" collapsed="false">Note that a nice enhancement to this project is partial evaluate the true branch in an environment where the predicate is true and similarly for the false branch.</comment></custom-block><custom-block s="apply builtin %repRing to script %l with replacements %l"><block var="builtin"/><block var="false branch"/><block var="table"/></custom-block></list></block></block></script></block-definition><block-definition s="partial evaluation of %&apos;split script&apos; with replacements %&apos;table&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%l"></input></inputs><script><custom-block s="let %upvar be %s"><l>reporter</l><block s="reportListItem"><l>1</l><block var="split script"/></block></custom-block><custom-block s="let %upvar be %s"><l>first input</l><block s="reportListItem"><l>2</l><block var="split script"/></block></custom-block><custom-block s="let %upvar be %s"><l>replacement</l><l></l></custom-block><block s="doIfElse"><custom-block s="block is builtin %repRing"><block var="reporter"/></custom-block><script><block s="doIfElse"><custom-block s="block is custom %repRing"><block s="reportListItem"><l>1</l><block var="first input"/></block></custom-block><script><block s="doReport"><block s="reportCONS"><custom-block s="apply builtin %repRing to script %l with replacements %l"><block s="reportListItem"><l>1</l><block var="split script"/></block><block s="reportTextSplit"><block s="reportBlockAttribute"><l><option>definition</option></l><block s="reportListItem"><l>1</l><block s="reportListItem"><l>2</l><block var="split script"/></block></block></block><l><option>blocks</option></l></block><block var="table"/></custom-block><block s="reportCDR"><block s="reportCDR"><block var="split script"/></block></block></block></block></script><script></script></block></script><script></script></block><block s="doReport"><block var="split script"/></block></script><scripts><script x="267.5714285714285" y="254.8809523809523"><block s="reportJoinWords"><list><l>hello </l></list></block></script></scripts></block-definition><block-definition s="find replacement of reporter %&apos;reporter&apos; of input %&apos;input script split&apos; with replacements %&apos;table&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%l"></input><input type="%l"></input></inputs><script><custom-block s="let %upvar be %s"><l>matching entry</l><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportAnd"><block s="reportEquals"><block s="reportListItem"><l>1</l><block s="reportListItem"><l>1</l><block var="pair and replacement"/></block></block><block var="reporter"/></block><block s="evaluate"><block s="reportListItem"><l>2</l><block s="reportListItem"><l>1</l><block var="pair and replacement"/></block></block><list><block var="input script split"/></list></block></block></autolambda><list><l>pair and replacement</l></list></block><block var="table"/></block></custom-block><block s="doIfElse"><block s="reportEquals"><block var="matching entry"/><l></l></block><script><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script><script><custom-block s="let %upvar be %s"><l>replacement</l><block s="reportListItem"><l>2</l><block var="matching entry"/></block></custom-block><block s="doIfElse"><block s="reportIsA"><block var="replacement"/><l><option>list</option></l></block><script><block s="doReport"><block s="reportConcatenatedLists"><list><block var="replacement"/><block s="reportCDR"><block var="input script split"/></block></list></block></block></script><script><block s="doReport"><block var="replacement"/></block></script></block></script></block></script></block-definition></blocks><stage width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" id="388"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAADoVJREFUeF7t1cEJAAAIxDDdf2m3sJ+4wEEQuuMIECBAgACBd4F9XzRIgAABAgQIjAB7AgIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECByxcQFpoRMBzwAAAABJRU5ErkJggg==</pentrails><costumes><list struct="atomic" id="389"></list></costumes><sounds><list struct="atomic" id="390"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><sprite name="Sprite" idx="1" x="0" y="0" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="395"><costumes><list struct="atomic" id="396"></list></costumes><sounds><list struct="atomic" id="397"></list></sounds><blocks></blocks><variables></variables><scripts><script x="828.4136439732143" y="851.547619047617"><block var="universal replacements"/></script><script x="102.85714285714286" y="1013.6904761904754"><block s="evaluate"><block s="reportListItem"><l>2</l><block s="reportListItem"><l>1</l><block s="reportListItem"><l>1</l><block var="temp replacements"/></block></block></block><list><block s="reportListItem"><l>1</l><block s="reportTextSplit"><block s="reifyReporter"><autolambda><custom-block s="intersection of %l and %l"><l/><l/></custom-block></autolambda><list></list></block><l><option>blocks</option></l></block></block></list></block></script><script x="446.42857142857144" y="1094.404761904761"><block s="reportListItem"><l>2</l><block s="reportListItem"><l>1</l><block s="reportListItem"><l>1</l><block var="temp replacements"/></block></block></block></script><script x="33.85714285714284" y="1104.142857142856"><custom-block s="find replacement of reporter %repRing of input %l with replacements %l"><block s="reifyReporter"><autolambda><block s="reportListIsEmpty"><l/></block></autolambda><list></list></block><block s="reportTextSplit"><block s="reifyPredicate"><autolambda><custom-block s="intersection of %l and %l"><l/><l/></custom-block></autolambda><list></list></block><l><option>blocks</option></l></block><block var="temp replacements"/></custom-block></script><script x="73.85714285714285" y="1188.285714285713"><block var="universal replacements"/></script><script x="363.85714285714295" y="1180.595238095237"><block s="reportTextSplit"><block s="reifyPredicate"><autolambda><custom-block s="intersection of %l and %l"><l/><l/></custom-block></autolambda><list></list></block><l><option>blocks</option></l></block></script><script x="27.142857142857146" y="230.33333333333175"><block s="doSetVar"><l>universal replacements</l><block s="reportNewList"><list><block s="reportNewList"><list><block s="reportNewList"><list><block s="reifyPredicate"><autolambda><block s="reportListIsEmpty"><l/></block></autolambda><list></list></block><block s="reifyReporter"><autolambda><block s="reportEquals"><l></l><block s="reportTextSplit"><block s="reifyReporter"><autolambda><block s="reportNewList"><list></list></block></autolambda><list></list></block><l><option>blocks</option></l></block></block></autolambda><list></list></block></list><comment w="131.42857142857144" collapsed="true">is list() empty? is true</comment></block><block s="reifyPredicate"><autolambda><block s="reportBoolean"><l><bool>true</bool></l></block></autolambda><list></list></block></list></block><block s="reportNewList"><list><block s="reportNewList"><list><block s="reifyPredicate"><autolambda><block s="reportListIsEmpty"><l/></block></autolambda><list></list></block><block s="reifyReporter"><autolambda><block s="reportEquals"><block s="reportListItem"><l>1</l><l/></block><block s="reifyReporter"><autolambda><block s="reportCONS"><l></l><l/></block></autolambda><list></list></block></block></autolambda><list></list></block></list><comment w="187.14285714285717" collapsed="true">is ... in front of ... empty? is false</comment></block><block s="reifyPredicate"><autolambda><block s="reportBoolean"><l><bool>false</bool></l></block></autolambda><list></list></block></list></block></list></block></block></script><script x="27.142857142857146" y="149.11904761904762"><custom-block s="partial evaluation of %repRing for %repRing"><block s="reifyReporter"><autolambda><block s="reportListIsEmpty"><custom-block s="intersection of %l and %l"><l/><l/></custom-block></block></autolambda><list></list></block><block s="reifyReporter"><autolambda><custom-block s="is intersection of %l and %l empty?"><l/><l/></custom-block></autolambda><list></list></block><comment w="277.14285714285717" collapsed="false">Turns is intersection of ... and ... empty? into a simpler faster </comment></custom-block></script><comment x="28.571428571428573" y="25" w="517.1428571428572" collapsed="false">This is a bare-bones proof-of-concept partial evaluator (https://en.wikipedia.org/wiki/Partial_evaluation) for Snap!&#xD;In principle any Snap! program consisting only of reporters and predicates can be transformed by a program like this one. The example shows how the system can transform easily understood, but inefficient, combinations of high-level blocks to much more efficient versions. In this case it can determine if there are any elements in common between two lists without using additional memory (constructing lists) and it terminates as soon as an element in common is found.</comment><comment x="35.714285714285715" y="434.28571428571433" w="626.4285714285714" collapsed="false">This project can be extended to work with many other examples. An easy extensioni would be to compute the number of elements in common between two lists without constructing a temporary list.</comment></scripts></sprite><watcher var="universal replacements" style="normal" x="17" y="189.600002" color="243,118,29" hidden="true"/></sprites></stage><variables><variable name="universal replacements"><list id="588"><item><list id="589"><item><list id="590"><item><context id="591"><inputs></inputs><variables></variables><block s="reportListIsEmpty"><l/></block><receiver><ref id="395"></ref></receiver><origin><ref id="395"></ref></origin><context id="596"><inputs></inputs><variables></variables><receiver><ref id="395"></ref></receiver><origin><ref id="395"></ref></origin></context></context></item><item><context id="598"><inputs></inputs><variables></variables><block s="reportEquals"><l></l><block s="reportTextSplit"><block s="reifyReporter"><autolambda><block s="reportNewList"><list></list></block></autolambda><list></list></block><l><option>blocks</option></l></block></block><receiver><ref id="395"></ref></receiver><origin><ref id="395"></ref></origin></context></item></list></item><item><context id="615"><inputs></inputs><variables></variables><block s="reportBoolean"><l><bool>true</bool></l></block><receiver><ref id="395"></ref></receiver><origin><ref id="395"></ref></origin></context></item></list></item><item><list id="620"><item><list id="621"><item><context id="622"><inputs></inputs><variables></variables><block s="reportListIsEmpty"><l/></block><receiver><ref id="395"></ref></receiver><origin><ref id="395"></ref></origin></context></item><item><context id="627"><inputs></inputs><variables></variables><block s="reportEquals"><block s="reportListItem"><l>1</l><l/></block><block s="reifyReporter"><autolambda><block s="reportCONS"><l></l><l/></block></autolambda><list></list></block></block><receiver><ref id="395"></ref></receiver><origin><ref id="395"></ref></origin></context></item></list></item><item><context id="644"><inputs></inputs><variables></variables><block s="reportBoolean"><l><bool>false</bool></l></block><receiver><ref id="395"></ref></receiver><origin><ref id="395"></ref></origin></context></item></list></item></list></variable></variables></scene></scenes></project><media name="partial evaluation" app="Snap! 7, https://snap.berkeley.edu" version="2"></media></snapdata>