From 3a6635f5b36142412739ef5f76aa6bcab5ebc678 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Mon, 02 Feb 2009 18:26:02 +0000 Subject: rebase on TAPortfolio --- (limited to 'talogo.py') diff --git a/talogo.py b/talogo.py index efc6e86..d4b2709 100644 --- a/talogo.py +++ b/talogo.py @@ -20,6 +20,7 @@ import re from time import clock +import gobject from operator import isNumberType import random import audioop @@ -27,7 +28,9 @@ from math import sqrt from numpy.oldnumeric import * from numpy.fft import * from audiograb import AudioGrab +import subprocess from UserDict import UserDict +from sugar.datastore import datastore class noKeyError(UserDict): __missing__=lambda x,y: 0 @@ -36,6 +39,7 @@ class taLogo: pass from taturtle import * + procstop = False class symbol: @@ -53,7 +57,7 @@ class logoerror(Exception): def __str__(self): return repr(self.value) -def run_blocks(lc, spr, blocks): +def run_blocks(lc, spr, blocks, run_flag): # user-defined stacks for x in lc.stacks.keys(): lc.stacks[x]= None @@ -61,44 +65,42 @@ def run_blocks(lc, spr, blocks): lc.stacks['stack1'] = None lc.stacks['stack2'] = None for i in blocks: - if i.proto.name=='hat1': lc.stacks['stack1']= readline(lc,blocks_to_code(i)) - if i.proto.name=='hat2': lc.stacks['stack2']= readline(lc,blocks_to_code(i)) + if i.proto.name=='hat1': + lc.stacks['stack1']= readline(lc,blocks_to_code(lc,i)) + if i.proto.name=='hat2': + lc.stacks['stack2']= readline(lc,blocks_to_code(lc,i)) if i.proto.name=='hat': if (i.connections[1]!=None): text=i.connections[1].label - lc.stacks['stack3'+text]= readline(lc,blocks_to_code(i)) - code = blocks_to_code(spr) - print code - setup_cmd(lc, code) - -# walk through the blocks, but don't execute them -# used by save to USB Logo code -def walk_blocks(lc, spr, blocks): - for x in lc.stacks.keys(): - lc.stacks[x]= None - lc.stacks['stack1'] = None - lc.stacks['stack2'] = None - for i in blocks: - if i.proto.name=='hat1': lc.stacks['stack1']= readline(lc,blocks_to_code(i)) - if i.proto.name=='hat2': lc.stacks['stack2']= readline(lc,blocks_to_code(i)) - if i.proto.name=='hat': - if (i.connections[1]!=None): - text=i.connections[1].label - lc.stacks['stack3'+text]= readline(lc,blocks_to_code(i)) - return blocks_to_code(spr) - -def blocks_to_code(spr): + lc.stacks['stack3'+text]= readline(lc,blocks_to_code(lc,i)) + code = blocks_to_code(lc,spr) + if run_flag == True: + print code + setup_cmd(lc, code) + else: return code + +def blocks_to_code(lc,spr): if spr==None: return ['%nothing%'] code = [] dock = spr.proto.docks[0] if len(dock)>4: code.append(dock[4]) if spr.proto.primname != '': code.append(spr.proto.primname) -# else: code.append(float(spr.label)) else: if spr.proto.name=='number': - code.append(float(spr.label)) - elif spr.proto.name=='string': - code.append('#s'+spr.label) + try: + code.append(float(spr.label)) + except: + code.append(float(ord(spr.label[0]))) + elif spr.proto.name=='string' or spr.proto.name=='title': + if type(spr.label) == float or type(spr.label) == int: + code.append('#s'+str(spr.label)) + else: + code.append('#s'+spr.label) + elif spr.proto.name=='journal': + if spr.ds_id != None: + code.append('#smedia_'+str(spr.ds_id)) + else: + code.append('#smedia_None') else: return ['%nothing%'] for i in range(1,len(spr.connections)): @@ -106,8 +108,9 @@ def blocks_to_code(spr): dock = spr.proto.docks[i] if len(dock)>4: for c in dock[4]: code.append(c) - if b!=None: code.extend(blocks_to_code(b)) - elif spr.proto.docks[i][0] not in ['flow','numend','stringend','unavailable','logi-']: + if b!=None: code.extend(blocks_to_code(lc,b)) + elif spr.proto.docks[i][0] not in \ + ['flow', 'numend', 'stringend', 'unavailable', 'logi-']: code.append('%nothing%') return code @@ -127,7 +130,8 @@ def readline(lc, line): token = line.pop(0) if isNumberType(token): res.append(token) elif token.isdigit(): res.append(float(token)) - elif token[0]=='-' and token[1:].isdigit(): res.append(-float(token[1:])) + elif token[0]=='-' and token[1:].isdigit(): + res.append(-float(token[1:])) elif token[0] == '"': res.append(token[1:]) elif token[0:2] == "#s": res.append(token[2:]) elif token == '[': res.append(readline(lc,line)) @@ -136,7 +140,8 @@ def readline(lc, line): return res def setup_cmd(lc, str): - stopsignon(lc); lc.procstop=False + setlayer(lc.tw.turtle.spr,100) + lc.procstop=False list = readline(lc, str) lc.step = start_eval(lc, list) @@ -186,13 +191,17 @@ def evalsym(lc, token): icall(lc, eval); yield True lc.arglist.append(lc.iresult) if lc.cfun.rprim: - if type(lc.cfun.fcn)==lc.listtype: icall(lc, ufuncall, cfun.fcn); yield True - else: icall(lc, lc.cfun.fcn, *lc.arglist); yield True + if type(lc.cfun.fcn)==lc.listtype: + icall(lc, ufuncall, cfun.fcn); yield True + else: + icall(lc, lc.cfun.fcn, *lc.arglist); yield True result = None - else: result = lc.cfun.fcn(lc, *lc.arglist) + else: + result = lc.cfun.fcn(lc, *lc.arglist) lc.cfun, lc.arglist = oldcfun, oldarglist if lc.arglist!=None and result==None: - raise logoerror("%s didn't output to %s" % (oldcfun.name, lc.cfun.name)) + raise logoerror("%s didn't output to %s" % \ + (oldcfun.name, lc.cfun.name)) ireturn(lc, result); yield True def evalinfix(lc, firstarg): @@ -258,7 +267,8 @@ def prim_define(name, body): name.rprim = True def prim_stack(lc,stri): - if (not lc.stacks.has_key('stack3'+stri)) or lc.stacks['stack3'+stri]==None: raise logoerror("#nostack") + if (not lc.stacks.has_key('stack3'+stri)) or \ + lc.stacks['stack3'+stri]==None: raise logoerror("#nostack") icall(lc, evline, lc.stacks['stack3'+stri][:]); yield True lc.procstop = False ireturn(lc); yield True @@ -279,53 +289,120 @@ def prim_stopstack(lc): lc.procstop = True def careful_divide(x,y): - if y==0: return 0 - return x/y + try: + if y==0: return 0 + return x/y + except: + return 0 def ufuncall(body): ijmp(evline, body); yield True def an_int(lc, n): - try: return int(n) - except: raise logoerror("%s doesn't like %s as input" % (lc.cfun.name, str(n))) - -def a_float(n): - try: return int(n) - except: raise logoerror("%s doesn't like %s as input" % (cfun.name, str(n))) + if type(n) == int: + return n + elif type(n) == float: + return int(n) + elif type(n) == str: + return int(ord(n[0])) + else: + raise logoerror("%s doesn't like %s as input" \ + % (lc.cfun.name, str(n))) def defprim(lc, name, args, fcn, rprim=False): sym = intern(lc, name) sym.nargs, sym.fcn = args,fcn sym.rprim = rprim +def taequal(x,y): + try: + return float(x)==float(y) + except: + if type(x) == str: + xx = ord(x[0]) + else: + xx = x + if type(y) == str: + yy = ord(y[0]) + else: + yy = y + return xx==yy + +def taless(x,y): + try: + return(xfloat(y)) - defprim(lc,'less?', 2, lambda lc,x,y: float(x)