############################################################################ # # File: polyseq.icn # # Subject: Procedure to generate Dietz sequence # # Author: Ralph E. Griswold # # Date: September 19, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The procedure poly2seq(str) generates the Dietz sequence for the # polynomial str. See Ada Dietz, "Algebraic Expressions in Handweaving". # ############################################################################ # # Links: polynom, strings # ############################################################################ link polynom link strings procedure poly2seq(str) local vars str := deletec(str, ' ') # delete blanks vars := &letters ** cset(str) suspend !map(poly2profile(eval(str)), vars, &digits[2+:*vars]) end procedure eval(str) while str ?:= 2(="(", tab(bal(')')), =")", pos(0)) return oper(str) | str2poly(str) end procedure oper(str) return str ? form(tab(bal('-+*^%')), move(1), tab(0)) end procedure form(str1, op, str2) return case op of { "+" : polyadd(eval(str1), eval(str2)) "-" : polysub(eval(str1), eval(str2)) "*" : polymul(eval(str1), eval(str2)) "^" : polyexp(eval(str1), str2) "%" : polymod(eval(str1), str2) } end