// script that recognizes images or performs some kind of analysis on an image concept G22Analyzer > G22LeftArrowScript { new Ref exampleImage; @Override GazelleV_LeftArrowScriptParser makeParser() { var parser = super.makeParser(); parser.addVar("image", BufferedImage.class, false); parser.addVar("context", G22AnalysisContext.class, false); ret parser; } class CompiledAnalyzer > LASCompileResult { settable double timeout = 10; O get(BufferedImage image) { G22AnalysisContext context = new(g22utils(_concepts()), image); ret get(context); } O get(G22AnalysisContext context) { if (context.analyzerResults.containsKey(analyzer())) { O value = context.analyzerResults.get(analyzer()); if (value == G22AnalysisContext.calculating) fail("Recursive call to analyzer " + this); ret ((OKOrError) value).getMandatory(); } context.analyzerResults.put(analyzer(), G22AnalysisContext.calculating); var result = okOrError(-> { if (parsedScript == null) rethrow(compileError); var image = context.image; if (image == null) fail("Need image"); ret evalWithTimeoutOrFail(timeout, -> { new VarContext ctx; ctx.set(+image); ctx.set(+context); ret parsedScript.get(ctx); }); }); context.analyzerResults.put(analyzer(), result); ret result.getMandatory(); } } selfType analyzer() { this; } LASCompileResult newCompileResult() { ret new CompiledAnalyzer; } CompiledAnalyzer compileForAutoRun() { ret (CompiledAnalyzer) super.compileForAutoRun(); } }