From 12e5e45e4c15a38b8425e94c44c47939518e30bb Mon Sep 17 00:00:00 2001 From: timv Date: Wed, 12 Dec 2012 23:29:04 -0500 Subject: [PATCH] FIX: aggregating on empty returns None, which now propagate correctly thru the program. --- bin/defn.py | 28 ++++++++++++++++++---------- bin/stdlib.py | 5 ++++- examples/papa.dyna | 3 +-- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/bin/defn.py b/bin/defn.py index 48bb3b8..b0903ee 100644 --- a/bin/defn.py +++ b/bin/defn.py @@ -63,26 +63,34 @@ def agg_bind(agg_decl, table): """ def max_equals(item): - return max(k for k, m in table[item].iteritems() if m > 0) + s = [k for k, m in table[item].iteritems() if m > 0] + if len(s): + return max() def min_equals(item): - return min(k for k, m in table[item].iteritems() if m > 0) + s = [k for k, m in table[item].iteritems() if m > 0] + if len(s): + return min(s) def plus_equals(item): - return reduce(operator.add, - [k*m for k, m in table[item].iteritems()]) + s = [k*m for k, m in table[item].iteritems()] + if len(s): + return reduce(operator.add, s) def times_equals(item): - return reduce(operator.mul, - [k**m for k, m in table[item].iteritems()]) + s = [k**m for k, m in table[item].iteritems()] + if len(s): + return reduce(operator.mul, s) def and_equals(item): - return reduce(operator.and_, - [k for k, m in table[item].iteritems() if m > 0]) + s = [k for k, m in table[item].iteritems() if m > 0] + if len(s): + return reduce(operator.and_, s) def or_equals(item): - return reduce(operator.or_, - [k for k, m in table[item].iteritems() if m > 0]) + s = [k for k, m in table[item].iteritems() if m > 0] + if len(s): + return reduce(operator.or_, s) # map names to functions agg_defs = { diff --git a/bin/stdlib.py b/bin/stdlib.py index 4c714b9..46cb95f 100644 --- a/bin/stdlib.py +++ b/bin/stdlib.py @@ -179,6 +179,8 @@ def update_dispatcher(item, val): """ Passes update to relevant handlers. """ + if val is None: + return (fn, _) = item print 'dispatch', pretty(item), '=', val for handler in register.handlers[fn]: @@ -267,7 +269,8 @@ def _go(): chart[fn].data[idx][-1] = now - update_dispatcher(item, now) + if now is not None: + update_dispatcher(item, now) def go(): diff --git a/examples/papa.dyna b/examples/papa.dyna index ef5dc38..b415424 100644 --- a/examples/papa.dyna +++ b/examples/papa.dyna @@ -30,5 +30,4 @@ phrase("caviar", 3, 4) += 1. phrase( "with", 4, 5) += 1. phrase( "a", 5, 6) += 1. phrase( "spoon", 6, 7) += 1. -phrase( ".", 7, 8) += 1 -. +phrase( ".", 7, 8) += 1. -- 2.50.1