def geval(gomer,*,globalDict=None,localDict=None, verbose=False, cacheOutputFile=None): if globalDict is None: globalDict=mkGlobals() if localDict is None: localDict=globalDict pyleBody=[] pyleExpr=reduce(gomer,False,pyleBody.append) resVar=gensym('res') pyleBody=adder.pyle.trimScratches([S('begin')] +pyleBody +[[S(':='),resVar,pyleExpr]]) stmtTrees=[] if verbose: print(pyleBody) il=adder.pyle.build(pyleBody) stmtTree=il.toPythonTree() stmtTrees.append(stmtTree) stmtFlat=adder.pyle.flatten(tuple(stmtTrees)) if cacheOutputFile is not None: cacheOutputFile.writelines([stmtFlat]) if verbose: print(stmtFlat) exec(stmtFlat,globalDict,localDict) try: res=globalDict[resVar.toPython()] except KeyError as ke: res=localDict[resVar.toPython()] if verbose: pdb.set_trace() return res
def annotate_defmacro(self,expr,line,scope,globalDict,localDict): (name,nameLine)=expr[1] expanderName=gensym('macro-'+('dot-dot' if str(name)=='..' else str(name))) scope.addDef(name,None,line, macroExpander=expanderName, redefPermitted=True) return self(([(S('defun'),line),(expanderName,line)]+expr[2:], line), scope,globalDict,localDict)
def reduce(self,gomer,isStmt,stmtCollector,inClass): if isStmt: return None name=gensym('lambda') reduce([S('defun'),name]+gomer[1:],True,stmtCollector) return name